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.

Reply via email to