This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 84a5c67  Context API refactoring
84a5c67 is described below

commit 84a5c673e0e12b2ba0bb0970efa5ddb3980090c0
Author: JamesBognar <[email protected]>
AuthorDate: Sun Oct 17 10:39:23 2021 -0400

    Context API refactoring
---
 .../main/java/org/apache/juneau/rest/RestCall.java | 135 +++++++++++++++++----
 .../java/org/apache/juneau/rest/RestContext.java   |  23 +---
 .../java/org/apache/juneau/rest/Swagger_Test.java  |   6 +-
 .../apache/juneau/rest/testutils/TestUtils.java    |   3 +-
 4 files changed, 122 insertions(+), 45 deletions(-)

diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCall.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCall.java
index d46ae74..b3bf530 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCall.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCall.java
@@ -19,32 +19,127 @@ import java.util.*;
 import javax.servlet.http.*;
 
 import org.apache.http.*;
+import org.apache.juneau.*;
 import org.apache.juneau.cp.*;
 import org.apache.juneau.http.response.*;
 import org.apache.juneau.rest.logging.*;
 import org.apache.juneau.rest.util.*;
 
 /**
- * A wrapper around a single HttpServletRequest/HttpServletResponse pair.
+ * Represents a single HTTP request.
  */
-public class RestCall {
+public class RestCall extends ContextSession {
+
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Static
+       
//-----------------------------------------------------------------------------------------------------------------
 
        /**
         * Request attribute name for passing path variables from parent to 
child.
         */
        private static final String REST_PATHVARS_ATTR = "juneau.pathVars";
 
-       private Object resource;
+       /**
+        * Creates a builder of this object.
+        *
+        * @param ctx The context creating this builder.
+        * @return A new builder.
+        */
+       public static Builder create(RestContext ctx) {
+               return new Builder(ctx);
+       }
+
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Builder
+       
//-----------------------------------------------------------------------------------------------------------------
+
+       /**
+        * Builder class.
+        */
+       public static class Builder extends ContextSession.Builder {
+
+               RestContext ctx;
+               Object resource;
+               HttpServletRequest req;
+               HttpServletResponse res;
+               RestLogger logger;
+
+               /**
+                * Constructor.
+                *
+                * @param ctx The context creating this session.
+                */
+               protected Builder(RestContext ctx) {
+                       super(ctx);
+                       this.ctx = ctx;
+               }
+
+               /**
+                * Specifies the servlet implementation bean.
+                *
+                * @param value The value for this setting.
+                * @return This object.
+                */
+               public Builder resource(Object value) {
+                       resource = value;
+                       return this;
+               }
+
+               /**
+                * Specifies the incoming HTTP servlet request object.
+                *
+                * @param value The value for this setting.
+                * @return This object.
+                */
+               public Builder req(HttpServletRequest value) {
+                       req = value;
+                       return this;
+               }
+
+               /**
+                * Specifies the incoming HTTP servlet response object.
+                *
+                * @param value The value for this setting.
+                * @return This object.
+                */
+               public Builder res(HttpServletResponse value) {
+                       res = value;
+                       return this;
+               }
+
+               /**
+                * Specifies the logger to use for this session.
+                *
+                * @param value The value for this setting.
+                * @return This object.
+                */
+               public Builder logger(RestLogger value) {
+                       logger = value;
+                       return this;
+               }
+
+               @Override /* Session.Builder */
+               public RestCall build() {
+                       return new RestCall(this);
+               }
+       }
+
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Static
+       
//-----------------------------------------------------------------------------------------------------------------
+
+       private final Object resource;
+       private final RestContext context;
+
+       private RestLogger logger;
        private HttpServletRequest req;
        private HttpServletResponse res;
        private RestRequest rreq;
        private RestResponse rres;
-       private RestContext context;
        private RestOpContext opContext;
        private UrlPath urlPath;
        private String pathInfoUndecoded;
        private long startTime = System.currentTimeMillis();
-       private RestLogger logger;
        private BeanStore beanStore;
        private Map<String,String[]> queryParams;
        private String method;
@@ -54,17 +149,17 @@ public class RestCall {
        /**
         * Constructor.
         *
-        * @param resource The REST object.
-        * @param context The REST context object.
-        * @param req The incoming HTTP servlet request object.
-        * @param res The incoming HTTP servlet response object.
+        * @param builder The builder for this object.
         */
-       public RestCall(Object resource, RestContext context, 
HttpServletRequest req, HttpServletResponse res) {
-               this.context = context;
-               this.resource = resource;
+       public RestCall(Builder builder) {
+               super(builder);
+               context = builder.ctx;
+               resource = builder.resource;
+               logger = builder.logger;
                beanStore = BeanStore.of(context.getRootBeanStore(), resource);
                beanStore.addBean(RestContext.class, context);
-               request(req).response(res);
+               beanStore.addBean(RestLogger.class, logger);
+               request(builder.req).response(builder.res);
        }
 
        
//------------------------------------------------------------------------------------------------------------------
@@ -77,17 +172,6 @@ public class RestCall {
         * @param value The new HTTP servlet request.
         * @return This object (for method chaining).
         */
-       public RestCall resource(Object value) {
-               resource = value;
-               return this;
-       }
-
-       /**
-        * Overrides the request object on the REST call.
-        *
-        * @param value The new HTTP servlet request.
-        * @return This object (for method chaining).
-        */
        public RestCall request(HttpServletRequest value) {
                req = value;
                urlPath = null;
@@ -140,7 +224,6 @@ public class RestCall {
                return this;
        }
 
-
        /**
         * Adds resolved <c><ja>@Resource</ja>(path)</c> variable values to 
this call.
         *
@@ -488,6 +571,7 @@ public class RestCall {
         *
         * @return <jk>true</jk> if debug is enabled for this request.
         */
+       @Override
        public boolean isDebug() {
                if (rreq != null)
                        return rreq.isDebug();
@@ -499,6 +583,7 @@ public class RestCall {
         *
         * @return The context that created this call.
         */
+       @Override
        public RestContext getContext() {
                return context;
        }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index 3a3b649..6870645 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -6256,6 +6256,11 @@ public class RestContext extends Context {
                return Collections.unmodifiableSet(s);
        }
 
+       @Override /* Context */
+       public RestCall.Builder createSession() {
+               return RestCall.create(this);
+       }
+
        /**
         * Returns the bean store associated with this context.
         *
@@ -6992,22 +6997,6 @@ public class RestContext extends Context {
        
//------------------------------------------------------------------------------------------------------------------
 
        /**
-        * Wraps an incoming servlet request/response pair into a single {@link 
RestCall} object.
-        *
-        * <p>
-        * This is the first method called by {@link #execute(Object, 
HttpServletRequest, HttpServletResponse)}.
-        *
-        * @param resource
-        *      The REST servlet or bean that this context defines.
-        * @param req The rest request.
-        * @param res The rest response.
-        * @return The wrapped request/response pair.
-        */
-       public RestCall createCall(Object resource, HttpServletRequest req, 
HttpServletResponse res) {
-               return new RestCall(resource, this, req, 
res).logger(getCallLogger());
-       }
-
-       /**
         * Creates a {@link RestRequest} object based on the specified incoming 
{@link HttpServletRequest} object.
         *
         * <p>
@@ -7049,7 +7038,7 @@ public class RestContext extends Context {
         */
        public void execute(Object resource, HttpServletRequest r1, 
HttpServletResponse r2) throws ServletException, IOException {
 
-               RestCall call = createCall(resource, r1, r2);
+               RestCall call = 
createSession().resource(resource).req(r1).res(r2).logger(getCallLogger()).build();
 
                // Must be careful not to bleed thread-locals.
                if (this.call.get() != null)
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/Swagger_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/rest/Swagger_Test.java
index 4b58ede..7dfcd13 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/rest/Swagger_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/rest/Swagger_Test.java
@@ -47,7 +47,8 @@ public class Swagger_Test {
        private org.apache.juneau.dto.swagger.Swagger getSwaggerWithFile(Object 
resource) throws Exception {
                RestContext rc = 
RestContext.create(resource.getClass(),null,null).init(()->resource).defaultClasses(TestClasspathFileFinder.class).build();
                RestOpContext roc = 
RestOpContext.create(Swagger_Test.class.getMethod("testMethod"), rc).build();
-               RestRequest req = rc.createRequest(new RestCall(resource, rc, 
new MockServletRequest(), new MockServletResponse()).restOpContext(roc));
+               RestCall call = RestCall.create(rc).resource(resource).req(new 
MockServletRequest()).res(new MockServletResponse()).build();
+               RestRequest req = rc.createRequest(call.restOpContext(roc));
                SwaggerProvider ip = rc.getSwaggerProvider();
                return ip.getSwagger(rc, req.getLocale());
        }
@@ -55,7 +56,8 @@ public class Swagger_Test {
        private static org.apache.juneau.dto.swagger.Swagger getSwagger(Object 
resource) throws Exception {
                RestContext rc = 
RestContext.create(resource.getClass(),null,null).init(()->resource).build();
                RestOpContext roc = 
RestOpContext.create(Swagger_Test.class.getMethod("testMethod"), rc).build();
-               RestRequest req = rc.createRequest(new RestCall(resource, rc, 
new MockServletRequest(), new MockServletResponse()).restOpContext(roc));
+               RestCall call = RestCall.create(rc).resource(resource).req(new 
MockServletRequest()).res(new MockServletResponse()).build();
+               RestRequest req = rc.createRequest(call.restOpContext(roc));
                SwaggerProvider ip = rc.getSwaggerProvider();
                return ip.getSwagger(rc, req.getLocale());
        }
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java 
b/juneau-utest/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java
index ce60b51..e045ca6 100755
--- a/juneau-utest/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java
@@ -29,7 +29,8 @@ public class TestUtils extends 
org.apache.juneau.testutils.TestUtils {
                        Object r = c.newInstance();
                        RestContext rc = 
RestContext.create(r.getClass(),null,null).init(()->r).build();
                        RestOpContext ctx = 
RestOpContext.create(TestUtils.class.getMethod("getSwagger", Class.class), 
rc).build();
-                       RestRequest req = rc.createRequest(new RestCall(r, rc, 
new MockServletRequest(), new MockServletResponse()).restOpContext(ctx));
+                       RestCall call = RestCall.create(rc).resource(r).req(new 
MockServletRequest()).res(new MockServletResponse()).build();
+                       RestRequest req = 
rc.createRequest(call.restOpContext(ctx));
                        SwaggerProvider ip = rc.getSwaggerProvider();
                        return ip.getSwagger(rc, req.getLocale());
                } catch (Exception e) {

Reply via email to