You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2017/03/17 02:17:12 UTC

[7/7] incubator-juneau git commit: Allow @RestResource/@RestMethod annotations to be used on any classes.

Allow @RestResource/@RestMethod annotations to be used on any classes.

Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/07843d64
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/07843d64
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/07843d64

Branch: refs/heads/master
Commit: 07843d641d9911843e3c489bd96b5999de7faa84
Parents: db0cf72
Author: JamesBognar <ja...@apache.org>
Authored: Thu Mar 16 22:16:57 2017 -0400
Committer: JamesBognar <ja...@apache.org>
Committed: Thu Mar 16 22:16:57 2017 -0400

----------------------------------------------------------------------
 .../java/org/apache/juneau/jena/package.html    |    2 +-
 .../org/apache/juneau/utils/ClassUtilsTest.java |   36 +
 .../org/apache/juneau/internal/ArrayUtils.java  |   21 +-
 .../org/apache/juneau/internal/ClassUtils.java  |   90 +
 .../apache/juneau/internal/CollectionUtils.java |    2 +-
 .../org/apache/juneau/internal/IOUtils.java     |   32 +
 .../org/apache/juneau/internal/ObjectUtils.java |   36 +
 .../java/org/apache/juneau/internal/Pair.java   |   64 +
 .../apache/juneau/internal/ReflectionUtils.java |   18 +-
 .../java/org/apache/juneau/json/package.html    |    2 +-
 .../java/org/apache/juneau/uon/package.html     |    2 +-
 .../org/apache/juneau/urlencoding/package.html  |    2 +-
 .../java/org/apache/juneau/xml/package.html     |    2 +-
 juneau-core/src/main/javadoc/overview.html      |  226 +-
 .../juneau/examples/rest/DirectoryResource.java |   11 +-
 .../examples/rest/DockerRegistryResource.java   |   11 +-
 .../examples/rest/SampleRemoteableServlet.java  |    2 +-
 .../juneau/examples/rest/SqlQueryResource.java  |   23 +-
 .../rest/addressbook/AddressBookResource.java   |    4 +-
 .../apache/juneau/microservice/Resource.java    |   19 +-
 .../juneau/microservice/ResourceGroup.java      |   19 +-
 .../org/apache/juneau/microservice/package.html |   12 +-
 .../microservice/resources/ConfigResource.java  |   14 +-
 .../resources/DirectoryResource.java            |    2 +-
 .../microservice/resources/LogsResource.java    |   25 +-
 .../juneau/rest/jaxrs/JuneauProvider.java       |    2 +-
 .../juneau/rest/test/AcceptCharsetResource.java |    2 +-
 .../apache/juneau/rest/test/ConfigResource.java |    4 +-
 .../juneau/rest/test/ContentResource.java       |    2 +-
 .../apache/juneau/rest/test/GroupsResource.java |   17 +-
 .../apache/juneau/rest/test/ParamsResource.java |   10 +-
 .../apache/juneau/rest/test/PathResource.java   |    6 +-
 .../java/org/apache/juneau/rest/test/Root.java  |    2 +-
 .../juneau/rest/test/ErrorConditionsTest.java   |    2 +-
 .../org/apache/juneau/rest/test/TestUtils.java  |   14 +-
 .../java/org/apache/juneau/rest/CallMethod.java |  996 ++++++
 .../java/org/apache/juneau/rest/CallRouter.java |   98 +
 .../juneau/rest/ClientVersionMatcher.java       |   10 +-
 .../java/org/apache/juneau/rest/Redirect.java   |    3 +-
 .../org/apache/juneau/rest/ResponseHandler.java |    4 +-
 .../org/apache/juneau/rest/RestCallHandler.java |  348 ++
 .../java/org/apache/juneau/rest/RestConfig.java | 1153 ++++++
 .../org/apache/juneau/rest/RestContext.java     | 1418 ++++++++
 .../org/apache/juneau/rest/RestException.java   |    4 +-
 .../apache/juneau/rest/RestInfoProvider.java    |  499 +++
 .../java/org/apache/juneau/rest/RestLogger.java |  233 ++
 .../juneau/rest/RestMatcherReflecting.java      |    6 +-
 .../org/apache/juneau/rest/RestRequest.java     |   84 +-
 .../juneau/rest/RestResourceResolver.java       |   80 +
 .../org/apache/juneau/rest/RestResponse.java    |   13 +-
 .../org/apache/juneau/rest/RestServlet.java     | 3321 +-----------------
 .../apache/juneau/rest/RestServletContext.java  |  306 --
 .../apache/juneau/rest/RestServletDefault.java  |    7 +-
 .../juneau/rest/RestServletGroupDefault.java    |    2 +-
 .../java/org/apache/juneau/rest/RestUtils.java  |    9 +
 .../apache/juneau/rest/annotation/FormData.java |    2 +-
 .../apache/juneau/rest/annotation/Query.java    |    2 +-
 .../juneau/rest/annotation/RestMethod.java      |    5 +
 .../juneau/rest/annotation/RestResource.java    |  152 +-
 .../rest/jena/RestServletJenaDefault.java       |    7 +-
 .../rest/jena/RestServletJenaGroupDefault.java  |    2 +-
 .../rest/labels/ChildResourceDescriptions.java  |   14 +-
 .../java/org/apache/juneau/rest/package.html    |  125 +-
 .../rest/remoteable/RemoteableServlet.java      |    4 +-
 .../juneau/rest/response/DefaultHandler.java    |    3 -
 .../rest/response/InputStreamHandler.java       |    3 -
 .../juneau/rest/response/ReaderHandler.java     |    3 -
 .../juneau/rest/response/RedirectHandler.java   |    3 -
 .../juneau/rest/response/StreamableHandler.java |    3 -
 .../juneau/rest/response/WritableHandler.java   |    3 -
 .../juneau/rest/vars/ServletInitParamVar.java   |    2 +-
 71 files changed, 5775 insertions(+), 3890 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-core-rdf/src/main/java/org/apache/juneau/jena/package.html
----------------------------------------------------------------------
diff --git a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/package.html b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/package.html
index c29250c..5f1d7aa 100644
--- a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/package.html
+++ b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/package.html
@@ -1083,7 +1083,7 @@
  				The <code>$L{...}</code> variable represent localized strings pulled from the resource bundle identified by the <code>messages</code> annotation.
  				These variables are replaced at runtime based on the HTTP request locale.
 				Several built-in runtime variable types are defined, and the API can be extended to include user-defined variables.
