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() {
}
}