/** * Tests creating empty action flow configuration. * * @throws Exception when something goes wrong. */ @Test public void testNoFlow() throws Exception { ActionProxy proxy = getActionProxy("/noFlow/noFlow"); Assert.assertNotNull(proxy); proxy.getInvocation().getInvocationContext().setSession(new HashMap<String, Object>()); proxy.execute(); }
/** * Tests creating action flow override configuration. * * @throws Exception when something goes wrong. */ @Test public void testCorrectFlowOverride() throws Exception { ActionProxy proxy = getActionProxy("/correctFlowOverride/correctFlowOverride"); Assert.assertNotNull(proxy); proxy.getInvocation().getInvocationContext().setSession(new HashMap<String, Object>()); proxy.execute(); ActionConfig overriddenViewConf = configuration .getRuntimeConfiguration() .getActionConfig("/correctFlowOverride", "savePhone-2ViewOverride"); Assert.assertNotNull(overriddenViewConf); Assert.assertEquals("phone", overriddenViewConf.getMethodName()); Assert.assertEquals( "anotherPhone", overriddenViewConf .getResults() .get(Action.SUCCESS) .getParams() .get(ServletDispatcherResult.DEFAULT_PARAM)); ActionConfig actionConfig = configuration .getRuntimeConfiguration() .getActionConfig("/correctFlowOverride", "saveName-1ViewOverride"); Assert.assertNotNull(actionConfig); Assert.assertEquals("executeOverride", actionConfig.getMethodName()); Assert.assertEquals( "name", actionConfig .getResults() .get(Action.SUCCESS) .getParams() .get(ServletDispatcherResult.DEFAULT_PARAM)); }
/** * Load Action class for mapping and invoke the appropriate Action method, or go directly to the * Result. * * <p>This method first creates the action context from the given parameters, and then loads an * <tt>ActionProxy</tt> from the given action name and namespace. After that, the Action method is * executed and output channels through the response object. Actions not found are sent back to * the user via the {@link Dispatcher#sendError} method, using the 404 return code. All other * errors are reported by throwing a ServletException. * * @param request the HttpServletRequest object * @param response the HttpServletResponse object * @param mapping the action mapping object * @throws ServletException when an unknown error occurs (not a 404, but typically something that * would end up as a 5xx by the servlet container) * @param context Our ServletContext object */ public void serviceAction( HttpServletRequest request, HttpServletResponse response, ServletContext context, ActionMapping mapping) throws ServletException { Map<String, Object> extraContext = createContextMap(request, response, mapping, context); // If there was a previous value stack, then create a new copy and pass it in to be used by the // new Action ValueStack stack = (ValueStack) request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY); boolean nullStack = stack == null; if (nullStack) { ActionContext ctx = ActionContext.getContext(); if (ctx != null) { stack = ctx.getValueStack(); } } if (stack != null) { extraContext.put(ActionContext.VALUE_STACK, valueStackFactory.createValueStack(stack)); } String timerKey = "Handling request from Dispatcher"; try { UtilTimerStack.push(timerKey); String namespace = mapping.getNamespace(); String name = mapping.getName(); String method = mapping.getMethod(); Configuration config = configurationManager.getConfiguration(); ActionProxy proxy = config .getContainer() .getInstance(ActionProxyFactory.class) .createActionProxy(namespace, name, method, extraContext, true, false); request.setAttribute( ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack()); // if the ActionMapping says to go straight to a result, do it! if (mapping.getResult() != null) { Result result = mapping.getResult(); result.execute(proxy.getInvocation()); } else { proxy.execute(); } // If there was a previous value stack then set it back onto the request if (!nullStack) { request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, stack); } } catch (ConfigurationException e) { // WW-2874 Only log error if in devMode if (devMode) { String reqStr = request.getRequestURI(); if (request.getQueryString() != null) { reqStr = reqStr + "?" + request.getQueryString(); } LOG.error("Could not find action or result\n" + reqStr, e); } else { if (LOG.isWarnEnabled()) { LOG.warn("Could not find action or result", e); } } sendError(request, response, context, HttpServletResponse.SC_NOT_FOUND, e); } catch (Exception e) { if (handleException || devMode) { sendError(request, response, context, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e); } else { throw new ServletException(e); } } finally { UtilTimerStack.pop(timerKey); } }