Author: jafl
Date: Wed Jun  8 22:40:33 2011
New Revision: 1133590

URL: http://svn.apache.org/viewvc?rev=1133590&view=rev
Log:
WW-3518 remove duplicated code from RestActionInvocation

Modified:
    
struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionInvocation.java
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java

Modified: 
struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionInvocation.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionInvocation.java?rev=1133590&r1=1133589&r2=1133590&view=diff
==============================================================================
--- 
struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionInvocation.java
 (original)
+++ 
struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionInvocation.java
 Wed Jun  8 22:40:33 2011
@@ -56,11 +56,11 @@ import org.apache.struts2.rest.handler.H
  * as well as apply content type-specific operations to the result.
  */
 public class RestActionInvocation extends DefaultActionInvocation {
-    
+
     private static final long serialVersionUID = 3485701178946428716L;
 
     private static final Logger LOG = 
LoggerFactory.getLogger(RestActionInvocation.class);
-    
+
     private ContentTypeHandlerManager handlerSelector;
     private boolean logger;
     private String defaultErrorResultName;
@@ -69,89 +69,25 @@ public class RestActionInvocation extend
     protected Object target;
     protected boolean isFirstInterceptor = true;
     protected boolean hasErrors;
-    
+
     protected RestActionInvocation(Map extraContext, boolean pushAction) {
         super(extraContext, pushAction);
     }
 
     @Inject("struts.rest.logger")
     public void setLogger(String value) {
-        logger = new Boolean(value); 
+        logger = new Boolean(value);
     }
-    
+
     @Inject("struts.rest.defaultErrorResultName")
     public void setDefaultErrorResultName(String value) {
-        defaultErrorResultName = value; 
+        defaultErrorResultName = value;
     }
-    
+
     @Inject
     public void setMimeTypeHandlerSelector(ContentTypeHandlerManager sel) {
         this.handlerSelector = sel;
     }
-    
-    protected String invokeAction(Object action, ActionConfig actionConfig) 
throws Exception {
-        String methodName = proxy.getMethod();
-
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("Executing action method = " + 
actionConfig.getMethodName());
-        }
-
-        String timerKey = "invokeAction: "+proxy.getActionName();
-        try {
-            UtilTimerStack.push(timerKey);
-            
-            boolean methodCalled = false;
-            Object methodResult = null;
-            Method method = null;
-            try {
-                method = getAction().getClass().getMethod(methodName, new 
Class[0]);
-            } catch (NoSuchMethodException e) {
-                // hmm -- OK, try doXxx instead
-                try {
-                    String altMethodName = "do" + methodName.substring(0, 
1).toUpperCase() + methodName.substring(1);
-                    method = getAction().getClass().getMethod(altMethodName, 
new Class[0]);
-                } catch (NoSuchMethodException e1) {
-                    // well, give the unknown handler a shot
-                    if (unknownHandlerManager.hasUnknownHandlers()) {
-                        try {
-                            methodResult = 
unknownHandlerManager.handleUnknownMethod(action, methodName);
-                            methodCalled = true;
-                        } catch (NoSuchMethodException e2) {
-                            // throw the original one
-                            throw e;
-                        }
-                    } else {
-                        throw e;
-                    }
-                }
-            }
-            
-            if (!methodCalled) {
-                methodResult = method.invoke(action, new Object[0]);
-            }
-            
-            return saveResult(actionConfig, methodResult);
-        } catch (NoSuchMethodException e) {
-            throw new IllegalArgumentException("The " + methodName + "() is 
not defined in action " + getAction().getClass() + "");
-        } catch (InvocationTargetException e) {
-            // We try to return the source exception.
-            Throwable t = e.getTargetException();
-
-            if (actionEventListener != null) {
-                String result = actionEventListener.handleException(t, 
getStack());
-                if (result != null) {
-                    return result;
-                }
-            }
-            if (t instanceof Exception) {
-                throw(Exception) t;
-            } else {
-                throw e;
-            }
-        } finally {
-            UtilTimerStack.pop(timerKey);
-        }
-    }
 
     /**
      * Save the result to be used later.
@@ -161,8 +97,9 @@ public class RestActionInvocation extend
      *
      * @throws ConfigurationException If it is an incorrect result.
      */
+    @Override
     protected String saveResult(ActionConfig actionConfig, Object 
methodResult) {
-       if (methodResult instanceof Result) {
+        if (methodResult instanceof Result) {
             explicitResult = (Result) methodResult;
             // Wire the result automatically
             container.inject(explicitResult);
@@ -172,283 +109,283 @@ public class RestActionInvocation extend
         } else if (methodResult instanceof String) {
             resultCode = (String) methodResult;
         } else if (methodResult != null) {
-               throw new ConfigurationException("The result type " + 
methodResult.getClass()
-                               + " is not allowed. Use the type String, 
HttpHeaders or Result.");
+            throw new ConfigurationException("The result type " + 
methodResult.getClass()
+                    + " is not allowed. Use the type String, HttpHeaders or 
Result.");
         }
         return resultCode;
     }
 
-       @Override
-       public String invoke() throws Exception {
-               long startTime = 0;
-               
-               boolean executeResult = false;
-               if (isFirstInterceptor) {
-                       startTime = System.currentTimeMillis();         
-                       executeResult = true;
-                       isFirstInterceptor = false;
-               }
-               
-               // Normal invoke without execute the result
-               proxy.setExecuteResult(false);
-               resultCode = super.invoke();
-               
-               // Execute the result when the last interceptor has finished
-               if (executeResult) {
-                       long middleTime = System.currentTimeMillis();
-            
-                       try {
-                               processResult();
-               
-                       } catch (ConfigurationException e) {
-                               throw e;
-                               
-               } catch (Exception e) {
-                       
-                       // Error proccesing the result
-                       LOG.error("Exception processing the result.", e);
-                       
-                       if (!ServletActionContext.getResponse().isCommitted()) {
-                               ServletActionContext.getResponse()
-                                               
.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-                                       stack.set("exception", e);
-                                       result = null;
-                                       resultCode = null;
-                               processResult();
-                       }
-               }
-                       
-                       // Log execution + result time
+    @Override
+    public String invoke() throws Exception {
+        long startTime = 0;
+
+        boolean executeResult = false;
+        if (isFirstInterceptor) {
+            startTime = System.currentTimeMillis();
+            executeResult = true;
+            isFirstInterceptor = false;
+        }
+
+        // Normal invoke without execute the result
+        proxy.setExecuteResult(false);
+        resultCode = super.invoke();
+
+        // Execute the result when the last interceptor has finished
+        if (executeResult) {
+            long middleTime = System.currentTimeMillis();
+
+            try {
+                processResult();
+
+            } catch (ConfigurationException e) {
+                throw e;
+
+            } catch (Exception e) {
+
+                // Error proccesing the result
+                LOG.error("Exception processing the result.", e);
+
+                if (!ServletActionContext.getResponse().isCommitted()) {
+                    ServletActionContext.getResponse()
+                        
.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+                    stack.set("exception", e);
+                    result = null;
+                    resultCode = null;
+                    processResult();
+                }
+            }
+
+            // Log execution + result time
             logger(startTime, middleTime);
         }
-               
-               return resultCode;
-       }
-       
-       protected void processResult() throws Exception {
-               String timerKey = "processResult: " + getResultCode();
+
+        return resultCode;
+    }
+
+    protected void processResult() throws Exception {
+        String timerKey = "processResult: " + getResultCode();
         try {
             UtilTimerStack.push(timerKey);
 
             HttpServletRequest request = ServletActionContext.getRequest();
             HttpServletResponse response = ServletActionContext.getResponse();
 
-               // Select the target
+            // Select the target
             selectTarget();
-            
-               // Get the httpHeaders
+
+            // Get the httpHeaders
             if (httpHeaders == null) {
-               httpHeaders = new DefaultHttpHeaders(resultCode);
+                httpHeaders = new DefaultHttpHeaders(resultCode);
             }
 
             // Apply headers
             if (!hasErrors) {
-               httpHeaders.apply(request, response, target);
+                httpHeaders.apply(request, response, target);
             } else {
-               disableCatching(response);
+                disableCatching(response);
             }
-            
+
             // Don't return content on a not modified
             if (httpHeaders.getStatus() != HttpServletResponse.SC_NOT_MODIFIED 
) {
-                       executeResult();
+                executeResult();
             } else {
-               if (LOG.isDebugEnabled()) {
-                       LOG.debug("Result not processed because the status code 
is not modified.");
-                   }
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Result not processed because the status code is 
not modified.");
+                }
             }
-        
+
         } finally {
             UtilTimerStack.pop(timerKey);
         }
     }
 
-       /**
-     * Execute the current result. If it is an error and no result is selected 
load 
+    /**
+     * Execute the current result. If it is an error and no result is selected 
load
      * the default error result (default-error).
      */
-       private void executeResult() throws Exception {
-               
-       // Get handler by representation
-       ContentTypeHandler handler = handlerSelector.getHandlerForResponse(
-                       ServletActionContext.getRequest(), 
ServletActionContext.getResponse());
-       
-               // get the result
-               this.result = createResult();
-        
-               if (this.result instanceof HttpHeaderResult) {
-                       
-                       // execute the result to apply headers and status in 
every representations
-               this.result.execute(this);
-               updateStatusFromResult();
-               }
-               
-               if (handler != null && !(handler instanceof HtmlHandler)) {
-                       
-                       // Specific representation (json, xml...)
-                       resultCode = handlerSelector.handleResult(
-                                       this.getProxy().getConfig(), 
httpHeaders, target);
-
-               } else {
-                       
-                       // Normal struts execution (html o other struts result)
-                       findResult();
-               if (result != null) {
-               this.result.execute(this);
-               
-               } else {
-                   if (LOG.isDebugEnabled()) {
-                       LOG.debug("No result returned for action " + 
getAction().getClass().getName() 
-                                       + " at " + 
proxy.getConfig().getLocation());
-                   }
-               }
-               }
-       }
-       
-       /**
-        * Get the status code from HttpHeaderResult 
-        * and it is saved in the HttpHeaders object.
-        * @throws Exception
-        */
-       private void updateStatusFromResult() {
-               
-               if (this.result instanceof HttpHeaderResult) {
-                       try {
-                       Field field = 
result.getClass().getDeclaredField("status");
-                       if (field != null) {
-                               field.setAccessible(true);
-                               int status = (Integer)field.get(result);
-                               if (status != -1) {
-                               this.httpHeaders.setStatus(status);
-                               }
-                       }
-                       } catch (Exception e) {
-                               if (LOG.isDebugEnabled()) {
-                                       LOG.debug(e.getMessage(), e);
-                               }
-                       }
-               }               
-       }
-       
-       /**
+    private void executeResult() throws Exception {
+
+        // Get handler by representation
+        ContentTypeHandler handler = handlerSelector.getHandlerForResponse(
+                ServletActionContext.getRequest(), 
ServletActionContext.getResponse());
+
+        // get the result
+        this.result = createResult();
+
+        if (this.result instanceof HttpHeaderResult) {
+
+            // execute the result to apply headers and status in every 
representations
+            this.result.execute(this);
+            updateStatusFromResult();
+        }
+
+        if (handler != null && !(handler instanceof HtmlHandler)) {
+
+            // Specific representation (json, xml...)
+            resultCode = handlerSelector.handleResult(
+                    this.getProxy().getConfig(), httpHeaders, target);
+
+        } else {
+
+            // Normal struts execution (html o other struts result)
+            findResult();
+            if (result != null) {
+                this.result.execute(this);
+
+            } else {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("No result returned for action " + 
getAction().getClass().getName()
+                            + " at " + proxy.getConfig().getLocation());
+                }
+            }
+        }
+    }
+
+    /**
+     * Get the status code from HttpHeaderResult
+     * and it is saved in the HttpHeaders object.
+     * @throws Exception
+     */
+    private void updateStatusFromResult() {
+
+        if (this.result instanceof HttpHeaderResult) {
+            try {
+                Field field = result.getClass().getDeclaredField("status");
+                if (field != null) {
+                    field.setAccessible(true);
+                    int status = (Integer)field.get(result);
+                    if (status != -1) {
+                        this.httpHeaders.setStatus(status);
+                    }
+                }
+            } catch (Exception e) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug(e.getMessage(), e);
+                }
+            }
+        }
+    }
+
+    /**
      * Find the most appropriate result:
      * - Find by result code.
      * - If it is an error, find the default error result.
      *
      * @throws ConfigurationException If not result can be found
      */
-       private void findResult() throws Exception {
-               
-               boolean isHttpHeaderResult = false;
-               if (result != null && this.result instanceof HttpHeaderResult) {
-                       result = null;
-                       isHttpHeaderResult = true;
-               }
-               
-               if (result == null && resultCode != null && 
!Action.NONE.equals(resultCode)
-                               && unknownHandlerManager.hasUnknownHandlers()) {
-               
-                       // Find result by resultCode
-               this.result = unknownHandlerManager.handleUnknownResult(
-                               invocationContext, proxy.getActionName(), 
proxy.getConfig(), resultCode);
-       }
-               
-               if (this.result == null && this.hasErrors && 
defaultErrorResultName != null) {
-               
-                       // Get default error result
-               ResultConfig resultConfig = this.proxy.getConfig().getResults()
-                       .get(defaultErrorResultName);
-               if (resultConfig != null) {
-                   this.result = objectFactory.buildResult(resultConfig, 
invocationContext.getContextMap());
-                   if (LOG.isDebugEnabled()) {
-                       LOG.debug("Found default error result.");
-                   }
-               }
-        }
-               
-        if (result == null && resultCode != null && 
-                       !Action.NONE.equals(resultCode) && !isHttpHeaderResult) 
{
-            throw new ConfigurationException("No result defined for action " 
-                       + getAction().getClass().getName()
+    private void findResult() throws Exception {
+
+        boolean isHttpHeaderResult = false;
+        if (result != null && this.result instanceof HttpHeaderResult) {
+            result = null;
+            isHttpHeaderResult = true;
+        }
+
+        if (result == null && resultCode != null && 
!Action.NONE.equals(resultCode)
+                && unknownHandlerManager.hasUnknownHandlers()) {
+
+            // Find result by resultCode
+            this.result = unknownHandlerManager.handleUnknownResult(
+                    invocationContext, proxy.getActionName(), 
proxy.getConfig(), resultCode);
+        }
+
+        if (this.result == null && this.hasErrors && defaultErrorResultName != 
null) {
+
+            // Get default error result
+            ResultConfig resultConfig = this.proxy.getConfig().getResults()
+                .get(defaultErrorResultName);
+            if (resultConfig != null) {
+                this.result = objectFactory.buildResult(resultConfig, 
invocationContext.getContextMap());
+                if (LOG.isDebugEnabled()) {
+                LOG.debug("Found default error result.");
+                }
+            }
+        }
+
+        if (result == null && resultCode != null &&
+                !Action.NONE.equals(resultCode) && !isHttpHeaderResult) {
+            throw new ConfigurationException("No result defined for action "
+                    + getAction().getClass().getName()
                     + " and result " + getResultCode(), proxy.getConfig());
         }
-       }
-       
+    }
+
     @SuppressWarnings("unchecked")
-       protected void selectTarget() {
-       
-       // Select target (content to return)
-       Throwable e = (Throwable)stack.findValue("exception");
+    protected void selectTarget() {
+
+        // Select target (content to return)
+        Throwable e = (Throwable)stack.findValue("exception");
         if (e != null) {
-               
-               // Exception
-               target = e;
-               hasErrors = true;
-        
+
+            // Exception
+            target = e;
+            hasErrors = true;
+
         } else if (action instanceof ValidationAware && 
((ValidationAware)action).hasErrors()) {
-               
-               // Error messages
-               ValidationAware validationAwareAction = 
((ValidationAware)action);
-               
-               Map errors = new HashMap();
-               if (validationAwareAction.getActionErrors().size() > 0) {
-               errors.put("actionErrors", 
validationAwareAction.getActionErrors());
-               }
-               if (validationAwareAction.getFieldErrors().size() > 0) {
-               errors.put("fieldErrors", 
validationAwareAction.getFieldErrors());
-               }
-               target = errors;
-               hasErrors = true;
-        
+
+            // Error messages
+            ValidationAware validationAwareAction = ((ValidationAware)action);
+
+            Map errors = new HashMap();
+            if (validationAwareAction.getActionErrors().size() > 0) {
+                errors.put("actionErrors", 
validationAwareAction.getActionErrors());
+            }
+            if (validationAwareAction.getFieldErrors().size() > 0) {
+                errors.put("fieldErrors", 
validationAwareAction.getFieldErrors());
+            }
+            target = errors;
+            hasErrors = true;
+
         } else if (action instanceof ModelDriven) {
-               
-               // Model
+
+            // Model
             target = ((ModelDriven)action).getModel();
-        
+
         } else {
-               target = action;
+            target = action;
         }
-       
+
         // don't return any content for PUT, DELETE, and POST where there are 
no errors
-               if (!hasErrors && 
!"get".equalsIgnoreCase(ServletActionContext.getRequest().getMethod())) {
-                       target = null;
-               }
+        if (!hasErrors && 
!"get".equalsIgnoreCase(ServletActionContext.getRequest().getMethod())) {
+            target = null;
+        }
     }
-    
+
     private void disableCatching(HttpServletResponse response) {
-       // No cache
+        // No cache
         response.setHeader("Cache-Control", "no-cache");
         response.setDateHeader("Last-Modified", 0);
         response.setHeader("ETag", "-1");
     }
-    
+
     private void logger(long startTime, long middleTime) {
-            if (logger && LOG.isInfoEnabled()) {
-                long endTime = System.currentTimeMillis();
-                        long executionTime = middleTime - startTime;
-                        long processResult = endTime - middleTime;
-                        long total = endTime - startTime;
-
-                    String message = "Executed action [/";
-                    String namespace = getProxy().getNamespace();
-                    if ((namespace != null) && (namespace.trim().length() > 
1)) {
-                        message += namespace + "/";
-                    }
-                    message += getProxy().getActionName() + "!" + 
getProxy().getMethod();
-                    String extension = handlerSelector.findExtension(
-                                
ServletActionContext.getRequest().getRequestURI());
-                    if (extension != null) {
-                        message += "!" + extension;
-                    }
-                    if (httpHeaders != null) {
-                        message += "!" + httpHeaders.getStatus();
-                    }
-                    message += "] took " + total + " ms (execution: " + 
executionTime 
-                       + " ms, result: " + processResult + " ms)";
-                    
-                    if (LOG.isInfoEnabled()) {
-                        LOG.info(message);
-                    }
-            }
-       }
-       
+         if (logger && LOG.isInfoEnabled()) {
+             long endTime = System.currentTimeMillis();
+             long executionTime = middleTime - startTime;
+             long processResult = endTime - middleTime;
+             long total = endTime - startTime;
+
+             String message = "Executed action [/";
+             String namespace = getProxy().getNamespace();
+             if ((namespace != null) && (namespace.trim().length() > 1)) {
+                 message += namespace + "/";
+             }
+             message += getProxy().getActionName() + "!" + 
getProxy().getMethod();
+             String extension = handlerSelector.findExtension(
+                     ServletActionContext.getRequest().getRequestURI());
+             if (extension != null) {
+                 message += "!" + extension;
+             }
+             if (httpHeaders != null) {
+                 message += "!" + httpHeaders.getStatus();
+             }
+             message += "] took " + total + " ms (execution: " + executionTime
+                + " ms, result: " + processResult + " ms)";
+
+             if (LOG.isInfoEnabled()) {
+             LOG.info(message);
+             }
+         }
+    }
+
 }

Modified: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java?rev=1133590&r1=1133589&r2=1133590&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java
 Wed Jun  8 22:40:33 2011
@@ -56,7 +56,8 @@ public class DefaultActionInvocation imp
     //}
     private static final Logger LOG = 
LoggerFactory.getLogger(DefaultActionInvocation.class);
 
-    private static final Class[] EMPTY_CLASS_ARRAY = new Class[0];
+    private static final Class[] EMPTY_CLASS_ARRAY   = new Class[0];
+    private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
 
     protected Object action;
     protected ActionProxy proxy;
@@ -449,18 +450,10 @@ public class DefaultActionInvocation imp
             }
 
             if (!methodCalled) {
-                methodResult = method.invoke(action, new Object[0]);
+                methodResult = method.invoke(action, EMPTY_OBJECT_ARRAY);
             }
 
-            if (methodResult instanceof Result) {
-                this.explicitResult = (Result) methodResult;
-
-                // Wire the result automatically
-                container.inject(explicitResult);
-                return null;
-            } else {
-                return (String) methodResult;
-            }
+            return saveResult(actionConfig, methodResult);
         } catch (NoSuchMethodException e) {
             throw new IllegalArgumentException("The " + methodName + "() is 
not defined in action " + getAction().getClass() + "");
         } catch (InvocationTargetException e) {
@@ -483,5 +476,22 @@ public class DefaultActionInvocation imp
         }
     }
 
+    /**
+     * Save the result to be used later.
+     * @param actionConfig
+     * @param methodResult the result of the action.
+     * @return the result code to process.
+     */
+    protected String saveResult(ActionConfig actionConfig, Object 
methodResult) {
+        if (methodResult instanceof Result) {
+            this.explicitResult = (Result) methodResult;
+
+            // Wire the result automatically
+            container.inject(explicitResult);
+            return null;
+        } else {
+            return (String) methodResult;
+        }
+    }
 
 }


Reply via email to