You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2014/04/22 08:47:55 UTC

[07/11] git commit: Adds support for annotations on methods

Adds support for annotations on methods


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/b855351e
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/b855351e
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/b855351e

Branch: refs/heads/feature/http-interceptor
Commit: b855351ecb13132033df7ab6d127d86987cf8ef1
Parents: 5664284
Author: Lukasz Lenart <lu...@apache.org>
Authored: Sat Apr 19 21:51:01 2014 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Sat Apr 19 21:51:01 2014 +0200

----------------------------------------------------------------------
 .../httpmethod/HttpMethodInterceptor.java       | 50 ++++++++++++--------
 1 file changed, 30 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/b855351e/core/src/main/java/org/apache/struts2/interceptor/httpmethod/HttpMethodInterceptor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/interceptor/httpmethod/HttpMethodInterceptor.java b/core/src/main/java/org/apache/struts2/interceptor/httpmethod/HttpMethodInterceptor.java
index e22e6a7..1a57af4 100644
--- a/core/src/main/java/org/apache/struts2/interceptor/httpmethod/HttpMethodInterceptor.java
+++ b/core/src/main/java/org/apache/struts2/interceptor/httpmethod/HttpMethodInterceptor.java
@@ -8,6 +8,8 @@ import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.struts2.ServletActionContext;
 
 import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Method;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -18,7 +20,7 @@ import java.util.List;
  * will be returned or if action implements {@link HttpMethodAware}
  * and {@link HttpMethodAware#getBadRequestResultName()} returns non-null result name,
  * thus value will be used instead.
- *
+ * <p/>
  * To limit allowed http methods, annotate action class with {@link AllowedMethod} and specify
  * which methods are allowed. You can also use shorter versions {@link GetOnly}, {@link PostOnly}
  * and {@link GetPostOnly}
@@ -29,12 +31,11 @@ import java.util.List;
  * @see GetOnly
  * @see PostOnly
  * @see GetPostOnly
- *
  * @since 2.3.18
  */
 public class HttpMethodInterceptor extends AbstractInterceptor {
 
-    public static final Class[] HTTP_METHOD_ANNOTATIONS = { AllowedMethod.class, PostOnly.class, GetOnly.class, GetPostOnly.class };
+    public static final Class[] HTTP_METHOD_ANNOTATIONS = {AllowedMethod.class, PostOnly.class, GetOnly.class, GetPostOnly.class};
 
     private static final Logger LOG = LoggerFactory.getLogger(HttpMethodInterceptor.class);
 
@@ -49,48 +50,57 @@ public class HttpMethodInterceptor extends AbstractInterceptor {
                 LOG.debug("Action #0 implements #1, setting request method #3",
                         action, HttpMethodAware.class.getSimpleName(), request.getMethod());
             }
-            ((HttpMethodAware) (action)).setMethod(HttpMethod.valueOf(request.getMethod()));
+            ((HttpMethodAware) (action)).setMethod(HttpMethod.parse(request.getMethod()));
         }
-        if (AnnotationUtils.isAnnotatedBy(action.getClass(), HTTP_METHOD_ANNOTATIONS)) {
+        if (invocation.getProxy().isMethodSpecified()) {
+            Method method = action.getClass().getMethod(invocation.getProxy().getMethod(), new Class[0]);
+            if (AnnotationUtils.isAnnotatedBy(method, HTTP_METHOD_ANNOTATIONS)) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Action's method #0 annotated with #1, checking if request #2 meets allowed methods!",
+                            invocation.getProxy().getMethod(), AllowedMethod.class.getSimpleName(), request.getMethod());
+                }
+                return doIntercept(invocation, method);
+            }
+        } else if (AnnotationUtils.isAnnotatedBy(action.getClass(), HTTP_METHOD_ANNOTATIONS)) {
             if (LOG.isDebugEnabled()) {
                 LOG.debug("Action #0 annotated with #1, checking if request #2 meets allowed methods!",
                         action, AllowedMethod.class.getSimpleName(), request.getMethod());
             }
-            return doIntercept(invocation);
+            return doIntercept(invocation, action.getClass());
         }
         return invocation.invoke();
     }
 
-    protected String doIntercept(ActionInvocation invocation) throws Exception {
-        List<HttpMethod> allowedMethods = readAllowedMethods(invocation.getAction().getClass());
+    protected String doIntercept(ActionInvocation invocation, AnnotatedElement element) throws Exception {
+        List<HttpMethod> allowedMethods = readAllowedMethods(element);
         HttpServletRequest request = ServletActionContext.getRequest();
-        HttpMethod requestedMethod = HttpMethod.valueOf(request.getMethod());
+        HttpMethod requestedMethod = HttpMethod.parse(request.getMethod());
         if (allowedMethods.contains(requestedMethod)) {
-            if(LOG.isTraceEnabled()) {
+            if (LOG.isTraceEnabled()) {
                 LOG.trace("Request method #0 matches allowed methods #1, continuing invocation!", requestedMethod, allowedMethods);
             }
             return invocation.invoke();
         } else {
-            if(LOG.isTraceEnabled()) {
+            if (LOG.isTraceEnabled()) {
                 LOG.trace("Request method #0 doesn't match allowed methods #1, continuing invocation!", requestedMethod, allowedMethods);
             }
             return getBadRequestResultName(invocation);
         }
     }
 
-    protected List<HttpMethod> readAllowedMethods(Class<? extends Object> klass) {
+    protected List<HttpMethod> readAllowedMethods(AnnotatedElement element) {
         List<HttpMethod> allowedMethods = Collections.emptyList();
-        if (AnnotationUtils.isAnnotatedBy(klass, AllowedMethod.class)) {
-            allowedMethods = Arrays.asList(klass.getAnnotation(AllowedMethod.class).value());
+        if (AnnotationUtils.isAnnotatedBy(element, AllowedMethod.class)) {
+            allowedMethods = Arrays.asList(element.getAnnotation(AllowedMethod.class).value());
         }
-        if (AnnotationUtils.isAnnotatedBy(klass, GetOnly.class)) {
-            allowedMethods = Arrays.asList(klass.getAnnotation(GetOnly.class).value());
+        if (AnnotationUtils.isAnnotatedBy(element, GetOnly.class)) {
+            allowedMethods = Arrays.asList(element.getAnnotation(GetOnly.class).value());
         }
-        if (AnnotationUtils.isAnnotatedBy(klass, PostOnly.class)) {
-            allowedMethods = Arrays.asList(klass.getAnnotation(PostOnly.class).value());
+        if (AnnotationUtils.isAnnotatedBy(element, PostOnly.class)) {
+            allowedMethods = Arrays.asList(element.getAnnotation(PostOnly.class).value());
         }
-        if (AnnotationUtils.isAnnotatedBy(klass, GetPostOnly.class)) {
-            allowedMethods = Arrays.asList(klass.getAnnotation(GetPostOnly.class).value());
+        if (AnnotationUtils.isAnnotatedBy(element, GetPostOnly.class)) {
+            allowedMethods = Arrays.asList(element.getAnnotation(GetPostOnly.class).value());
         }
         return Collections.unmodifiableList(allowedMethods);
     }