Repository: incubator-juneau
Updated Branches:
  refs/heads/master dd919b241 -> 3f929b0a1


Allow various REST classes to be constructed as inner classes of
servlets.

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

Branch: refs/heads/master
Commit: 3f929b0a1899dffc91c2c30cff0bf0bbb73e3e4d
Parents: dd919b2
Author: JamesBognar <[email protected]>
Authored: Tue Aug 1 09:56:01 2017 -0400
Committer: JamesBognar <[email protected]>
Committed: Tue Aug 1 09:56:01 2017 -0400

----------------------------------------------------------------------
 juneau-core/src/main/javadoc/overview.html      | 17 +++++++++--
 .../org/apache/juneau/rest/RestContext.java     | 32 ++++++++------------
 2 files changed, 26 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/3f929b0a/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 e61feaf..cbe82f4 100644
--- a/juneau-core/src/main/javadoc/overview.html
+++ b/juneau-core/src/main/javadoc/overview.html
@@ -6814,7 +6814,7 @@
        <h5 class='toc'>What's new in each release</h5>
        <ul class='toc'>
                <li><p><a class='doclink' href='#6.3.2'>6.3.2 (TBD)</a></p>
-               <li><p><a class='doclink' href='#6.3.1'>6.3.1 (TBD)</a></p>
+               <li><p><a class='doclink' href='#6.3.1'>6.3.1 (Aug 1, 
2017)</a></p>
                <li><p><a class='doclink' href='#6.3.0'>6.3.0 (Jun 30, 
2017)</a></p>
                <li><p><a class='doclink' href='#6.2.0'>6.2.0 (Apr 28, 
2017)</a></p>
                <li><p><a class='doclink' href='#6.1.0'>6.1.0 (Feb 25, 
2017)</a></p>
@@ -6938,9 +6938,20 @@
                                <br>Allows you to specify a resource resolver 
on the servlet context to make it easier to work with
                                dependency injection frameworks.
                        <li>
-                               {@link org.apache.juneau.rest.widget.Widget} 
classes can now be defined as inner classes of servlets/resources.
+                               The following implementation classes can now be 
defined as non-static inner classes of servlets/resources:
+                               <ul>
+                                       <li>{@link 
org.apache.juneau.rest.widget.Widget}
+                                       <li>{@link 
org.apache.juneau.rest.RestConverter}
+                                       <li>{@link 
org.apache.juneau.rest.RestGuard}
+                                       <li>{@link 
org.apache.juneau.rest.ResponseHandler}
+                                       <li>{@link 
org.apache.juneau.rest.RestCallHandler}
+                                       <li>{@link 
org.apache.juneau.rest.RestInfoProvider}
+                                       <li>{@link 
org.apache.juneau.rest.RestResourceResolver}
+                                       <li>{@link 
org.apache.juneau.rest.RestLogger}
+                                       <li>{@link 
org.apache.juneau.html.HtmlDocTemplate}
+                               </ul>
                        <li>
-                               New tooltip template: {@link 
org.apache.juneau.rest.widget.Tooltip}.
+                               New tooltip template: {@link 
org.apache.juneau.rest.widget.Tooltip}
                </ul>
 
                <h6 class='topic'>org.apache.juneau.rest.microservice</h6>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/3f929b0a/juneau-rest/src/main/java/org/apache/juneau/rest/RestContext.java
