You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2017/08/01 13:56:07 UTC

incubator-juneau git commit: Allow various REST classes to be constructed as inner classes of servlets.

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 <ja...@apache.org>
Authored: Tue Aug 1 09:56:01 2017 -0400
Committer: JamesBognar <ja...@apache.org>
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);
 		}