-				See {@link org.apache.juneau.rest.RestServlet#getVarResolver()} for more information.
+				See {@link org.apache.juneau.rest.RestContext#getVarResolver()} for more information.
 			</p>
 			<p>
 				This document won't go into all the details of the Juneau <code>RestServlet</code> class.<br>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-core-test/src/test/java/org/apache/juneau/utils/ClassUtilsTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/utils/ClassUtilsTest.java b/juneau-core-test/src/test/java/org/apache/juneau/utils/ClassUtilsTest.java
index ce2d30e..688c2bc 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/utils/ClassUtilsTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/utils/ClassUtilsTest.java
@@ -112,4 +112,40 @@ public class ClassUtilsTest {
 	public void getClassFromReadableName() throws Exception {
 		fail("Not implemented");
 	}
+	
+	//====================================================================================================
+	// findPublicMethod
+	//====================================================================================================
+	@Test
+	public void testFindPublicMethod() {
+		
+		assertNotNull(findPublicMethod(B.class, "m1", void.class));
+		assertNull(findPublicMethod(B.class, "m1", int.class));
+
+		assertNull(findPublicMethod(B.class, "m2", void.class));
+
+		assertNull(findPublicMethod(B.class, "m3", void.class));
+		assertNotNull(findPublicMethod(B.class, "m3", int.class));
+		
+		assertNotNull(findPublicMethod(B.class, "m4", CharSequence.class));
+		assertNotNull(findPublicMethod(B.class, "m4", Object.class));
+		assertNull(findPublicMethod(B.class, "m4", String.class));
+		
+		assertNotNull(findPublicMethod(B.class, "m5", void.class, int.class, CharSequence.class));
+		assertNotNull(findPublicMethod(B.class, "m5", void.class, int.class, String.class));
+		assertNull(findPublicMethod(B.class, "m5", void.class, int.class, Object.class));
+		
+		assertNull(findPublicMethod(B.class, "m5", void.class, int.class));
+		assertNull(findPublicMethod(B.class, "m5", void.class, int.class, CharSequence.class, CharSequence.class));
+	}
+	
+	public static class B {
+		
+		public void m1() {};
+		protected void m2() {};
+		public int m3() { return 0; }
+		public CharSequence m4() { return ""; }
+
+		public void m5(int f1, CharSequence f2) {}
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-core/src/main/java/org/apache/juneau/internal/ArrayUtils.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/internal/ArrayUtils.java b/juneau-core/src/main/java/org/apache/juneau/internal/ArrayUtils.java
index 12c7614..effd363 100644
--- a/juneau-core/src/main/java/org/apache/juneau/internal/ArrayUtils.java
+++ b/juneau-core/src/main/java/org/apache/juneau/internal/ArrayUtils.java
@@ -195,9 +195,9 @@ public final class ArrayUtils {
 	 * @param componentType The component type of the collection.
 	 * @return A new array.
 	 */
-	public static <T> Object toArray(Collection<T> c, Class<T> componentType) {
+	public static <T> Object toArray(Collection<?> c, Class<T> componentType) {
 		Object a = Array.newInstance(componentType, c.size());
-		Iterator<T> it = c.iterator();
+		Iterator<?> it = c.iterator();
 		int i = 0;
 		while (it.hasNext())
 			Array.set(a, i++, it.next());
@@ -205,6 +205,23 @@ public final class ArrayUtils {
 	}
 
 	/**
+	 * Shortcut for calling <code>myList.toArray(new T[myList.size()]);</code>
+	 *
+	 * @param c The collection being converted to an array.
+	 * @param componentType The component type of the array.
+	 * @return The collection converted to an array.
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T> T[] toObjectArray(Collection<?> c, Class<T> componentType) {
+		Object a = Array.newInstance(componentType, c.size());
+		Iterator<?> it = c.iterator();
+		int i = 0;
+		while (it.hasNext())
+			Array.set(a, i++, it.next());
+		return (T[])a;
+	}
+
+	/**
 	 * Copies the specified array into the specified list.
 	 * Works on both object and primitive arrays.
 	 *

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java b/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java
index 088d70a..4ba239f 100644
--- a/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java
+++ b/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java
@@ -426,6 +426,96 @@ public final class ClassUtils {
 		}
 	}
 
+	/**
+	 * Finds a public method with the specified parameters.
+	 *
+	 * @param c The class to look for the method.
+	 * @param name The method name.
+	 * @param returnType The return type of the method.
+	 * Can be a super type of the actual return type.
+	 * For example, if the actual return type is <code>CharSequence</code>, then <code>Object</code> will match but <code>String</code> will not.
+	 * @param parameterTypes The parameter types of the method.
+	 * Can be subtypes of the actual parameter types.
+	 * For example, if the parameter type is <code>CharSequence</code>, then <code>String</code> will match but <code>Object</code> will not.
+	 * @return The matched method, or <jk>null</jk> if no match was found.
+	 */
+	public static Method findPublicMethod(Class<?> c, String name, Class<?> returnType, Class<?>...parameterTypes) {
+		for (Method m : c.getMethods()) {
+			if (isPublic(m) && m.getName().equals(name)) {
+				Class<?> rt = m.getReturnType();
+				if (isParentClass(returnType, rt)) {
+					Class<?>[] pt = m.getParameterTypes();
+					if (pt.length == parameterTypes.length) {
+						boolean matches = true;
+						for (int i = 0; i < pt.length; i++) {
+							if (! isParentClass(pt[i], parameterTypes[i])) {
+								matches = false;
+								break;
+							}
+						}
+						if (matches)
+							return m;
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Finds a public constructor with the specified parameters without throwing an exception.
+	 *
+	 * @param c The class to search for a constructor.
+	 * @param parameterTypes The parameter types in the constructor.
+	 * Can be subtypes of the actual constructor argument types.
+	 * @return The matching constructor, or <jk>null</jk> if constructor could not be found.
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T> Constructor<T> findPublicConstructor(Class<T> c, Class<?>...parameterTypes) {
+		for (Constructor<?> n : c.getConstructors()) {
+			if (isPublic(n)) {
+				Class<?>[] pt = n.getParameterTypes();
+				if (pt.length == parameterTypes.length) {
+					boolean matches = true;
+					for (int i = 0; i < pt.length; i++) {
+						if (! isParentClass(pt[i], parameterTypes[i])) {
+							matches = false;
+							break;
+						}
+					}
+					if (matches)
+						return (Constructor<T>)n;
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Finds the public constructor that can take in the specified arguments.
+	 *
+	 * @param c The class we're trying to construct.
+	 * @param args The arguments we want to pass into the constructor.
+	 * @return The constructor, or <jk>null</jk> if a public constructor could not be found that takes
+	 * in the specified arguments.
+	 */
+	public static <T> Constructor<T> findPublicConstructor(Class<T> c, Object...args) {
+		return findPublicConstructor(c, getClasses(args));
+	}
+
+	/**
+	 * Returns the class types for the specified arguments.
+	 *
+	 * @param args The objects we're getting the classes of.
+	 * @return The classes of the arguments.
+	 */
+	public static Class<?>[] getClasses(Object...args) {
+		Class<?>[] pt = new Class<?>[args.length];
+		for (int i = 0; i < args.length; i++)
+			pt[i] = args[i] == null ? null : args[i].getClass();
+		return pt;
+	}
+
 // This code is inherently unsafe (but still potentially useful?)
 //
 //	/**

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-core/src/main/java/org/apache/juneau/internal/CollectionUtils.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/internal/CollectionUtils.java b/juneau-core/src/main/java/org/apache/juneau/internal/CollectionUtils.java
index 7c11d22..c413427 100644
--- a/juneau-core/src/main/java/org/apache/juneau/internal/CollectionUtils.java
+++ b/juneau-core/src/main/java/org/apache/juneau/internal/CollectionUtils.java
@@ -25,7 +25,7 @@ public class CollectionUtils {
 	 * @param in The map to reverse the order on.
 	 * @return A new {@link LinkedHashMap} with keys in reverse order.
 	 */
-	public static <K,V> LinkedHashMap<K,V> reverse(LinkedHashMap<K,V> in) {
+	public static <K,V> LinkedHashMap<K,V> reverse(Map<K,V> in) {
 		if (in == null)
 			return null;
 		LinkedHashMap<K,V> m = new LinkedHashMap<K,V>();

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-core/src/main/java/org/apache/juneau/internal/IOUtils.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/internal/IOUtils.java b/juneau-core/src/main/java/org/apache/juneau/internal/IOUtils.java
index 72ece2c..77caa63 100644
--- a/juneau-core/src/main/java/org/apache/juneau/internal/IOUtils.java
+++ b/juneau-core/src/main/java/org/apache/juneau/internal/IOUtils.java
@@ -361,4 +361,36 @@ public final class IOUtils {
 				closeQuietly((Writer)o2);
 		}
 	}
+
+	/**
+	 * Converts an object to an <code>InputStream</code>.
+	 *
+	 * @param o The object to convert to an input stream.
+	 * Can be any of the following:
+	 * <ul>
+	 * 	<li>{@link InputStream}
+	 * 	<li>{@link Reader}
+	 * 	<li>{@link File}
+	 * 	<li>{@link CharSequence} - Converted to UTF-8 stream.
+	 * 	<li><code><jk>byte</jk>[]</code>
+	 * 	<li><code><jk>null</jk></code> - Returns null.
+	 * </ul>
+	 * @return The object converted to an input stream.
+	 * @throws IOException If invalid object passed in or file could not be read.
+	 */
+	public static InputStream toInputStream(Object o) throws IOException {
+		if (o == null)
+			return null;
+		if (o instanceof InputStream)
+			return (InputStream)o;
+		if (o instanceof File)
+			return new FileInputStream((File)o);
+		if (o instanceof byte[])
+			return new ByteArrayInputStream((byte[])o);
+		if (o instanceof CharSequence)
+			return new ByteArrayInputStream(((CharSequence)o).toString().getBytes(UTF8));
+		if (o instanceof Reader)
+			return new ByteArrayInputStream(IOUtils.read((Reader)o).getBytes(UTF8));
+		throw new IOException("Invalid object type passed to IOUtils.toInputStream(Object): " + o.getClass().getName());
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-core/src/main/java/org/apache/juneau/internal/ObjectUtils.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/internal/ObjectUtils.java b/juneau-core/src/main/java/org/apache/juneau/internal/ObjectUtils.java
new file mode 100644
index 0000000..fac4337
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/internal/ObjectUtils.java
@@ -0,0 +1,36 @@
+// ***************************************************************************************************************************
+// * 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.internal;
+
+/**
+ * Object-related utility methods.
+ */
+public class ObjectUtils {
+
+	/**
+	 * Returns <jk>true</jk> if the specified objects are equal.
+	 * <p>
+	 * Gracefully handles <jk>null</jk>s.
+	 *
+	 * @param o1 Object #1
+	 * @param o2 Object #2
+	 * @return <jk>true</jk> if the objects are equal or both <jk>null</jk>.
+	 */
+	public static boolean equals(Object o1, Object o2) {
+		if (o1 == null && o2 == null)
+			return true;
+		if (o1 == null || o2 == null)
+			return false;
+		return o1.equals(o2);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-core/src/main/java/org/apache/juneau/internal/Pair.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/internal/Pair.java b/juneau-core/src/main/java/org/apache/juneau/internal/Pair.java
new file mode 100644
index 0000000..93cda29
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/internal/Pair.java
@@ -0,0 +1,64 @@
+// ***************************************************************************************************************************
+// * 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.internal;
+
+/**
+ * Represents a simple object pair.
+ * @param <F> The first object type.
+ * @param <S> The second object type.
+ */
+public class Pair<F,S> {
+	private final F first;
+	private final S second;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param first The first object in the pair.
+	 * @param second The second object in the pair.
+	 */
+	public Pair(F first, S second) {
+		this.first = first;
+		this.second = second;
+	}
+
+	/**
+	 * Returns the first object in the pair.
+	 * @return The first object in the pair.
+	 */
+	public F first() {
+		return first;
+	}
+
+	/**
+	 * Returns the second object in the pair.
+	 * @return The second object in the pair.
+	 */
+	public S second() {
+		return second;
+	}
+
+	@Override /* Object */
+	public boolean equals(Object o) {
+		if (o instanceof Pair) {
+			Pair<?,?> p = (Pair<?,?>)o;
+			return ObjectUtils.equals(first, p.first) && ObjectUtils.equals(second, p.second);
+		}
+		return false;
+	}
+
+	@Override /* Object */
+	public int hashCode() {
+		return (first == null ? 0 : first.hashCode()) ^ (second == null ? 0 : second.hashCode());
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-core/src/main/java/org/apache/juneau/internal/ReflectionUtils.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/internal/ReflectionUtils.java b/juneau-core/src/main/java/org/apache/juneau/internal/ReflectionUtils.java
index 0a0c602..acb2043 100644
--- a/juneau-core/src/main/java/org/apache/juneau/internal/ReflectionUtils.java
+++ b/juneau-core/src/main/java/org/apache/juneau/internal/ReflectionUtils.java
@@ -102,7 +102,7 @@ public final class ReflectionUtils {
 	}
 
 	/**
-	 * Sames as {@link #findAnnotations(Class, Class)} except returns the annotations as a map
+	 * Same as {@link #findAnnotations(Class, Class)} except returns the annotations as a map
 	 * with the keys being the class on which the annotation was found.
 	 * <p>
 	 * Results are ordered child-to-parent.
@@ -110,7 +110,7 @@ public final class ReflectionUtils {
 	 * @param <T> The annotation class type.
 	 * @param a The annotation class type.
 	 * @param c The class being searched.
-	 * @return The found matches, or an empty array if annotation was not found.
+	 * @return The found matches, or an empty map if annotation was not found.
 	 */
 	public static <T extends Annotation> LinkedHashMap<Class<?>,T> findAnnotationsMap(Class<T> a, Class<?> c) {
 		LinkedHashMap<Class<?>,T> m = new LinkedHashMap<Class<?>,T>();
@@ -118,6 +118,18 @@ public final class ReflectionUtils {
 		return m;
 	}
 
+	/**
+	 * Same as {@link #findAnnotationsMap(Class, Class)} except returns results in parent-to-child order.
+	 *
+	 * @param <T> The annotation class type.
+	 * @param a The annotation class type.
+	 * @param c The class being searched.
+	 * @return The found matches, or an empty map if annotation was not found.
+	 */
+	public static <T extends Annotation> LinkedHashMap<Class<?>,T> findAnnotationsMapParentFirst(Class<T> a, Class<?> c) {
+		return CollectionUtils.reverse(findAnnotationsMap(a, c));
+	}
+
 	private static <T extends Annotation> void findAnnotationsMap(Class<T> a, Class<?> c, Map<Class<?>,T> m) {
 		if (c == null)
 			return;
@@ -163,6 +175,8 @@ public final class ReflectionUtils {
 	 * @return An input stream on the specified resource, or <jk>null</jk> if the resource could not be found.
 	 */
 	public static InputStream getResource(Class<?> c, String name) {
+		if (name == null)
+			return null;
 		while (c != null) {
 			InputStream is = c.getResourceAsStream(name);
 			if (is != null)

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-core/src/main/java/org/apache/juneau/json/package.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/json/package.html b/juneau-core/src/main/java/org/apache/juneau/json/package.html
index 06e6db6..f302ec9 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/package.html
+++ b/juneau-core/src/main/java/org/apache/juneau/json/package.html
@@ -1022,7 +1022,7 @@
  				The <code>$L{...}</code> variable represent localized strings pulled from the resource bundle identified by the <code>messages</code> annotation.
  				These variables are replaced at runtime based on the HTTP request locale.
 				Several built-in runtime variable types are defined, and the API can be extended to include user-defined variables.
-				See {@link org.apache.juneau.rest.RestServlet#getVarResolver()} for more information.
+				See {@link org.apache.juneau.rest.RestContext#getVarResolver()} for more information.
 			</p>
 			<p>
 				This document won't go into all the details of the Juneau <code>RestServlet</code> class.<br>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-core/src/main/java/org/apache/juneau/uon/package.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/uon/package.html b/juneau-core/src/main/java/org/apache/juneau/uon/package.html
index e6b1d10..6c2c6ca 100644
--- a/juneau-core/src/main/java/org/apache/juneau/uon/package.html
+++ b/juneau-core/src/main/java/org/apache/juneau/uon/package.html
@@ -1005,7 +1005,7 @@
  				The <code>$L{...}</code> variable represent localized strings pulled from the resource bundle identified by the <code>messages</code> annotation.
  				These variables are replaced at runtime based on the HTTP request locale.
 				Several built-in runtime variable types are defined, and the API can be extended to include user-defined variables.
-				See {@link org.apache.juneau.rest.RestServlet#getVarResolver()} for more information.
+				See {@link org.apache.juneau.rest.RestContext#getVarResolver()} for more information.
 			</p>
 			<p>
 				This document won't go into all the details of the Juneau <code>RestServlet</code> class.<br>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-core/src/main/java/org/apache/juneau/urlencoding/package.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/package.html b/juneau-core/src/main/java/org/apache/juneau/urlencoding/package.html
index 4d623d1..ddb09b2 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/package.html
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/package.html
@@ -1005,7 +1005,7 @@
  				The <code>$L{...}</code> variable represent localized strings pulled from the resource bundle identified by the <code>messages</code> annotation.
  				These variables are replaced at runtime based on the HTTP request locale.
 				Several built-in runtime variable types are defined, and the API can be extended to include user-defined variables.
-				See {@link org.apache.juneau.rest.RestServlet#getVarResolver()} for more information.
+				See {@link org.apache.juneau.rest.RestContext#getVarResolver()} for more information.
 			</p>
 			<p>
 				This document won't go into all the details of the Juneau <code>RestServlet</code> class.<br>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-core/src/main/java/org/apache/juneau/xml/package.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/package.html b/juneau-core/src/main/java/org/apache/juneau/xml/package.html
index 4d9d595..4c0fbeb 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/package.html
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/package.html
@@ -2941,7 +2941,7 @@
  				The <code>$L{...}</code> variable represent localized strings pulled from the resource bundle identified by the <code>messages</code> annotation.
  				These variables are replaced at runtime based on the HTTP request locale.
 				Several built-in runtime variable types are defined, and the API can be extended to include user-defined variables.
-				See {@link org.apache.juneau.rest.RestServlet#getVarResolver()} for more information.
+				See {@link org.apache.juneau.rest.RestContext#getVarResolver()} for more information.
 			</p>
 			<p>
 				This document won't go into all the details of the Juneau <code>RestServlet</code> class.<br>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-core/src/main/javadoc/overview.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/javadoc/overview.html b/juneau-core/src/main/javadoc/overview.html
index bab4158..9a959d0 100644
--- a/juneau-core/src/main/javadoc/overview.html
+++ b/juneau-core/src/main/javadoc/overview.html
@@ -633,7 +633,7 @@
 					<li class='c'><a class='doclink' href='org/apache/juneau/xml/XmlParserContext.html#ConfigProperties'>XmlParserContext</a> - Configurable properties on the XML parser.
 				</ul>
 			</ul>
-			<li class='c'><a class='doclink' href='org/apache/juneau/server/RestServletContext.html#ConfigProperties'>RestServletContext</a> - Configurable properties on the REST servlet.
+			<li class='c'><a class='doclink' href='org/apache/juneau/server/RestContext.html#ConfigProperties'>RestContext</a> - Configurable properties on the REST servlet.
 		</ul>
 	</div>
 		
@@ -2625,7 +2625,7 @@
 		</p>
 		<p>
 			The <l>title</l> and <l>description</l> keys identify the localized values
-			return by the {@link org.apache.juneau.rest.RestServlet#getTitle(RestRequest)} and {@link org.apache.juneau.rest.RestServlet#getDescription(RestRequest)} methods.
+			return by the {@link org.apache.juneau.rest.RestRequest#getServletTitle()} and {@link org.apache.juneau.rest.RestRequest#getServletDescription()} methods.
 		</p>
 		<p>
 			The <l>children</l> annotation defines the child resources of this router resource.
@@ -2646,7 +2646,7 @@
 			It should be noted that child resources do not need to be defined this way.  
 			They could also be defined as servlets in the same way as the root resource.  
 			The <l>children</l> annotation approach simply makes it easier to define them without having to touch the <l>web.xml</l> file again.
-			Child resources can also be defined programmatically by overriding the {@link org.apache.juneau.rest.RestServlet#createChildren()} method.
+			Child resources can also be defined programmatically by using the {@link org.apache.juneau.rest.RestConfig#addChildResources(Class[])} method.
 		</p>
 		<p>
 			Note that these router pages can be arbitrarily nested deep.  
@@ -3131,8 +3131,8 @@
 		
 		<h6 class='topic'>Additional Information</h6>
 		<ul class='javahierarchy'>
-			<li class='m'>{@link org.apache.juneau.rest.RestServlet#createVarResolver()} - Servlet and request variables.
-			<li class='m'>{@link org.apache.juneau.rest.RestServlet#getSessionObjects(RestRequest)} - Var resolver session objects.
+			<li class='m'>{@link org.apache.juneau.rest.RestConfig#addVars(Class[])} - Servlet and request variables.
+			<li class='m'>{@link org.apache.juneau.rest.RestCallHandler#getSessionObjects(RestRequest)} - Var resolver session objects.
 		</ul>
 	</div>	
 	
@@ -3208,31 +3208,27 @@
 				{@link org.apache.juneau.rest.annotation.RestResource#pojoSwaps() @RestResopurce.pojoSwaps()} annotations are used 
 				to set behavior properties on the resource's underlying bean context, serializers, and parsers.  
 			You're using them here to modify the behavior of serialization for all content types.  
-			The annotations are functionally equivalent to overriding the {@link org.apache.juneau.rest.RestServlet#createSerializers(ObjectMap,Class[],Class[])} method, as follows:
+			The annotations are functionally equivalent to using the {@link org.apache.juneau.rest.RestConfig} class, as follows:
 		</p>
 		<h6 class='figure'>Hypothetical RequestEchoResource.createSerializers() method</h6>
 		<p class='bcode'>
 	<jd>/** Override the default rest serializers to add some transforms */</jd>
 	<ja>@Override</ja>
-	<jk>protected</jk> SerializerGroupBuilder createSerializers(ObjectMap properties, Class[] beanFilters, Class[] pojoSwaps) {
-
-		<jc>// You'll just reuse the parent serializer group</jc>
-		SerializerGroupBuilder b = <jk>super</jk>.createSerializers(properties, beanFilters, pojoSwaps);
-		
+	<jk>public synchronize void</jk> init(RestConfig config) throws Exception {
 		<jc>// Add bean filters for the HttpServletRequest, HttpSession, and ServletContext objects
 		//		so that you don't show vendor-specific properties on subclasses.
 		// Add Enumeration POJO swap to be able to render the contents of Enumeration properties.
 		// The max depth and detect recursion options prevent any possible runaway serializations.  
 		// This shouldn't happen, but future JEE APIs may introduce deep hierarchies or loops.</jc>
-		b
-			.beanFilters(HttpServletRequest.<jk>class</jk>, HttpSession.<jk>class</jk>, ServletContext.<jk>class</jk>)
-			.pojoSwaps(EnumerationSwap.<jk>class</jk>)
-			.maxDepth(10)
-			.detectRecursions(<jk>true</jk>);
+		config
+			.addBeanFilters(HttpServletRequest.<jk>class</jk>, HttpSession.<jk>class</jk>, ServletContext.<jk>class</jk>)
+			.addPojoSwaps(EnumerationSwap.<jk>class</jk>)
+			.setProperty(<jsf>SERIALIZER_maxDepth</jsf>, 10)
+			.setProperty(<jsf>SERIALIZER_detectRecursions</jsf>, <jk>true</jk>)
 			.property(<jsf>HTMLDOC_links</jsf>, <js>"{...}"</js>);
 		
-		<jc>// Return the updated group</jc>
-		<jk>return</jk> b;
+		<jc>// Don't forget to call this!</jc>
+		<jk>super</jk>.init(config);
 	}
 		</p>
 		<p>
@@ -4248,7 +4244,7 @@
 	http://localhost:10000/addressBook/people/3/name?method=PUT&amp;content="'Barack Hussein Obama'"	
 			</p>
 			<p>
-				The ability to overload methods is enabled through the {@link org.apache.juneau.rest.RestServletContext#REST_allowMethodParam} property.
+				The ability to overload methods is enabled through the {@link org.apache.juneau.rest.RestContext#REST_allowMethodParam} property.
 			</p>
 		</div>
 	</div>	
@@ -4590,7 +4586,7 @@
 		<ul class='spaced-list'>
 			<li>Accessing a docker registry REST API as POJOs using {@link org.apache.juneau.rest.client.RestClient}.
 			<li>Using the {@link org.apache.juneau.rest.labels.ResourceDescription} class to implement a top-level 'router' page.
-			<li>Using the {@link org.apache.juneau.rest.RestServlet#getConfig()} method to access external configuration file values.
+			<li>Using the {@link org.apache.juneau.rest.RestContext#getConfigFile()} method to access external configuration file values.
 		</ul>
 		<p>
 			Pointing a browser to the resource shows the following:
@@ -4663,7 +4659,7 @@
 		<h6 class='topic'>Additional Information</h6>
 		<ul class='javahierarchy'>
 			<li class='c'>{@link org.apache.juneau.rest.labels.ResourceDescription}
-			<li class='m'>{@link org.apache.juneau.rest.RestServlet#getConfig()}
+			<li class='m'>{@link org.apache.juneau.rest.RestContext#getConfigFile()}
 		</ul>
 	</div>	
 	
@@ -4975,7 +4971,7 @@
 		</p>
 		<ul class='spaced-list'>
 			<li>Using the {@link org.apache.juneau.dto.ResultSetList} to serialize database result sets.
-			<li>Using {@link org.apache.juneau.rest.RestServlet#getConfig()} to access config properties.
+			<li>Using {@link org.apache.juneau.rest.RestContext#getConfigFile()} to access config properties.
 			<li>Using form entry beans.
 		</ul>
 		<p>
@@ -5449,8 +5445,8 @@
 		<h3 class='topic' onclick='toggle(this)'>9.2.2 - Apply transforms to a subset of serializers or parsers</h3>
 		<div class='topic'>
 			<p>
-				The {@link org.apache.juneau.rest.RestServlet#createSerializers(ObjectMap,Class[],Class[])} and {@link org.apache.juneau.rest.RestServlet#createParsers(ObjectMap,Class[],Class[])}
-				methods are the servlet methods that get called during servlet initialization to create the serializer and
+				The {@link org.apache.juneau.rest.RestConfig#addSerializers(Class[])} and {@link org.apache.juneau.rest.RestConfig#addParsers(Class[])}
+				methods are the methods that get called during servlet initialization to create the serializer and
 				parser groups.
 				These methods can be overridden to customize individual serializers and parsers in a way that can't be done using annotations.
 			</p>
@@ -5460,10 +5456,9 @@
 			</p>
 			<p class='bcode'>
 	<ja>@Override</ja>
-	<jk>protected</jk> SerializerGroup createSerializers(ObjectMap properties, Class[] beanFilters, Class[] pojoSwaps) <jk>throws</jk> Exception {
-		SerializerGroup g = <jk>super</jk>.createSerializers(properties, beanFilters, pojoSwaps);
-		g.getSerializer(<js>"text/html"</js>).pojoSwaps(DoubleSwap.<jk>class</jk>); 
-		<jk>return</jk> g;
+	<jk>public synchronized void</jk> init(RestServletConfig config) <jk>throws</jk> Exception {
+		config.addSerializer(<jk>new</jk> HtmlSerializerBuilder().pojoSwaps(DoubleSwap.<jk>class</jk>).build());
+		super.init(config);
 	}
 			</p>
 		</div>
@@ -5593,7 +5588,7 @@
 	
 	<h5 class='toc'>What's new in each release</h5>
 	<ul class='toc'>
-		<li><p><a class='doclink' href='#6.1.1'>6.1.1 (TBD)</a></p>
+		<li><p><a class='doclink' href='#6.2.0'>6.2.0 (TBD)</a></p>
 		<li><p><a class='doclink' href='#6.1.0'>6.1.0 (Feb 25, 2017)</a></p>
 		<li><p><a class='doclink' href='#6.0.1'>6.0.1 (Jan 3, 2017)</a></p>
 		<li><p><a class='doclink' href='#6.0.0'>6.0.0 (Oct 3, 2016)</a></p>
@@ -5661,11 +5656,11 @@
 
 
 	<!-- ======================================================================================================== -->
-	<a id="6.1.1"></a>
-	<h3 class='topic' onclick='toggle(this)'>6.1.1 (TBD)</h3>
+	<a id="6.2.0"></a>
+	<h3 class='topic' onclick='toggle(this)'>6.2.0 (TBD)</h3>
 	<div class='topic'>
 		<p>
-			Juneau 6.1.1 is ...
+			Juneau 6.2.0 is a major update.
 		</p>
 
 		<h6 class='topic'>org.apache.juneau</h6>
@@ -5732,6 +5727,48 @@
 		
 		<h6 class='topic'>org.apache.juneau.rest</h6>
 		<ul class='spaced-list'>
+			<li>{@link org.apache.juneau.rest.annotation.RestResource @RestResource} annotation can now be applied to 
+				any class!  You're no longer restricted to subclassing your resources from {@link org.apache.juneau.rest.RestServlet}.
+				<br>This is a major enhancement in the API.  Anything you could do by subclassing from <code>RestServlet</code>
+				should have an equivalent for non-<code>RestServlet</code> classes.
+				<br>The only restriction is that the top-level resource must subclass from <code>RestServlet</code>.
+				Child resources do not.
+				<br><br>
+				The majority of code has been split up into two separate classes:
+				<ul>
+					<li>{@link org.apache.juneau.rest.RestConfig} - A modifiable configuration of a resource.  Subclasses from {@link javax.servlet.ServletConfig}.
+					<li>{@link org.apache.juneau.rest.RestContext} - A read-only configuration that's the result of a snapshot of the config.
+				</ul>
+				<br><br>
+				The {@link org.apache.juneau.rest.RestServlet} class now has the following initialization method that allows you to override
+				the config settings define via annotations:
+				<ul>
+					<li>{@link org.apache.juneau.rest.RestServlet#init(RestConfig)} - A modifiable configuration of a resource.
+				</ul>
+				Non-<code>RestServlet</code> classes must have one of the following to allow it to be instantiated:
+				<ul>
+					<li>A <code><jk>public</jk> T(RestConfig)</code> constructor.
+					<li>A <code><jk>public</jk> T()</code> constructor.
+					<li>The parent resource must have a customized {@link org.apache.juneau.rest.RestResourceResolver} for instantiating it.
+				</ul>
+				<br>
+				Non-<code>RestServlet</code> classes can optionally include the following init methods to gain access to the config and context:
+				<ul>
+					<li><code><jk>public</jk> init(RestConfig)</code>
+					<li><code><jk>public</jk> init(RestContext)</code>
+				</ul>
+			<li>New annotations added to {@link org.apache.juneau.rest.annotation.RestResource @RestResource} to allow non-<code>RestServlet</code>
+				resources to do the same as subclassing directly from <code>RestServlet</code>:
+			<ul>
+				<li>{@link org.apache.juneau.rest.annotation.RestResource#resourceResolver() resourceResolver()} 
+					- Specify a {@link org.apache.juneau.rest.RestResourceResolver} class for resolving child resources.
+				<li>{@link org.apache.juneau.rest.annotation.RestResource#callHandler() callHandler()} 
+					- Specify a {@link org.apache.juneau.rest.RestCallHandler} class for handling the lifecycle of a REST call.
+				<li>{@link org.apache.juneau.rest.annotation.RestResource#infoProvider() infoProvider()} 
+					- Specify a {@link org.apache.juneau.rest.RestInfoProvider} class for customizing title/description/Swagger information on a REST resource.
+				<li>{@link org.apache.juneau.rest.annotation.RestResource#logger() logger()} 
+					- Specify a {@link org.apache.juneau.rest.RestLogger} class for handling logging.
+			</ul>
 			<li>{@link org.apache.juneau.rest.annotation.RestResource#stylesheet()} can now take in a comma-delimited list of stylesheet paths.
 			<li>{@link org.apache.juneau.rest.StreamResource} can now contain multiple sources from a variety of source types (e.g. <code><jk>byte</jk>[]</code> arrays, <code>InputStreams</code>, <code>Files</code>, etc...)
 				and is now immutable.  It also includes a new {@link org.apache.juneau.rest.StreamResource.Builder} class.
@@ -6126,16 +6163,16 @@
 					<li>Eliminated <code>ResourceOptions</code> and related code.
 					<li>New annotations and related methods:
 						<ul>
-							<li>{@link org.apache.juneau.rest.annotation.RestResource#title() @RestResource.title()} / {@link org.apache.juneau.rest.RestServlet#getTitle(RestRequest)}
-							<li>{@link org.apache.juneau.rest.annotation.RestResource#description() @RestResource.description()} / {@link org.apache.juneau.rest.RestServlet#getDescription(RestRequest)}
-							<li>{@link org.apache.juneau.rest.annotation.RestResource#termsOfService() @RestResource.termsOfService()} / {@link org.apache.juneau.rest.RestServlet#getTermsOfService(RestRequest)}
-							<li>{@link org.apache.juneau.rest.annotation.RestResource#contact() @RestResource.contact()} / {@link org.apache.juneau.rest.RestServlet#getContact(RestRequest)}
-							<li>{@link org.apache.juneau.rest.annotation.RestResource#license() @RestResource.license()} / {@link org.apache.juneau.rest.RestServlet#getLicense(RestRequest)}
-							<li>{@link org.apache.juneau.rest.annotation.RestResource#version() @RestResource.version()} / {@link org.apache.juneau.rest.RestServlet#getVersion(RestRequest)}
-							<li>{@link org.apache.juneau.rest.annotation.RestResource#tags() @RestResource.tags()} / {@link org.apache.juneau.rest.RestServlet#getTags(RestRequest)}
-							<li>{@link org.apache.juneau.rest.annotation.RestResource#externalDocs() @RestResource.externalDocs()} / {@link org.apache.juneau.rest.RestServlet#getExternalDocs(RestRequest)}
-							<li>{@link org.apache.juneau.rest.annotation.RestMethod#summary() @RestMethod.summary()} / {@link org.apache.juneau.rest.RestServlet#getMethodSummary(String,RestRequest)}
-							<li>{@link org.apache.juneau.rest.annotation.RestMethod#description() @RestMethod.description()} / {@link org.apache.juneau.rest.RestServlet#getMethodDescription(String,RestRequest)}
+							<li>{@link org.apache.juneau.rest.annotation.RestResource#title() @RestResource.title()} / {@link org.apache.juneau.rest.RestInfoProvider#getTitle(RestRequest)}
+							<li>{@link org.apache.juneau.rest.annotation.RestResource#description() @RestResource.description()} / {@link org.apache.juneau.rest.RestInfoProvider#getDescription(RestRequest)}
+							<li>{@link org.apache.juneau.rest.annotation.RestResource#termsOfService() @RestResource.termsOfService()} / {@link org.apache.juneau.rest.RestInfoProvider#getTermsOfService(RestRequest)}
+							<li>{@link org.apache.juneau.rest.annotation.RestResource#contact() @RestResource.contact()} / {@link org.apache.juneau.rest.RestInfoProvider#getContact(RestRequest)}
+							<li>{@link org.apache.juneau.rest.annotation.RestResource#license() @RestResource.license()} / {@link org.apache.juneau.rest.RestInfoProvider#getLicense(RestRequest)}
+							<li>{@link org.apache.juneau.rest.annotation.RestResource#version() @RestResource.version()} / {@link org.apache.juneau.rest.RestInfoProvider#getVersion(RestRequest)}
+							<li>{@link org.apache.juneau.rest.annotation.RestResource#tags() @RestResource.tags()} / {@link org.apache.juneau.rest.RestInfoProvider#getTags(RestRequest)}
+							<li>{@link org.apache.juneau.rest.annotation.RestResource#externalDocs() @RestResource.externalDocs()} / {@link org.apache.juneau.rest.RestInfoProvider#getExternalDocs(RestRequest)}
+							<li>{@link org.apache.juneau.rest.annotation.RestMethod#summary() @RestMethod.summary()} / {@link org.apache.juneau.rest.RestInfoProvider#getMethodSummary(String,RestRequest)}
+							<li>{@link org.apache.juneau.rest.annotation.RestMethod#description() @RestMethod.description()} / {@link org.apache.juneau.rest.RestInfoProvider#getMethodDescription(String,RestRequest)}
 							<li>{@link org.apache.juneau.rest.annotation.RestMethod#externalDocs() @RestMethod.externalDocs()} 
 							<li>{@link org.apache.juneau.rest.annotation.RestMethod#tags() @RestMethod.tags()} 
 							<li>{@link org.apache.juneau.rest.annotation.RestMethod#deprecated() @RestMethod.deprecated()} 
@@ -6144,23 +6181,23 @@
 						</ul>
 					</li>					
 				</ul>
-			<li>New {@link org.apache.juneau.rest.RestServletContext#paramFormat} context property.
+			<li>New <code><del>RestServletContext.paramFormat</del></code> context property.
 			<li>New/updated methods on {@link org.apache.juneau.rest.RestServlet}:
 				<ul>
-					<li>{@link org.apache.juneau.rest.RestServlet#createProperties()}
-					<li>{@link org.apache.juneau.rest.RestServlet#createBeanContext(ObjectMap,Class[],Class[])}
-					<li>{@link org.apache.juneau.rest.RestServlet#createBeanFilters()}
-					<li>{@link org.apache.juneau.rest.RestServlet#createPojoSwaps()}
-					<li>{@link org.apache.juneau.rest.RestServlet#createParsers(ObjectMap,Class[],Class[])}
-					<li>{@link org.apache.juneau.rest.RestServlet#createUrlEncodingSerializer(ObjectMap,Class[],Class[])}
-					<li>{@link org.apache.juneau.rest.RestServlet#createUrlEncodingParser(ObjectMap,Class[],Class[])}
-					<li>{@link org.apache.juneau.rest.RestServlet#createConverters(ObjectMap)}
-					<li>{@link org.apache.juneau.rest.RestServlet#createDefaultRequestHeaders(ObjectMap)}
-					<li>{@link org.apache.juneau.rest.RestServlet#createDefaultResponseHeaders(ObjectMap)}
-					<li>{@link org.apache.juneau.rest.RestServlet#createEncoders(ObjectMap)}
-					<li>{@link org.apache.juneau.rest.RestServlet#createGuards(ObjectMap)}
-					<li>{@link org.apache.juneau.rest.RestServlet#createMimetypesFileTypeMap(ObjectMap)}
-					<li>{@link org.apache.juneau.rest.RestServlet#createResponseHandlers(ObjectMap)}
+					<li><code><del>RestServlet.createProperties()</del></code>
+					<li><code><del>RestServlet.createBeanContext(ObjectMap,Class[],Class[])</del></code>
+					<li><code><del>RestServlet.createBeanFilters()</del></code>
+					<li><code><del>RestServlet.createPojoSwaps()</del></code>
+					<li><code><del>RestServlet.createParsers(ObjectMap,Class[],Class[])</del></code>
+					<li><code><del>RestServlet.createUrlEncodingSerializer(ObjectMap,Class[],Class[])</del></code>
+					<li><code><del>RestServlet.createUrlEncodingParser(ObjectMap,Class[],Class[])</del></code>
+					<li><code><del>RestServlet.createConverters(ObjectMap)</del></code>
+					<li><code><del>RestServlet.createDefaultRequestHeaders(ObjectMap)</del></code>
+					<li><code><del>RestServlet.createDefaultResponseHeaders(ObjectMap)</del></code>
+					<li><code><del>RestServlet.createEncoders(ObjectMap)</del></code>
+					<li><code><del>RestServlet.createGuards(ObjectMap)</del></code>
+					<li><code><del>RestServlet.createMimetypesFileTypeMap(ObjectMap)</del></code>
+					<li><code><del>RestServlet.createResponseHandlers(ObjectMap)</del></code>
 				</ul>
 			</li>
 			<li>New client-version annotations:
@@ -6223,10 +6260,9 @@
 
 		<h6 class='topic'>Server</h6>
 		<ul class='spaced-list'>
-			<li>New methods on {@link org.apache.juneau.rest.RestServlet}:
+			<li>New methods on {@link org.apache.juneau.rest.RestContext}:
 				<ul>
-					<li>{@link org.apache.juneau.rest.RestServlet#getMessages()}
-					<li>{@link org.apache.juneau.rest.RestServlet#getMessages(Locale)}
+					<li>{@link org.apache.juneau.rest.RestContext#getMessages()}
 				</ul>
 		</ul>
 
@@ -6569,15 +6605,15 @@
 				</ul>
 			<li>New methods in {@link org.apache.juneau.rest.RestServlet}:
 				<ul>
-					<li>{@link org.apache.juneau.rest.RestServlet#getChildClasses()} - Programmatic equivalent to {@link org.apache.juneau.rest.annotation.RestResource#children()} annotation.
-					<li>{@link org.apache.juneau.rest.RestServlet#shouldLog(HttpServletRequest,HttpServletResponse,RestException)} 
-					<li>{@link org.apache.juneau.rest.RestServlet#shouldLogStackTrace(HttpServletRequest,HttpServletResponse,RestException)} 
-					<li>{@link org.apache.juneau.rest.RestServlet#logObjects(Level,String,Object[])} 
-					<li>{@link org.apache.juneau.rest.RestServlet#resolveStaticFile(String)} 
-					<li>{@link org.apache.juneau.rest.RestServlet#createStyleSheet()} 
-					<li>{@link org.apache.juneau.rest.RestServlet#createFavIcon()} 
-					<li>{@link org.apache.juneau.rest.RestServlet#createStaticFilesMap()} 
-					<li>{@link org.apache.juneau.rest.RestServlet#getConfigMgr()} 
+					<li><code><del>RestServlet.getChildClasses()</del></code>  - Programmatic equivalent to {@link org.apache.juneau.rest.annotation.RestResource#children()} annotation.
+					<li><code><del>RestServlet.shouldLog(HttpServletRequest,HttpServletResponse,RestException)</del></code> 
+					<li><code><del>RestServlet.shouldLogStackTrace(HttpServletRequest,HttpServletResponse,RestException)</del></code> 
+					<li><code><del>RestServlet.logObjects(Level,String,Object[])</del></code> 
+					<li><code><del>RestServlet.resolveStaticFile(String)</del></code> 
+					<li><code><del>RestServlet.createStyleSheet()</del></code> 
+					<li><code><del>RestServlet.createFavIcon()</del></code> 
+					<li><code><del>RestServlet.createStaticFilesMap()</del></code> 
+					<li><code><del>RestServlet.getConfigMgr()</del></code>
 				</ul>
 			<li>Removed {@link org.apache.juneau.jso.JsoParser}
 				from {@link org.apache.juneau.rest.RestServletDefault} and {@link org.apache.juneau.rest.jena.RestServletJenaDefault}.  
@@ -6709,7 +6745,7 @@
 			<li>Changes to {@link org.apache.juneau.rest.RestServlet}:
 				<ul>
 					<li>New methods for accessing external INI config files:<br>  
-						{@link org.apache.juneau.rest.RestServlet#getConfig()}<br>
+						<code><del>RestServlet.getConfig()</del></code><br>
 						<code><del>RestServlet.createConfigFile()</del></code>
 					<li>New <js>"$C{...}"</js> variable that resolve to INI config file values.
 					<li>New <js>"$UE{...}"</js> variable that  URL-encodes the value inside the variable.
@@ -6718,16 +6754,16 @@
 						<del><code>RestServlet.getResourceAsString(String)</code></del><br>
 						<del><code>RestServlet.getResource(Class,String,String)</code></del>.
 							Useful if you want to load predefined POJOs from JSON files in your classpath.
-					<li>New {@link org.apache.juneau.rest.RestServlet#handleNotFound(int,RestRequest,RestResponse)} method for customized handling
+					<li>New <code><del>RestServlet.handleNotFound(int,RestRequest,RestResponse)</del></code> method for customized handling
 						of when a resource or method was not found.  
 				</ul>
 			<li>{@link org.apache.juneau.rest.RestServletDefault}  now automatically processes <js>"/favicon.ico"</js> requests by 
-				overriding the new {@link org.apache.juneau.rest.RestServlet#handleNotFound(int,RestRequest,RestResponse)} method.
+				overriding the new <code><del>RestServlet.handleNotFound(int,RestRequest,RestResponse)</del></code> method.
 			<li>New {@link org.apache.juneau.rest.RestRequest} methods: 
 				<ul>
 					<li>{@link org.apache.juneau.rest.RestRequest#resolveVars(String)}
 					<li><code>RestRequest.getVarResource(String)</code>
-					<li>{@link org.apache.juneau.rest.RestRequest#getConfig()}
+					<li><code><del>RestRequest.getConfig()</del></code>
 				</ul>
 			<li>New {@link org.apache.juneau.rest.RestResponse} methods: 
 				<ul>
@@ -6816,11 +6852,11 @@
 				These replace the various <code>description</code> annotations added 2 days ago with a simpler design.
 			<li>New methods on {@link org.apache.juneau.rest.RestServlet}:
 				<ul>
-					<li>{@link org.apache.juneau.rest.RestServlet#getMethodDescription(String,RestRequest)} so that subclasses
+					<li><code><del>RestServlet.getMethodDescription(String,RestRequest)</del></code> so that subclasses
 						can override the method description in the OPTIONS page.
 					<li><del><code>RestServlet.createRequestVarResolver(RestRequest)</code></del> so that subclasses
 						can override and augment the variable resolver.
-					<li>{@link org.apache.juneau.rest.RestServlet#resolveChild(Class)} and {@link org.apache.juneau.rest.RestServlet#replaceChild(RestServlet)}
+					<li><code><del>RestServlet.resolveChild(Class)</del></code> and <code><del>RestServlet.replaceChild(RestServlet)</del></code>
 						classes that allows customized resolution of servlet instances (e.g. if services are defined in OSGi).
 				</ul> 
 			<li>Reverted the <del><code>MethodDescription</code></del> back to 5.1.0.16 since it was being used by someone.
@@ -6904,7 +6940,7 @@
 					<li><code>$R{trimmedRequestURI}</code> - Returns value from {@link org.apache.juneau.rest.RestRequest#getTrimmedRequestURI()}
 					<li><code>$E{var}</code> - Environment variables.
 				</ul>
-			<li>Added methods {@link org.apache.juneau.rest.RestServlet#getDescription(RestRequest)} and <del><code>RestServlet.getLabel(RestRequest)</code></del>.
+			<li>Added methods <code><del>RestServlet.getDescription(RestRequest)</del></code> and <del><code>RestServlet.getLabel(RestRequest)</code></del>.
 			<li>{@link org.apache.juneau.rest.RestServletDefault} and {@link org.apache.juneau.rest.jena.RestServletJenaDefault} now provide default HTML titles
 				and descriptions:
 				<p class='bcode'>
@@ -7456,7 +7492,7 @@
 		</p>
 		
 		<ul class='spaced-list'>
-			<li>New {@link org.apache.juneau.rest.RestServlet#getPath()} method.
+			<li>New <code><del>RestServlet.getPath()</del></code> method.
 			<li>New <code>SerializerContext.getJavaMethod()</code> and <code>ParserContext.getJavaMethod()</code>
 					to allow access to REST methods that invoked the serializers or parsers.
 				For example, can be used to access additional annotations on REST methods to perform special handing
@@ -7691,20 +7727,20 @@
 			<li>
 				New methods on {@link org.apache.juneau.rest.RestServlet} that allow easier customization by subclasses:
 				<ul>
-					<li><code>RestServlet.createConfigFactory()</code></li>
-					<li><code>RestServlet.createConverters()</code></li>
-					<li><code>RestServlet.createDefaultRequestHeaders()</code></li>
-					<li><code>RestServlet.createDefaultResponseHeaders()</code></li>
-					<li><code>RestServlet.createEncoders()</code></li>
-					<li><code>RestServlet.createFilters()</code></li>
-					<li><code>RestServlet.createGuards()</code></li>
-					<li><code>RestServlet.createMimetypesFileTypeMap()</code></li>
-					<li><code>RestServlet.createParsers()</code></li>
-					<li>{@link org.apache.juneau.rest.RestServlet#createProperties()}</li>
-					<li>{@link org.apache.juneau.rest.RestServlet#createRequestProperties(ObjectMap,RestRequest)}</li>
-					<li><code>RestServlet.createRequestVarResolver(RestRequest)</code></li>
-					<li><code>RestServlet.createSerializers()</code></li>
-					<li><code>RestServlet.createUrlEncodingParser()</code></li>
+					<li><code><del>RestServlet.createConfigFactory()</del></code></li>
+					<li><code><del>RestServlet.createConverters()</del></code></li>
+					<li><code><del>RestServlet.createDefaultRequestHeaders()</del></code></li>
+					<li><code><del>RestServlet.createDefaultResponseHeaders()</del></code></li>
+					<li><code><del>RestServlet.createEncoders()</del></code></li>
+					<li><code><del>RestServlet.createFilters()</del></code></li>
+					<li><code><del>RestServlet.createGuards()</del></code></li>
+					<li><code><del>RestServlet.createMimetypesFileTypeMap()</del></code></li>
+					<li><code><del>RestServlet.createParsers()</del></code></li>
+					<li><code><del>RestServlet.createProperties()</del></code></li>
+					<li><code><del>RestServlet.createRequestProperties(ObjectMap,RestRequest)</del></code></li>
+					<li><code><del>RestServlet.createRequestVarResolver(RestRequest)</del></code></li>
+					<li><code><del>RestServlet.createSerializers()</del></code></li>
+					<li><code><del>RestServlet.createUrlEncodingParser()</del></code></li>
 				</ul>
 			</li>
 			<li>
@@ -8537,7 +8573,7 @@
 				Support for <code>Accept</code> and <code>Content-Type</code> <js>"application/x-www-form-urlencoded"</js> added by default on {@link org.apache.juneau.rest.RestServletDefault}.
 			</li>
 			<li>
-				New {@link org.apache.juneau.rest.RestServlet#renderError(HttpServletRequest,HttpServletResponse,RestException)} method to allow customized handling of response errors.
+				New <code><del>RestServlet.renderError(HttpServletRequest,HttpServletResponse,RestException)</del></code> method to allow customized handling of response errors.
 			</li>
 		</ul>
 	</div>
@@ -8557,7 +8593,7 @@
 		<h6 class='topic'>REST server API changes</h6>
 		<ul class='spaced-list'>
 			<li>New <code>RestServletProperties</code> class that defines all the class-level properties that can be set on the servlet.</li>
-			<li>Properties can be set through {@link org.apache.juneau.rest.annotation.RestResource#properties() @RestResource.properties} annotation, or new {@link org.apache.juneau.rest.RestServlet#setProperty(String,Object)} method.</li>
+			<li>Properties can be set through {@link org.apache.juneau.rest.annotation.RestResource#properties() @RestResource.properties} annotation, or new <code><del>RestServlet.setProperty(String,Object)</del></code> method.</li>
 			<li>New <js>"?noTrace"</js> URL parameter to prevent stack traces from being logged (for JUnit testing of error conditions).</li>
 			<li>New <code>RestServletProperties.REST_useStackTraceHashes</code> property to prevent the same stack trace from being logged multiple times.</li>
 			<li>New <code>RestServletProperties.REST_renderResponseStackTraces</code> property for preventing stack traces in responses for security reasons.</li>
@@ -9041,6 +9077,4 @@
 	</div>
 
 </div>
-</body>
-		
-		
+</body>								

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DirectoryResource.java
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DirectoryResource.java b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DirectoryResource.java
index 6a8512c..f0b6a3d 100644
--- a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DirectoryResource.java
+++ b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DirectoryResource.java
@@ -15,15 +15,13 @@ package org.apache.juneau.examples.rest;
 import static java.util.logging.Level.*;
 import static javax.servlet.http.HttpServletResponse.*;
 import static org.apache.juneau.html.HtmlDocSerializerContext.*;
-import static org.apache.juneau.rest.RestServletContext.*;
+import static org.apache.juneau.rest.RestContext.*;
 
 import java.io.*;
 import java.net.*;
 import java.util.*;
 import java.util.logging.*;
 
-import javax.servlet.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.microservice.*;
 import org.apache.juneau.rest.*;
@@ -58,9 +56,10 @@ public class DirectoryResource extends Resource {
 
 	private static Logger logger = Logger.getLogger(DirectoryResource.class.getName());
 
-	@Override /* Servlet */
-	public void init() throws ServletException {
-		ObjectMap p = getProperties();
+	@Override /* RestServlet */
+	public synchronized void init(RestConfig config) throws Exception {
+		super.init(config);
+		ObjectMap p = config.getProperties();
 		rootDir = new File(p.getString("rootDir"));
 		allowViews = p.getBoolean("allowViews", false);
 		allowDeletes = p.getBoolean("allowDeletes", false);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DockerRegistryResource.java
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DockerRegistryResource.java b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DockerRegistryResource.java
index eab51fa..00bc907 100644
--- a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DockerRegistryResource.java
+++ b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DockerRegistryResource.java
@@ -16,8 +16,7 @@ import static org.apache.juneau.html.HtmlDocSerializerContext.*;
 
 import java.util.*;
 
-import javax.servlet.*;
-
+import org.apache.juneau.ini.*;
 import org.apache.juneau.microservice.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
@@ -38,13 +37,15 @@ public class DockerRegistryResource extends Resource {
 	private static final long serialVersionUID = 1L;
 
 	// Get registry URL from examples.cfg file.
-	private String registryUrl = getConfig().getString("DockerRegistry/url");
+	private String registryUrl;
 
 	RestClient rc;
 
 	@Override /* Servlet */
-	public void init() throws ServletException {
-		super.init();
+	public synchronized void init(RestConfig servletConfig) throws Exception {
+		super.init(servletConfig);
+		ConfigFile cf = servletConfig.getConfigFile();
+		registryUrl = cf.getString("DockerRegistry/url");
 		rc = new RestClientBuilder().build();
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SampleRemoteableServlet.java
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SampleRemoteableServlet.java b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SampleRemoteableServlet.java
index 68f457b..4173623 100644
--- a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SampleRemoteableServlet.java
+++ b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SampleRemoteableServlet.java
@@ -13,7 +13,7 @@
 package org.apache.juneau.examples.rest;
 
 import static org.apache.juneau.html.HtmlDocSerializerContext.*;
-import static org.apache.juneau.rest.RestServletContext.*;
+import static org.apache.juneau.rest.RestContext.*;
 
 import java.util.*;
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SqlQueryResource.java
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SqlQueryResource.java b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SqlQueryResource.java
index bd270d9..e32d302 100644
--- a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SqlQueryResource.java
+++ b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SqlQueryResource.java
@@ -43,17 +43,20 @@ import org.apache.juneau.rest.annotation.Body;
 public class SqlQueryResource extends Resource {
 	private static final long serialVersionUID = 1L;
 
-	private ConfigFile cf = getConfig();
-
-	private String driver = cf.getString("SqlQueryResource/driver");
-	private String connectionUrl = cf.getString("SqlQueryResource/connectionUrl");
-	private boolean
-		allowUpdates = cf.getBoolean("SqlQueryResource/allowUpdates", false),
-		allowTempUpdates = cf.getBoolean("SqlQueryResource/allowTempUpdates", false),
+	private String driver, connectionUrl;
+	private boolean allowUpdates, allowTempUpdates, includeRowNums;
+
+	@Override /* RestServlet */
+	public synchronized void init(RestConfig servletConfig) throws Exception {
+		super.init(servletConfig);
+		ConfigFile cf = servletConfig.getConfigFile();
+
+		driver = cf.getString("SqlQueryResource/driver");
+		connectionUrl = cf.getString("SqlQueryResource/connectionUrl");
+		allowUpdates = cf.getBoolean("SqlQueryResource/allowUpdates", false);
+		allowTempUpdates = cf.getBoolean("SqlQueryResource/allowTempUpdates", false);
 		includeRowNums = cf.getBoolean("SqlQueryResource/includeRowNums", false);
-
-	@Override /* Servlet */
-	public void init() {
+		
 		try {
 			Class.forName(driver).newInstance();
 		} catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java
index e077abf..b8a7a50 100644
--- a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java
+++ b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java
@@ -17,7 +17,7 @@ import static org.apache.juneau.examples.addressbook.AddressBook.*;
 import static org.apache.juneau.html.HtmlDocSerializerContext.*;
 import static org.apache.juneau.jena.RdfCommonContext.*;
 import static org.apache.juneau.jena.RdfSerializerContext.*;
-import static org.apache.juneau.rest.RestServletContext.*;
+import static org.apache.juneau.rest.RestContext.*;
 
 import java.util.*;
 
@@ -288,7 +288,7 @@ public class AddressBookResource extends ResourceJena {
 				)
 		};
 
-		return new DataSet(items, addressBook, this.getBeanContext().createSession());
+		return new DataSet(items, addressBook, this.getContext().getBeanContext().createSession());
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-microservice/src/main/java/org/apache/juneau/microservice/Resource.java
----------------------------------------------------------------------
diff --git a/juneau-microservice/src/main/java/org/apache/juneau/microservice/Resource.java b/juneau-microservice/src/main/java/org/apache/juneau/microservice/Resource.java
index c0b9326..6102193 100755
--- a/juneau-microservice/src/main/java/org/apache/juneau/microservice/Resource.java
+++ b/juneau-microservice/src/main/java/org/apache/juneau/microservice/Resource.java
@@ -16,14 +16,13 @@ import static org.apache.juneau.html.HtmlDocSerializerContext.*;
 
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.svl.*;
 import org.apache.juneau.svl.vars.*;
 
 /**
  * Superclass for all REST resources.
  * <p>
  * In additional to the functionality of the {@link RestServletDefault} group,
- * augments the {@link #createVarResolver()} method with the following additional variable types:
+ * augments the {@link RestContext#getVarResolver()} method with the following additional variable types:
  * <ul class='spaced-list'>
  * 	<li><code class='snippet'>$ARG{...}</code> - Command line arguments pulled from {@link Microservice#getArgs()}.<br>
  * 		<h6 class='figure'>Example:</h6>
@@ -48,14 +47,12 @@ import org.apache.juneau.svl.vars.*;
 )
 public abstract class Resource extends RestServletDefault {
 
-	/**
-	 * Adds $ARG and $MF variables to variable resolver defined on {@link RestServlet#createVarResolver()}.
-	 */
-	@Override
-	protected VarResolverBuilder createVarResolver() {
-		return super.createVarResolver()
-			.vars(ArgsVar.class, ManifestFileVar.class)
-			.contextObject(ArgsVar.SESSION_args, Microservice.getArgs())
-			.contextObject(ManifestFileVar.SESSION_manifest, Microservice.getManifest());
+	@Override /* RestServlet */
+	public synchronized void init(RestConfig config) throws Exception {
+		config
+			.addVars(ArgsVar.class, ManifestFileVar.class)
+			.addVarContextObject(ArgsVar.SESSION_args, Microservice.getArgs())
+			.addVarContextObject(ManifestFileVar.SESSION_manifest, Microservice.getManifest());
+		super.init(config);
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceGroup.java
----------------------------------------------------------------------
diff --git a/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceGroup.java b/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceGroup.java
index 610575d..440bd28 100755
--- a/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceGroup.java
+++ b/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceGroup.java
@@ -16,14 +16,13 @@ import static org.apache.juneau.html.HtmlDocSerializerContext.*;
 
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.svl.*;
 import org.apache.juneau.svl.vars.*;
 
 /**
  * Superclass for all REST resource groups.
  * <p>
  * In additional to the functionality of the {@link RestServletGroupDefault} group,
- * augments the {@link #createVarResolver()} method with the following additional variable types:
+ * augments the {@link RestContext#getVarResolver()} method with the following additional variable types:
  * <ul class='spaced-list'>
  * 	<li><jk>$ARG{...}</jk> - Command line arguments.<br>
  * 		Resolves values from {@link Microservice#getArgs()}.<br>
@@ -49,14 +48,12 @@ import org.apache.juneau.svl.vars.*;
 )
 public abstract class ResourceGroup extends RestServletGroupDefault {
 
-	/**
-	 * Adds $ARG and $MF variables to variable resolver defined on {@link RestServlet#createVarResolver()}.
-	 */
-	@Override
-	protected VarResolverBuilder createVarResolver() {
-		return super.createVarResolver()
-			.vars(ArgsVar.class, ManifestFileVar.class)
-			.contextObject(ArgsVar.SESSION_args, Microservice.getArgs())
-			.contextObject(ManifestFileVar.SESSION_manifest, Microservice.getManifest());
+	@Override /* RestServlet */
+	public synchronized void init(RestConfig config) throws Exception {
+		config
+			.addVars(ArgsVar.class, ManifestFileVar.class)
+			.addVarContextObject(ArgsVar.SESSION_args, Microservice.getArgs())
+			.addVarContextObject(ManifestFileVar.SESSION_manifest, Microservice.getManifest());
+		super.init(config);
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-microservice/src/main/java/org/apache/juneau/microservice/package.html
----------------------------------------------------------------------
diff --git a/juneau-microservice/src/main/java/org/apache/juneau/microservice/package.html b/juneau-microservice/src/main/java/org/apache/juneau/microservice/package.html
index b546032..f77d119 100755
--- a/juneau-microservice/src/main/java/org/apache/juneau/microservice/package.html
+++ b/juneau-microservice/src/main/java/org/apache/juneau/microservice/package.html
@@ -612,8 +612,9 @@
 					<li><l>$MF{key}, $MF{key,default}</l> - Manifest file entries.
 					<li><l>$ARG{key}, $ARG{key,default}</l> - Command-line arguments.
 				</ul>
-				Additional user-defined variables can be defined by overriding the {@link org.apache.juneau.microservice.Microservice#createVarResolver()} method.
-			<li class='m'>{@link org.apache.juneau.rest.RestServlet#getConfig()} - An instance method to access it from inside a REST servlet.<br>
+				Additional user-defined variables can be defined by overriding the {@link org.apache.juneau.microservice.Microservice#createVarResolver()} method
+				and using the {@link org.apache.juneau.rest.RestConfig#addVars(Class...)} method.
+			<li class='m'>{@link org.apache.juneau.rest.RestContext#getConfigFile()} - An instance method to access it from inside a REST servlet.<br>
 				The following variables are available in addition to the variables defined above:
 				<ul>
 					<li><l>$I{key}, $I{key,default}</l> - Servlet initialization parameters.
@@ -640,9 +641,10 @@
 	}		
 				</p>
 				<p>
-					Additional user-defined variables can be defined at this level by overriding the {@link org.apache.juneau.microservice.Resource#createVarResolver()} method.
+					Additional user-defined variables can be defined at this level by overriding the {@link org.apache.juneau.microservice.Resource#init(RestConfig)} method
+					and using the {@link org.apache.juneau.rest.RestConfig#addVars(Class...)} method.
 				</p>
-			<li class='m'>{@link org.apache.juneau.rest.RestRequest#getConfig()} - An instance method to access it from inside a REST method.<br>
+			<li class='m'>{@link org.apache.juneau.rest.RestRequest#getConfigFile()} - An instance method to access it from inside a REST method.<br>
 				The following variables are available in addition to the variables defined above:
 				<ul>
 					<li><l>$L{key}, $L{key,args}</l> - Localized variables pulled from {@link org.apache.juneau.rest.RestRequest#getMessage(String, Object...)}.
@@ -709,7 +711,7 @@
 	<ck>MyHelloResource.HelloMessage</ck> = <cv>Hello {0}!</cv> 
 				</p>
 				<p>
-					Additional user-defined variables can be defined at this level by overriding the {@link org.apache.juneau.rest.RestServlet#createVarResolver()} method.
+					Additional user-defined variables can be defined at this level by overriding the {@link org.apache.juneau.rest.RestConfig#addVars(Class...)} method.
 				</p>
 		</ul>
 		<p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-microservice/src/main/java/org/apache/juneau/microservice/resources/ConfigResource.java
----------------------------------------------------------------------
diff --git a/juneau-microservice/src/main/java/org/apache/juneau/microservice/resources/ConfigResource.java b/juneau-microservice/src/main/java/org/apache/juneau/microservice/resources/ConfigResource.java
index c7f1b08..f258ec8 100755
--- a/juneau-microservice/src/main/java/org/apache/juneau/microservice/resources/ConfigResource.java
+++ b/juneau-microservice/src/main/java/org/apache/juneau/microservice/resources/ConfigResource.java
@@ -49,7 +49,7 @@ public class ConfigResource extends Resource {
 	 */
 	@RestMethod(name="GET", path="/", description="Show contents of config file.")
 	public ConfigFile getConfigContents() throws Exception {
-		return getConfig();
+		return getServletConfig().getConfigFile();
 	}
 
 	/**
@@ -68,7 +68,7 @@ public class ConfigResource extends Resource {
 					tr(th().child("Contents")),
 					tr(th().child(
 						textarea().name("contents").rows(40).cols(120).style("white-space:pre;word-wrap:normal;overflow-x:scroll;font-family:monospace;")
-							.text(getConfig().toString()))
+							.text(getConfigContents().toString()))
 					)
 				)
 			)
@@ -143,7 +143,7 @@ public class ConfigResource extends Resource {
 	)
 	public ConfigFile setConfigContents(@Body Reader contents) throws Exception {
 		ConfigFile cf2 = ConfigMgr.DEFAULT.create().load(contents);
-		return getConfig().merge(cf2).save();
+		return getConfigContents().merge(cf2).save();
 	}
 
 	/**
@@ -162,7 +162,7 @@ public class ConfigResource extends Resource {
 		}
 	)
 	public ObjectMap setConfigSection(@Path("section") String section, @Body Map<String,String> contents) throws Exception {
-		getConfig().setSection(section, contents);
+		getConfigContents().setSection(section, contents);
 		return getSection(section);
 	}
 
@@ -184,12 +184,12 @@ public class ConfigResource extends Resource {
 		}
 	)
 	public String setConfigSection(@Path("section") String section, @Path("key") String key, @Body String value) throws Exception {
-		getConfig().put(section, key, value, false);
+		getConfigContents().put(section, key, value, false);
 		return getSection(section).getString(key);
 	}
 
-	private ObjectMap getSection(String name) {
-		ObjectMap m = getConfig().getSectionMap(name);
+	private ObjectMap getSection(String name) throws Exception {
+		ObjectMap m = getConfigContents().getSectionMap(name);
 		if (m == null)
 			throw new RestException(SC_NOT_FOUND, "Section not found.");
 		return m;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-microservice/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java
----------------------------------------------------------------------
diff --git a/juneau-microservice/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java b/juneau-microservice/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java
index da1cae9..0922221 100755
--- a/juneau-microservice/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java
+++ b/juneau-microservice/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java
@@ -15,7 +15,7 @@ package org.apache.juneau.microservice.resources;
 import static java.util.logging.Level.*;
 import static javax.servlet.http.HttpServletResponse.*;
 import static org.apache.juneau.html.HtmlDocSerializerContext.*;
-import static org.apache.juneau.rest.RestServletContext.*;
+import static org.apache.juneau.rest.RestContext.*;
 
 import java.io.*;
 import java.net.*;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-microservice/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java
----------------------------------------------------------------------
diff --git a/juneau-microservice/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java b/juneau-microservice/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java
index ea1bc2f..b2011a4 100755
--- a/juneau-microservice/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java
+++ b/juneau-microservice/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java
@@ -14,7 +14,7 @@ package org.apache.juneau.microservice.resources;
 
 import static javax.servlet.http.HttpServletResponse.*;
 import static org.apache.juneau.html.HtmlDocSerializerContext.*;
-import static org.apache.juneau.rest.RestServletContext.*;
+import static org.apache.juneau.rest.RestContext.*;
 
 import java.io.*;
 import java.net.*;
@@ -53,14 +53,8 @@ import org.apache.juneau.transforms.*;
 public class LogsResource extends Resource {
 	private static final long serialVersionUID = 1L;
 
-	private ConfigFile cf = getConfig();
-
-	private File logDir = new File(cf.getString("Logging/logDir", "."));
-	private LogEntryFormatter leFormatter = new LogEntryFormatter(
-		cf.getString("Logging/format", "[{date} {level}] {msg}%n"),
-		cf.getString("Logging/dateFormat", "yyyy.MM.dd hh:mm:ss"),
-		cf.getBoolean("Logging/useStackTraceHashes")
-	);
+	private File logDir;
+	private LogEntryFormatter leFormatter;
 
 	private final FileFilter filter = new FileFilter() {
 		@Override /* FileFilter */
@@ -68,6 +62,19 @@ public class LogsResource extends Resource {
 			return f.isDirectory() || f.getName().endsWith(".log");
 		}
 	};
+	
+	@Override /* RestServlet */
+	public synchronized void init(RestConfig config) throws Exception {
+		super.init(config);
+		ConfigFile cf = config.getConfigFile();
+		
+		logDir = new File(cf.getString("Logging/logDir", "."));
+		leFormatter = new LogEntryFormatter(
+			cf.getString("Logging/format", "[{date} {level}] {msg}%n"),
+			cf.getString("Logging/dateFormat", "yyyy.MM.dd hh:mm:ss"),
+			cf.getBoolean("Logging/useStackTraceHashes")
+		);
+	}
 
 	/**
 	 * [GET /*] - Get file details or directory listing.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/JuneauProvider.java
----------------------------------------------------------------------
diff --git a/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/JuneauProvider.java b/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/JuneauProvider.java
index 6ded12d..e2a6571 100644
--- a/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/JuneauProvider.java
+++ b/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/JuneauProvider.java
@@ -65,7 +65,7 @@ public @interface JuneauProvider {
 	 * <p>
 	 * Any of the following property names can be specified:
 	 * <ul>
-	 * 	<li>{@link RestServletContext}
+	 * 	<li>{@link RestContext}
 	 * 	<li>{@link BeanContext}
 	 * 	<li>{@link SerializerContext}
 	 * 	<li>{@link ParserContext}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/AcceptCharsetResource.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/AcceptCharsetResource.java b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/AcceptCharsetResource.java
index ee3a172..9ab29c6 100644
--- a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/AcceptCharsetResource.java
+++ b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/AcceptCharsetResource.java
@@ -12,7 +12,7 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest.test;
 
-import static org.apache.juneau.rest.RestServletContext.*;
+import static org.apache.juneau.rest.RestContext.*;
 
 import java.io.*;
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ConfigResource.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ConfigResource.java b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ConfigResource.java
index 5be60cb..e8f84cc 100644
--- a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ConfigResource.java
+++ b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ConfigResource.java
@@ -28,11 +28,11 @@ public class ConfigResource extends Resource {
 
 	@RestMethod(name="GET", path="/")
 	public ConfigFile test1(RestRequest req) {
-		return req.getConfig();
+		return req.getConfigFile();
 	}
 
 	@RestMethod(name="GET", path="/{key}/{class}")
 	public Object test2(RestRequest req, @Path("key") String key, @Path("class") Class<?> c) throws Exception {
-		return req.getConfig().getObject(c, key);
+		return req.getConfigFile().getObject(c, key);
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ContentResource.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ContentResource.java b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ContentResource.java
index 3da65d6..6575ec9 100644
--- a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ContentResource.java
+++ b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ContentResource.java
@@ -12,7 +12,7 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest.test;
 
-import static org.apache.juneau.rest.RestServletContext.*;
+import static org.apache.juneau.rest.RestContext.*;
 
 import java.util.*;
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07843d64/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/GroupsResource.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/GroupsResource.java b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/GroupsResource.java
index 0ca0557..adad8d2 100644
--- a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/GroupsResource.java
+++ b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/GroupsResource.java
@@ -29,6 +29,12 @@ import org.apache.juneau.serializer.*;
 public class GroupsResource extends RestServlet {
 	private static final long serialVersionUID = 1L;
 
+	@Override /* RestServlet */
+	public synchronized void init(RestConfig config) throws Exception {
+		config.addSerializers(SSerializer.class).addParsers(PParser.class);
+		super.init(config);
+	}
+
 	@Produces("text/s1,text/s2")
 	public static class SSerializer extends WriterSerializer {
 
@@ -56,17 +62,6 @@ public class GroupsResource extends RestServlet {
 		}
 	}
 
-
-	@Override /* RestServlet */
-	public SerializerGroupBuilder createSerializers(ObjectMap properties, Class<?>[] beanFilters, Class<?>[] pojoSwaps) throws Exception {
-		return super.createSerializers(properties, beanFilters, pojoSwaps).append(SSerializer.class);
-	}
-
-	@Override /* RestServlet */
-	public ParserGroupBuilder createParsers(ObjectMap properties, Class<?>[] beanFilters, Class<?>[] pojoSwaps) throws Exception {
-		return super.createParsers(properties, beanFilters, pojoSwaps).append(PParser.class);
-	}
-
 	//====================================================================================================
 	// Serializer defined on class.
 	//====================================================================================================