Repository: incubator-juneau Updated Branches: refs/heads/master 437c0f1a8 -> 779e1d94c
Updates to RestResourceResolver. Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/779e1d94 Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/779e1d94 Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/779e1d94 Branch: refs/heads/master Commit: 779e1d94c50a27394b2a44a8d05cf8064bbc6228 Parents: 437c0f1 Author: JamesBognar <[email protected]> Authored: Fri Jul 14 17:29:42 2017 -0400 Committer: JamesBognar <[email protected]> Committed: Fri Jul 14 17:29:42 2017 -0400 ---------------------------------------------------------------------- juneau-core/src/main/javadoc/overview.html | 5 +++ .../java/org/apache/juneau/rest/RestConfig.java | 6 ++-- .../org/apache/juneau/rest/RestContext.java | 34 +++++++++++++++--- .../juneau/rest/RestResourceResolver.java | 37 ++++++++++++-------- .../org/apache/juneau/rest/RestServlet.java | 2 +- .../juneau/rest/annotation/RestResource.java | 4 ++- 6 files changed, 63 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/779e1d94/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 d42b630..d800f0e 100644 --- a/juneau-core/src/main/javadoc/overview.html +++ b/juneau-core/src/main/javadoc/overview.html @@ -6905,6 +6905,11 @@ <li> {@link org.apache.juneau.rest.RestResourceResolver} instances are now inherited from parent resources to child resources unless explicitly overridden at the child level. + <br>It's also been changed to an interface. + <li> + New setting: {@link org.apache.juneau.rest.RestContext#REST_resourceResolver}. + <br>Allows you to specify a resource resolver on the servlet context to make it easier to work with + dependency injection frameworks. </ul> </div> http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/779e1d94/juneau-rest/src/main/java/org/apache/juneau/rest/RestConfig.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestConfig.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestConfig.java index 0035714..0bc4181 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestConfig.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestConfig.java @@ -118,7 +118,7 @@ public class RestConfig implements ServletConfig { String[] htmlLinks; String clientVersionHeader = "X-Client-Version"; - Object resourceResolver = RestResourceResolver.class; + Object resourceResolver = RestResourceResolver.Default.class; Object logger = RestLogger.Normal.class; Object callHandler = RestCallHandler.class; Object infoProvider = RestInfoProvider.class; @@ -156,7 +156,7 @@ public class RestConfig implements ServletConfig { this.inner = config; this.resourceClass = resourceClass; this.parentContext = parentContext; - this.resourceResolver = parentContext == null ? RestResourceResolver.class : parentContext.getResourceResolver(); + this.resourceResolver = parentContext == null ? RestResourceResolver.Default.class : parentContext.getResourceResolver(); try { ConfigFileBuilder cfb = new ConfigFileBuilder(); @@ -1024,7 +1024,7 @@ public class RestConfig implements ServletConfig { * <p> * The resource resolver is used to resolve instances from {@link Class} objects defined in the * {@link RestResource#children()} annotation. - * The default value is the base class {@link RestResourceResolver}. + * The default value is {@link RestResourceResolver.Default}. * * <p> * This is the programmatic equivalent to the http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/779e1d94/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 d37aaa3..4a18c33 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 @@ -229,6 +229,23 @@ public final class RestContext extends Context { */ public static final String REST_paramFormat = "RestServlet.paramFormat"; + /** + * <b>Configuration property:</b> REST resource resolver. + * + * <ul> + * <li><b>Name:</b> <js>"RestServlet.resourceResolver"</js> + * <li><b>Data type:</b> <code>Class</code> or {@link RestResourceResolver} + * <li><b>Default:</b> <jk>null</jk> + * </ul> + * + * <p> + * The resource resolver used to instantiate REST resource classes. + * + * <p> + * Applicable to servlet class. + * <br>Can be passed in through servlet context. + */ + public static final String REST_resourceResolver = "RestServlet.resourceResolver"; private final Object resource; @@ -306,11 +323,14 @@ public final class RestContext extends Context { * Constructor. * * @param resource The resource class (a class annotated with {@link RestResource @RestResource}). + * @param servletContext + * The servlet context object. + * Can be <jk>null</jk> if this isn't a * @param config The servlet configuration object. * @throws Exception If any initialization problems were encountered. */ @SuppressWarnings("unchecked") - public RestContext(Object resource, RestConfig config) throws Exception { + public RestContext(Object resource, ServletContext servletContext, RestConfig config) throws Exception { super(null); RestException _initException = null; try { @@ -319,7 +339,7 @@ public final class RestContext extends Context { this.resourceFinder = new ResourceFinder(resource.getClass()); this.parentContext = config.parentContext; - Builder b = new Builder(resource, config); + Builder b = new Builder(resource, servletContext, config); this.allowHeaderParams = b.allowHeaderParams; this.allowBodyParam = b.allowBodyParam; this.renderResponseStackTraces = b.renderResponseStackTraces; @@ -455,7 +475,7 @@ public final class RestContext extends Context { this.callRouters = Collections.unmodifiableMap(_callRouters); // Initialize our child resources. - resourceResolver = resolve(RestResourceResolver.class, config.resourceResolver); + resourceResolver = resolve(RestResourceResolver.class, b.resourceResolver); for (Object o : config.childResources) { String path = null; Object r = null; @@ -498,7 +518,7 @@ public final class RestContext extends Context { if (m2 != null) m2.invoke(r, childConfig); - RestContext rc2 = new RestContext(r, childConfig); + RestContext rc2 = new RestContext(r, servletContext, childConfig); // Call the init(RestContext) method. m2 = findPublicMethod(r.getClass(), "init", Void.class, RestContext.class); @@ -566,9 +586,10 @@ public final class RestContext extends Context { RestLogger logger; String fullPath; Map<String,Widget> htmlWidgets; + Object resourceResolver; @SuppressWarnings("unchecked") - private Builder(Object resource, RestConfig sc) throws Exception { + private Builder(Object resource, ServletContext ctx, RestConfig sc) throws Exception { PropertyStore ps = sc.createPropertyStore(); @@ -580,6 +601,9 @@ public final class RestContext extends Context { useStackTraceHashes = ps.getProperty(REST_useStackTraceHashes, boolean.class, true); defaultCharset = ps.getProperty(REST_defaultCharset, String.class, "utf-8"); paramFormat = ps.getProperty(REST_paramFormat, String.class, ""); + resourceResolver = ps.getProperty(REST_resourceResolver, Object.class, ctx == null ? null : ctx.getAttribute(REST_resourceResolver)); + if (resourceResolver == null) + resourceResolver = sc.resourceResolver; for (String m : split(ps.getProperty(REST_allowMethodParam, String.class, ""))) if (m.equals("true")) // For backwards compatibility when this was a boolean field. http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/779e1d94/juneau-rest/src/main/java/org/apache/juneau/rest/RestResourceResolver.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestResourceResolver.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestResourceResolver.java index 308eba0..337fbce 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestResourceResolver.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestResourceResolver.java @@ -52,13 +52,32 @@ import org.apache.juneau.rest.annotation.*; * <li><code><jk>public void</jk> init(RestConfig);</code> * <li><code><jk>public void</jk> init(RestContext);</code> * </ul> + * + * <p> + * An instance of this class can also be passed in through the servlet context as the context attribute + * {@link RestContext#REST_resourceResolver}. */ -public class RestResourceResolver { +public interface RestResourceResolver { /** * Denotes the default resolver. */ - public static final class DEFAULT extends RestResourceResolver {} + public static class Default implements RestResourceResolver { + @Override + public Object resolve(Class<?> c, RestConfig config) throws RestServletException { + try { + Constructor<?> c1 = findPublicConstructor(c, RestConfig.class); + if (c1 != null) + return c1.newInstance(config); + c1 = findPublicConstructor(c); + if (c1 != null) + return c1.newInstance(); + } catch (Exception e) { + throw new RestServletException("Could not instantiate resource class ''{0}''", c.getName()).initCause(e); + } + throw new RestServletException("Could not find public constructor for class ''{0}''.", c); + } + } /** * Resolves the specified class to a resource object. @@ -74,17 +93,5 @@ public class RestResourceResolver { * @return The instance of that class. * @throws RestServletException If class could not be resolved. */ - public Object resolve(Class<?> c, RestConfig config) throws RestServletException { - try { - Constructor<?> c1 = findPublicConstructor(c, RestConfig.class); - if (c1 != null) - return c1.newInstance(config); - c1 = findPublicConstructor(c); - if (c1 != null) - return c1.newInstance(); - } catch (Exception e) { - throw new RestServletException("Could not instantiate resource class ''{0}''", c.getName()).initCause(e); - } - throw new RestServletException("Could not find public constructor for class ''{0}''.", c); - } + Object resolve(Class<?> c, RestConfig config) throws RestServletException; } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/779e1d94/juneau-rest/src/main/java/org/apache/juneau/rest/RestServlet.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestServlet.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestServlet.java index 52ab73c..fc9ff2e 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestServlet.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestServlet.java @@ -124,7 +124,7 @@ public abstract class RestServlet extends HttpServlet { if (isInitialized) return; this.config = config; - this.context = new RestContext(this, config); + this.context = new RestContext(this, this.getServletContext(), config); this.isInitialized = true; } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/779e1d94/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestResource.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestResource.java b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestResource.java index b111260..48473a9 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestResource.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestResource.java @@ -632,8 +632,10 @@ public @interface RestResource { * <p> * The programmatic equivalent to this annotation are the {@link RestConfig#setResourceResolver(Class)}/ * {@link RestConfig#setResourceResolver(RestResourceResolver)} methods. + * <br>The value (class or instance) can also be set via the servlet context attribute + * * {@link RestContext#REST_resourceResolver}. */ - Class<? extends RestResourceResolver> resourceResolver() default RestResourceResolver.class; + Class<? extends RestResourceResolver> resourceResolver() default RestResourceResolver.Default.class; /** * Specifies the logger class to use for logging.
