Source:
<code>public void execute(ActionInvocation invocation) throws Exception { <START> ValueStack stack = invocation.getInvocationContext().getValueStack(); <END> String finalNamespace = this.namespace != null ? TextParseUtil.translateVariables(namespace, stack) : invocation.getProxy().getNamespace(); String finalActionName = TextParseUtil.translateVariables(actionName, stack); String finalMethodName = this.methodName != null ? TextParseUtil.translateVariables(this.methodName, stack) : null; if (isInChainHistory(finalNamespace, finalActionName, finalMethodName)) { addToHistory(finalNamespace, finalActionName, finalMethodName); throw new StrutsException("Infinite recursion detected: " + ActionChainResult.getChainHistory().toString()); } if (ActionChainResult.getChainHistory().isEmpty() && invocation.getProxy() != null) { addToHistory(finalNamespace, invocation.getProxy().getActionName(), invocation.getProxy().getMethod()); } addToHistory(finalNamespace, finalActionName, finalMethodName); HashMap<String, Object> extraContext = new HashMap<>(); extraContext.put(ActionContext.VALUE_STACK, invocation.getInvocationContext().getValueStack()); extraContext.put(ActionContext.PARAMETERS, invocation.getInvocationContext().getParameters()); extraContext.put(CHAIN_HISTORY, ActionChainResult.getChainHistory()); LOG.debug("Chaining to action {}", finalActionName); proxy = actionProxyFactory.createActionProxy(finalNamespace, finalActionName, finalMethodName, extraContext); proxy.execute(); }</code><technical_language>In code path a null invocation possibly get processing failing. new code, sense explicitly fail if a null invocation is provided.: if (invocation == null) { throw new IllegalArgumentException("invocation null!"); }</technical_language>

Target:
public void execute(ActionInvocation invocation) throws Exception { ValueStack stack = invocation.getInvocationContext().getValueStack(); String finalNamespace = this.namespace != null ? TextParseUtil.translateVariables(namespace, stack) : invocation.getProxy().getNamespace(); String finalActionName = TextParseUtil.translateVariables(actionName, stack); String finalMethodName = this.methodName != null ? TextParseUtil.translateVariables(this.methodName, stack) : null; if (isInChainHistory(finalNamespace, finalActionName, finalMethodName)) { addToHistory(finalNamespace, finalActionName, finalMethodName); throw new StrutsException("Infinite recursion detected: " + ActionChainResult.getChainHistory().toString()); } if (ActionChainResult.getChainHistory().isEmpty() && invocation.getProxy() != null) { addToHistory(finalNamespace, invocation.getProxy().getActionName(), invocation.getProxy().getMethod()); } addToHistory(finalNamespace, finalActionName, finalMethodName); Map<String, Object> extraContext = ActionContext.of(new HashMap<>()) .withValueStack(invocation.getInvocationContext().getValueStack()) .withParameters(invocation.getInvocationContext().getParameters()) .with(CHAIN_HISTORY, ActionChainResult.getChainHistory()) .getContextMap(); LOG.debug("Chaining to action {}", finalActionName); proxy = actionProxyFactory.createActionProxy(finalNamespace, finalActionName, finalMethodName, extraContext); proxy.execute(); }