package org.hyperic.hq.web.filter; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts2.StrutsStatics; import org.apache.struts2.dispatcher.ServletActionRedirectResult; import org.apache.struts2.dispatcher.ServletRedirectResult; import org.springframework.util.CollectionUtils; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.Result; import com.opensymphony.xwork2.ValidationAware; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; public class RedirectMessageInterceptor extends MethodFilterInterceptor { private static final long serialVersionUID = -1847557437429753540L; public static final String FIELD_ERRORS_KEY = "RedirectMessageInterceptor_FieldErrors"; public static final String ACTION_ERRORS_KEY = "RedirectMessageInterceptor_ActionErrors"; public static final String ACTION_MESSAGES_KEY = "RedirectMessageInterceptor_ActionMessages"; public RedirectMessageInterceptor() { } public String doIntercept(ActionInvocation invocation) throws Exception { Object action = invocation.getAction(); if (action instanceof ValidationAware) { before(invocation, (ValidationAware) action); } String result = invocation.invoke(); if (action instanceof ValidationAware) { after(invocation, (ValidationAware) action); } return result; } /** * Retrieve the errors and messages from the session and add them to the * action. */ protected void before(ActionInvocation invocation, ValidationAware validationAware) throws Exception { @SuppressWarnings("unchecked") Map<String, ?> session = invocation.getInvocationContext().getSession(); @SuppressWarnings("unchecked") Collection<String> actionErrors = (Collection) session .remove(ACTION_ERRORS_KEY); if (actionErrors != null && actionErrors.size() > 0) { for (String error : actionErrors) { validationAware.addActionError(error); } } @SuppressWarnings("unchecked") Collection<String> actionMessages = (Collection) session .remove(ACTION_MESSAGES_KEY); if (actionMessages != null && actionMessages.size() > 0) { for (String message : actionMessages) { validationAware.addActionMessage(message); } } @SuppressWarnings("unchecked") Map<String, List<String>> fieldErrors = (Map) session .remove(FIELD_ERRORS_KEY); if (fieldErrors != null && fieldErrors.size() > 0) { for (Map.Entry<String, List<String>> fieldError : fieldErrors .entrySet()) { for (String message : fieldError.getValue()) { validationAware.addFieldError(fieldError.getKey(), message); } } } } /** * If the result is a redirect then store error and messages in the session. */ protected void after(ActionInvocation invocation, ValidationAware validationAware) throws Exception { removeDuplicates(validationAware); Result result = invocation.getResult(); if (result != null && (result instanceof ServletRedirectResult || result instanceof ServletActionRedirectResult)) { Map<String, Object> session = invocation.getInvocationContext() .getSession(); Collection<String> actionErrors = validationAware.getActionErrors(); if (actionErrors != null && actionErrors.size() > 0) { session.put(ACTION_ERRORS_KEY, actionErrors); } Collection<String> actionMessages = validationAware .getActionMessages(); if (actionMessages != null && actionMessages.size() > 0) { session.put(ACTION_MESSAGES_KEY, actionMessages); } Map<String, List<String>> fieldErrors = validationAware .getFieldErrors(); if (fieldErrors != null && fieldErrors.size() > 0) { session.put(FIELD_ERRORS_KEY, fieldErrors); } } } private void removeDuplicates(ValidationAware validationAware) { if (validationAware != null && validationAware.hasFieldErrors()) { for (String key : validationAware.getFieldErrors().keySet()) { List<String> messages = validationAware.getFieldErrors().get( key); if (!CollectionUtils.isEmpty(messages)) { Set<String> deDuplicate = new HashSet<String>(); for(String msg : messages){ deDuplicate.add(msg); } messages.clear(); Collections.addAll(messages, deDuplicate.toArray(new String[0])); validationAware.getFieldErrors().put(key,messages); } } } } }