package com.gxlu.common.web.webwork.intercepter;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.gxlu.common.web.webwork.action.AjaxJSONAction;
import com.gxlu.common.web.webwork.action.AjaxUpdaterAction;
import com.gxlu.common.web.webwork.action.AjaxXMLAction;
import com.opensymphony.webwork.ServletActionContext;
import com.opensymphony.xwork.Action;
import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.interceptor.Interceptor;
/**
?* Interceptor to handle Exceptions thrown by Actions.
?* <p>
?* <a href="ExceptionHandlerInterceptor.java.html"> <i>View Source </i> </a>
?* </p>
?*?
?*/
public class ExceptionInterceptor implements Interceptor {
?public static final String EXCEPTION = "exception";
?protected final Log logger = LogFactory.getLog(getClass());
?private Map exceptionMappings;
?/**
? * Set the mappings between exception class names and result names.
? *
? * @param mappings
? *??????? fully qualified exception class names as keys, and result names as
? *??????? values
? */
?public void setExceptionMappings(Properties mappings) throws ClassNotFoundException {
??this.exceptionMappings = new HashMap();
??for (Iterator it = mappings.keySet().iterator(); it.hasNext();) {
???String exceptionClassName = (String) it.next();
???String viewName = mappings.getProperty(exceptionClassName);
???Class exceptionClass = Class.forName(exceptionClassName, true, Thread.currentThread().getContextClassLoader());
???this.exceptionMappings.put(exceptionClass, viewName);
??}
?}
?/**
? * Invoke action and if an exception occurs, route it to the mapped result.
? */
?public String intercept(ActionInvocation invocation) throws Exception {
??String result = null;
??try {
???result = invocation.invoke();
??} catch (Throwable e) {
???logger.error(e);
???//
???result = EXCEPTION;
???//
???StringWriter writer = new StringWriter();
???e.printStackTrace(new java.io.PrintWriter(writer));
???ServletActionContext.getRequest().setAttribute("_exception_stack_trace_", writer.toString());
???ServletActionContext.getRequest().setAttribute("_exception_message_", e.getMessage());
???writer = null;
???Action action = invocation.getAction();
???if(action instanceof AjaxJSONAction) {????
????return "exception.json";
???} else if(action instanceof AjaxXMLAction) {
????return "exception.xml";
???} else if(action instanceof AjaxUpdaterAction) {
????return "exception.updater";
???}
???/**
??? * // check for specific mappings if (this.exceptionMappings !=
??? * null) { for (Iterator it =
??? * this.exceptionMappings.keySet().iterator(); it.hasNext();) {
??? * Class exceptionClass = (Class) it.next(); if
??? * (exceptionClass.isInstance(ex)) { result = (String)
??? * this.exceptionMappings.get(exceptionClass); } } } if (null ==
??? * result || "".equals(result)) { result = EXCEPTION; }
??? */
??}
??return result;
?}
?public void destroy() {
?}
?public void init() {
?}
}