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");
                        }
                }
        }

Reply via email to