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 <[email protected]>
Authored: Thu Mar 16 22:16:57 2017 -0400
Committer: JamesBognar <[email protected]>
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.
        
//====================================================================================================

Reply via email to