Commits

Anonymous committed bc4606e

XW-648 improve more flexible input configuration for com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor
o applied patch by zhouyanming

git-svn-id: http://svn.opensymphony.com/svn/xwork/trunk@1894e221344d-f017-0410-9bd5-d282ab1896d7

Comments (0)

Files changed (2)

src/java/com/opensymphony/xwork2/interceptor/DefaultWorkflowInterceptor.java

 import com.opensymphony.xwork2.Action;
 import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.ValidationAware;
+import com.opensymphony.xwork2.interceptor.annotations.InputConfig;
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
 
+import java.lang.reflect.Method;
+
 /**
  * <!-- START SNIPPET: description -->
  * <p/>
                 }
 
                 String resultName = inputResultName;
-                
+
                 if (action instanceof ValidationWorkflowAware) {
                     resultName = ((ValidationWorkflowAware) action).getInputResultName();
                 }
+
+                InputConfig annotation = action.getClass().getMethod(invocation.getProxy().getMethod(), new Class[0]).getAnnotation(InputConfig.class);
+                if (annotation != null) {
+                    if (!annotation.methodName().equals("")) {
+                        Method method = action.getClass().getMethod(annotation.methodName());
+                        resultName = (String) method.invoke(action);
+                    } else {
+                        resultName = annotation.resultName();
+                    }
+                }
+
+
                 return resultName;
             }
         }

src/java/com/opensymphony/xwork2/interceptor/annotations/InputConfig.java

+/*
+ * Copyright (c) 2002-2008 by OpenSymphony
+ * All rights reserved.
+ */
+package com.opensymphony.xwork2.interceptor.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import com.opensymphony.xwork2.Action;
+
+/**
+ * <!-- START SNIPPET: description -->
+ * Marks a action method that if it's not validated by ValidationInterceptor then execute input method or input result.
+ * <!-- END SNIPPET: description -->
+ *
+ * <p/> <u>Annotation usage:</u>
+ *
+ * <!-- START SNIPPET: usage -->
+ * The InputConfig annotation can be applied at method level.
+ *
+ * <!-- END SNIPPET: usage -->
+ *
+ * <p/> <u>Annotation parameters:</u>
+ *
+ * <!-- START SNIPPET: parameters -->
+ * <table class='confluenceTable'>
+ * <tr>
+ * <th class='confluenceTh'> Parameter </th>
+ * <th class='confluenceTh'> Required </th>
+ * <th class='confluenceTh'> Default </th>
+ * <th class='confluenceTh'> Notes </th>
+ * </tr>
+ * <tr>
+ * <td class='confluenceTd'>methodName</td>
+ * <td class='confluenceTd'>no</td>
+ * <td class='confluenceTd'></td>
+ * <td class='confluenceTd'>execute this method if specific</td>
+ * </tr>
+ * <tr>
+ * <td class='confluenceTd'>resultName</td>
+ * <td class='confluenceTd'>no</td>
+ * <td class='confluenceTd'></td>
+ * <td class='confluenceTd'>return this result if methodName not specific</td>
+ * </tr>
+ * </table>
+ * <!-- END SNIPPET: parameters -->
+ *
+ * <p/> <u>Example code:</u>
+ *
+ * <pre>
+ * <!-- START SNIPPET: example -->
+ * public class SampleAction extends ActionSupport {
+ *
+ *  public void isValid() throws ValidationException {
+ *    // validate model object, throw exception if failed
+ *  }
+ *
+ *  &#64;InputConfig(methodName="input")
+ *  public String execute() {
+ *     // perform action
+ *     return SUCCESS;
+ *  }
+ *  public String input() {
+ *     // perform some data filling
+ *     return INPUT;
+ *  }
+ * }
+ * <!-- END SNIPPET: example -->
+ * </pre>
+ *
+ * @author zhouyanming, zhouyanming@gmail.com
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD})
+public @interface InputConfig {
+    String methodName() default "";
+    String resultName() default Action.INPUT;
+}