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) {