package net.techreadiness.ui.util; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.StrutsStatics; import com.google.common.collect.Maps; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ValidationAware; import com.opensymphony.xwork2.config.entities.ResultConfig; import com.opensymphony.xwork2.interceptor.ParametersInterceptor; import com.opensymphony.xwork2.interceptor.PreResultListener; public class SavePreviousAction extends ParametersInterceptor implements PreResultListener { private static final long serialVersionUID = 1L; public static final String fieldErrorsSessionKey = "__LastActionInterceptor_FieldErrors_SessionKey"; public static final String actionErrorsSessionKey = "__LastActionInterceptor_ActionErrors_SessionKey"; public static final String actionMessagesSessionKey = "__LastActionInterceptor_ActionMessages_SessionKey"; public static final String actionParametersSessionKey = "__LastActionInterceptor_ActionParametersMessages_SessionKey"; @Override public String intercept(ActionInvocation invocation) throws Exception { invocation.addPreResultListener(this); Object action = invocation.getAction(); ActionContext context = invocation.getInvocationContext(); if (action instanceof ValidationAware && isPopulatePrevious(context)) { ValidationAware validationAwareAction = (ValidationAware) action; Map<String, List<String>> fieldErrors = (Map<String, List<String>>) context.getSession().get(fieldErrorsSessionKey); Collection<String> actionErrors = (Collection<String>) context.getSession().get(actionErrorsSessionKey); Collection<String> actionMessages = (Collection<String>) context.getSession().get(actionMessagesSessionKey); if (actionErrors != null) { if (validationAwareAction.getActionErrors() == null) { validationAwareAction.setActionErrors(actionErrors); } else { for (String error : actionErrors) { validationAwareAction.addActionError(error); } } } if (fieldErrors != null) { if (validationAwareAction.getFieldErrors() == null) { validationAwareAction.setFieldErrors(fieldErrors); } else { for (Entry<String, List<String>> entry : fieldErrors.entrySet()) { for (String fieldError : entry.getValue()) { validationAwareAction.addFieldError(entry.getKey(), fieldError); } } } } if (actionMessages != null) { if (validationAwareAction.getActionMessages() == null) { validationAwareAction.setActionMessages(actionMessages); } else { for (String message : actionMessages) { validationAwareAction.addActionMessage(message); } } } } return super.intercept(invocation); } @Override protected Map<String, Object> retrieveParameters(ActionContext context) { HttpServletRequest request = (HttpServletRequest) context.get(StrutsStatics.HTTP_REQUEST); if (request.getSession(false) != null && isPopulatePrevious(context)) { return (Map<String, Object>) context.getSession().get(actionParametersSessionKey); } return Collections.emptyMap(); } protected boolean isPopulatePrevious(ActionContext context) { return context.getParameters().containsKey("populatePrevious"); } @Override public void beforeResult(ActionInvocation invocation, String resultCode) { ResultConfig result = invocation.getProxy().getConfig().getResults().get(resultCode); ActionContext context = invocation.getInvocationContext(); if (result != null && LastActionResult.class.getName().equals(result.getClassName())) { Map<String, Object> params = Maps.newHashMap(); for (Entry<String, Object> entry : context.getParameters().entrySet()) { if (acceptableName(entry.getKey())) { params.put(entry.getKey(), entry.getValue()); } } context.getSession().put(actionParametersSessionKey, params); Object action = invocation.getAction(); if (action instanceof ValidationAware) { ValidationAware validationAwareAction = (ValidationAware) action; if (validationAwareAction.hasFieldErrors()) { context.getSession().put(fieldErrorsSessionKey, validationAwareAction.getFieldErrors()); } if (validationAwareAction.hasActionErrors()) { context.getSession().put(actionErrorsSessionKey, validationAwareAction.getActionErrors()); } if (validationAwareAction.hasActionMessages()) { context.getSession().put(actionMessagesSessionKey, validationAwareAction.getActionMessages()); } } } else { context.getSession().remove(actionParametersSessionKey); context.getSession().remove(fieldErrorsSessionKey); context.getSession().remove(actionErrorsSessionKey); context.getSession().remove(actionMessagesSessionKey); context.getSession().remove("last.action.populate.previous"); } } }