----------------------------------------------------------------------
diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestContext.java 
b/juneau-rest/src/main/java/org/apache/juneau/rest/RestContext.java
index fbd1f7f..d70b295 100644
--- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestContext.java
+++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -475,7 +475,7 @@ public final class RestContext extends Context {
                        this.callRouters = 
Collections.unmodifiableMap(_callRouters);
 
                        // Initialize our child resources.
-                       resourceResolver = resolve(RestResourceResolver.class, 
b.resourceResolver);
+                       resourceResolver = resolve(resource, 
RestResourceResolver.class, b.resourceResolver);
                        for (Object o : config.childResources) {
                                String path = null;
                                Object r = null;
@@ -530,8 +530,8 @@ public final class RestContext extends Context {
                                }
                        }
 
-                       callHandler = config.callHandler == null ? new 
RestCallHandler(this) : resolve(RestCallHandler.class, config.callHandler, 
this);
-                       infoProvider = config.infoProvider == null ? new 
RestInfoProvider(this) : resolve(RestInfoProvider.class, config.infoProvider, 
this);
+                       callHandler = config.callHandler == null ? new 
RestCallHandler(this) : resolve(resource, RestCallHandler.class, 
config.callHandler, this);
+                       infoProvider = config.infoProvider == null ? new 
RestInfoProvider(this) : resolve(resource, RestInfoProvider.class, 
config.infoProvider, this);
 
                } catch (RestException e) {
                        _initException = e;
@@ -623,7 +623,7 @@ public final class RestContext extends Context {
                        pojoSwaps = toObjectArray(sc.pojoSwaps, Class.class);
 
                        for (Class<?> c : sc.paramResolvers) {
-                               RestParam rp = newInstance(RestParam.class, c);
+                               RestParam rp = newInstanceFromOuter(resource, 
RestParam.class, c);
                                paramResolvers.put(rp.forClass(), rp);
                        }
 
@@ -658,13 +658,13 @@ public final class RestContext extends Context {
                        beanContext = ps.getBeanContext();
 
                        for (Object o : sc.converters)
-                               converters.add(resolve(RestConverter.class, o));
+                               converters.add(resolve(resource, 
RestConverter.class, o));
 
                        for (Object o : sc.guards)
-                               guards.add(resolve(RestGuard.class, o));
+                               guards.add(resolve(resource, RestGuard.class, 
o));
 
                        for (Object o : sc.responseHandlers)
-                               
responseHandlers.add(resolve(ResponseHandler.class, o));
+                               responseHandlers.add(resolve(resource, 
ResponseHandler.class, o));
 
                        mimetypesFileTypeMap = sc.mimeTypes;
 
@@ -697,13 +697,13 @@ public final class RestContext extends Context {
                        }
                        staticFilesPrefixes = 
staticFilesMap.keySet().toArray(new String[0]);
 
-                       logger = sc.logger == null ? new RestLogger.NoOp() : 
resolve(RestLogger.class, sc.logger);
+                       logger = sc.logger == null ? new RestLogger.NoOp() : 
resolve(resource, RestLogger.class, sc.logger);
 
                        fullPath = (sc.parentContext == null ? "" : 
(sc.parentContext.fullPath + '/')) + sc.path;
 
                        this.htmlWidgets = new LinkedHashMap<String,Widget>();
                        for (Class<? extends Widget> wc : sc.htmlWidgets) {
-                               Widget w = 
ClassUtils.newInstanceFromOuter(resource, Widget.class, wc);
+                               Widget w = resolve(resource, Widget.class, wc);
                                this.htmlWidgets.put(w.getName(), w);
                        }
 
@@ -717,7 +717,7 @@ public final class RestContext extends Context {
                        htmlFooter = sc.htmlFooter;
                        htmlNoWrap = sc.htmlNoWrap;
                        htmlNoResultsMessage = sc.htmlNoResultsMessage;
-                       htmlTemplate = 
ClassUtils.newInstance(HtmlDocTemplate.class, sc.htmlTemplate);
+                       htmlTemplate = resolve(resource, HtmlDocTemplate.class, 
sc.htmlTemplate);
                }
        }
 
@@ -1787,17 +1787,9 @@ public final class RestContext extends Context {
        /**
         * Takes in an object of type T or a Class<T> and either casts or 
constructs a T.
         */
-       @SuppressWarnings("unchecked")
-       private static <T> T resolve(Class<T> c, Object o, Object...cArgs) 
throws RestServletException {
-               if (c.isInstance(o))
-                       return (T)o;
-               if (! (o instanceof Class))
-                       throw new RestServletException("Invalid object type 
passed to resolve:  ''{0}''.  Must be an object of type T or a Class<? extend 
T>.", o.getClass());
-               Constructor<T> n = findPublicConstructor((Class<T>)o, cArgs);
-               if (n == null)
-                       throw new RestServletException("Could not find public 
constructor for class ''{0}'' that takes in args {1}", c, 
JsonSerializer.DEFAULT_LAX.toString(getClasses(cArgs)));
+       private static <T> T resolve(Object outer, Class<T> c, Object o, 
Object...cArgs) throws RestServletException {
                try {
-                       return n.newInstance(cArgs);
+                       return ClassUtils.newInstanceFromOuter(outer, c, o, 
cArgs);
                } catch (Exception e) {
                        throw new RestServletException("Exception occurred 
while constructing class ''{0}''", c).initCause(e);
                }

Reply via email to