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 959bc97 REST refactoring.
959bc97 is described below
commit 959bc97251b3a1c062df9a503c0fb2449e4f7985
Author: JamesBognar <[email protected]>
AuthorDate: Tue Feb 9 10:20:19 2021 -0500
REST refactoring.
---
.../apache/juneau/rest/ClientVersionMatcher.java | 4 +-
.../main/java/org/apache/juneau/rest/RestCall.java | 54 +++++++++++++++++++---
.../java/org/apache/juneau/rest/RestContext.java | 3 --
.../java/org/apache/juneau/rest/RestMatcher.java | 4 +-
.../apache/juneau/rest/RestOperationContext.java | 10 ++--
.../java/org/apache/juneau/rest/RestRequest.java | 28 +----------
.../rest/matchers/MultipartFormDataMatcher.java | 4 +-
.../rest/matchers/UrlEncodedFormMatcher.java | 4 +-
.../rest/Rest_PredefinedStatusCodes_Test.java | 4 +-
.../rest/annotation/RestOp_Matchers_Test.java | 12 +++--
10 files changed, 77 insertions(+), 50 deletions(-)
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ClientVersionMatcher.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ClientVersionMatcher.java
index aa56c7f..e135707 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ClientVersionMatcher.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ClientVersionMatcher.java
@@ -14,6 +14,8 @@ package org.apache.juneau.rest;
import static org.apache.juneau.internal.StringUtils.*;
+import javax.servlet.http.*;
+
import org.apache.juneau.internal.*;
import org.apache.juneau.reflect.*;
import org.apache.juneau.rest.annotation.*;
@@ -45,7 +47,7 @@ public class ClientVersionMatcher extends RestMatcher {
}
@Override /* RestMatcher */
- public boolean matches(RestRequest req) {
+ public boolean matches(HttpServletRequest req) {
return range.matches(req.getHeader(clientVersionHeader));
}
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 019a03e..c721e83 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
@@ -46,6 +46,8 @@ public class RestCall {
private long startTime = System.currentTimeMillis();
private RestLogger logger;
private BeanFactory beanFactory;
+ private Map<String,String[]> queryParams;
+ private String method;
private UrlPathMatch urlPathMatch;
@@ -127,7 +129,6 @@ public class RestCall {
* @return This object (for method chaining).
*/
public RestCall restRequest(RestRequest value) {
- request(value);
rreq = value;
beanFactory.addBean(RestRequest.class, value);
return this;
@@ -140,7 +141,6 @@ public class RestCall {
* @return This object (for method chaining).
*/
public RestCall restResponse(RestResponse value) {
- response(value);
rres = value;
rreq.setResponse(value);
beanFactory.addBean(RestResponse.class, value);
@@ -365,7 +365,10 @@ public class RestCall {
*/
public RestCall finish() {
try {
- res.flushBuffer();
+ if (rres != null)
+ rres.flushBuffer();
+ else
+ res.flushBuffer();
req.setAttribute("ExecTime", System.currentTimeMillis()
- startTime);
if (rreq != null)
rreq.close();
@@ -423,14 +426,53 @@ public class RestCall {
}
/**
+ * Returns the query parameters on the request.
+ *
+ * <p>
+ * Unlike {@link HttpServletRequest#getParameterMap()}, this doesn't
parse the content body if it's a POST.
+ *
+ * @return The query parameters on the request.
+ */
+ public Map<String,String[]> getQueryParams() {
+ if (queryParams == null) {
+ if (req.getMethod().equalsIgnoreCase("POST"))
+ queryParams =
RestUtils.parseQuery(req.getQueryString(), new LinkedHashMap<>());
+ else
+ queryParams = req.getParameterMap();
+ }
+ return queryParams;
+ }
+
+ /**
* Returns the HTTP method name.
*
* @return The HTTP method name, always uppercased.
*/
public String getMethod() {
- if (rreq != null)
- return rreq.getMethod().toUpperCase(Locale.ENGLISH);
- return req.getMethod().toUpperCase(Locale.ENGLISH);
+ if (method == null) {
+
+ Set<String> s1 = context.getAllowedMethodParams();
+ Set<String> s2 = context.getAllowedMethodHeaders();
+
+ if (! s1.isEmpty()) {
+ String[] x = getQueryParams().get("method");
+ if (x != null && (s1.contains("*") ||
s1.contains(x[0])))
+ method = x[0];
+ }
+
+ if (method == null && ! s2.isEmpty()) {
+ String x = req.getHeader("X-Method");
+ if (x != null && (s2.contains("*") ||
s2.contains(x)))
+ method = x;
+ }
+
+ if (method == null)
+ method = req.getMethod();
+
+ method = method.toUpperCase(Locale.ENGLISH);
+ }
+
+ return method;
}
/**
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 dd70620..5eb2e65 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
@@ -6723,9 +6723,6 @@ public class RestContext extends BeanContext {
startCall(call);
- createRequest(call);
- createResponse(call);
-
// If the specified method has been defined in a
subclass, invoke it.
try {
restOperations.findOperation(call).invoke(call);
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMatcher.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMatcher.java
index 26bdcd5..2301dc5 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMatcher.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMatcher.java
@@ -12,6 +12,8 @@
//
***************************************************************************************************************************
package org.apache.juneau.rest;
+import javax.servlet.http.*;
+
import org.apache.juneau.rest.annotation.*;
/**
@@ -75,7 +77,7 @@ public abstract class RestMatcher {
* @param req The servlet request.
* @return <jk>true</jk> if the specified request matches this matcher.
*/
- public abstract boolean matches(RestRequest req);
+ public abstract boolean matches(HttpServletRequest req);
/**
* Returns <jk>true</jk> if this matcher is required to match in order
for the method to be invoked.
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOperationContext.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOperationContext.java
index 5987389..92d0c83 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOperationContext.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOperationContext.java
@@ -29,6 +29,7 @@ import java.util.concurrent.*;
import java.util.function.*;
import javax.servlet.*;
+import javax.servlet.http.*;
import org.apache.http.*;
import org.apache.http.ParseException;
@@ -1808,11 +1809,7 @@ public class RestOperationContext extends BeanContext
implements Comparable<Rest
}
try {
- RestRequest req = call.getRestRequest();
- RestResponse res = call.getRestResponse();
-
- req.init(this);
- res.init(this);
+ HttpServletRequest req = call.getRequest();
// If the method implements matchers, test them.
for (RestMatcher m : requiredMatchers)
@@ -1841,6 +1838,9 @@ public class RestOperationContext extends BeanContext
implements Comparable<Rest
*/
protected void invoke(RestCall call) throws Throwable {
+ context.createRequest(call).init(this);
+ context.createResponse(call).init(this);
+
UrlPathMatch pm = call.getUrlPathMatch();
if (pm == null)
pm = matchPattern(call);
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
index d66a0ae..d2a481e 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
@@ -109,7 +109,6 @@ public final class RestRequest extends
HttpServletRequestWrapper {
private final RequestQuery queryParams;
private RequestFormData formData;
private RequestPath pathParams;
- private boolean isPost;
private UriContext uriContext;
private String charset, authorityPath;
private RequestHeaders headers;
@@ -135,35 +134,12 @@ public final class RestRequest extends
HttpServletRequestWrapper {
this.call = call;
try {
- isPost = req.getMethod().equalsIgnoreCase("POST");
-
// If this is a POST, we want to parse the query
parameters ourselves to prevent
// the servlet code from processing the HTTP body as
URL-Encoded parameters.
queryParams = new RequestQuery(this);
- if (isPost)
- RestUtils.parseQuery(getQueryString(),
queryParams);
- else
- queryParams.putAll(req.getParameterMap());
-
- // Get the HTTP method.
- // Can be overridden through a "method" GET attribute.
- String _method = super.getMethod();
-
- String m = getQuery().getString("method");
- if (m != null) {
- Set<String> s =
context.getAllowedMethodParams();
- if (! s.isEmpty() && (s.contains("*") ||
s.contains(m)))
- _method = m;
- }
-
- m = req.getHeader("X-Method");
- if (m != null) {
- Set<String> s =
context.getAllowedMethodHeaders();
- if (! s.isEmpty() && (s.contains("*") ||
s.contains(m)))
- _method = m;
- }
+ queryParams.putAll(call.getQueryParams());
- method = _method;
+ method = call.getMethod();
headers = new RequestHeaders(this);
for (Enumeration<String> e = getHeaderNames();
e.hasMoreElements();) {
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/matchers/MultipartFormDataMatcher.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/matchers/MultipartFormDataMatcher.java
index 1072dfd..e1ef109 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/matchers/MultipartFormDataMatcher.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/matchers/MultipartFormDataMatcher.java
@@ -12,6 +12,8 @@
//
***************************************************************************************************************************
package org.apache.juneau.rest.matchers;
+import javax.servlet.http.*;
+
import org.apache.juneau.rest.*;
/**
@@ -24,7 +26,7 @@ import org.apache.juneau.rest.*;
public class MultipartFormDataMatcher extends RestMatcher {
@Override /* RestMatcher */
- public boolean matches(RestRequest req) {
+ public boolean matches(HttpServletRequest req) {
String contentType = req.getContentType();
return contentType != null &&
contentType.startsWith("multipart/form-data");
}
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/matchers/UrlEncodedFormMatcher.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/matchers/UrlEncodedFormMatcher.java
index 751d247..81de397 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/matchers/UrlEncodedFormMatcher.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/matchers/UrlEncodedFormMatcher.java
@@ -12,6 +12,8 @@
//
***************************************************************************************************************************
package org.apache.juneau.rest.matchers;
+import javax.servlet.http.*;
+
import org.apache.juneau.rest.*;
/**
@@ -24,7 +26,7 @@ import org.apache.juneau.rest.*;
public class UrlEncodedFormMatcher extends RestMatcher {
@Override /* RestMatcher */
- public boolean matches(RestRequest req) {
+ public boolean matches(HttpServletRequest req) {
String contentType = req.getContentType();
return contentType != null &&
contentType.equals("application/x-www-form-urlencoded");
}
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/rest/Rest_PredefinedStatusCodes_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/rest/Rest_PredefinedStatusCodes_Test.java
index e8377fe..1c6f81a 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/rest/Rest_PredefinedStatusCodes_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/rest/Rest_PredefinedStatusCodes_Test.java
@@ -17,6 +17,8 @@ import static org.junit.runners.MethodSorters.*;
import java.io.*;
+import javax.servlet.http.*;
+
import org.apache.juneau.http.annotation.Body;
import org.apache.juneau.http.annotation.Header;
import org.apache.juneau.http.annotation.Path;
@@ -217,7 +219,7 @@ public class Rest_PredefinedStatusCodes_Test {
}
public static class NeverMatcher extends RestMatcher {
@Override /* RestMatcher */
- public boolean matches(RestRequest req) {
+ public boolean matches(HttpServletRequest req) {
return false;
}
}
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/RestOp_Matchers_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/RestOp_Matchers_Test.java
index 383404d..60dd4ef 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/RestOp_Matchers_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/RestOp_Matchers_Test.java
@@ -15,8 +15,10 @@ package org.apache.juneau.rest.annotation;
import static org.apache.juneau.http.HttpMethod.*;
import static org.junit.runners.MethodSorters.*;
+import javax.servlet.http.*;
+
+import org.apache.juneau.internal.*;
import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.RestRequest;
import org.apache.juneau.rest.client.*;
import org.apache.juneau.rest.mock.*;
import org.junit.*;
@@ -53,14 +55,14 @@ public class RestOp_Matchers_Test {
public static class A1 extends RestMatcher {
@Override /* RestMatcher */
- public boolean matches(RestRequest req) {
- return
req.getQuery().getString("t1","").equals("1");
+ public boolean matches(HttpServletRequest req) {
+ return
StringUtils.emptyIfNull(req.getQueryString()).contains("t1=1");
}
}
public static class A2 extends RestMatcher {
@Override /* RestMatcher */
- public boolean matches(RestRequest req) {
- return
req.getQuery().getString("t2","").equals("2");
+ public boolean matches(HttpServletRequest req) {
+ return
StringUtils.emptyIfNull(req.getQueryString()).contains("t2=2");
}
}
}