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); }
