// $HeadURL$ // $Id$ // Copyright © 2006, 2010, 2011, 2012 by the President and Fellows of Harvard College. // Screensaver is an open-source project developed by the ICCB-L and NSRB labs // at Harvard Medical School. This software is distributed under the terms of // the GNU General Public License. package edu.harvard.med.screensaver.ui; import java.util.ArrayList; import java.util.List; import javax.faces.model.DataModel; import javax.faces.model.ListDataModel; import javax.servlet.ServletException; import edu.harvard.med.screensaver.ui.arch.view.AbstractBackingBean; import edu.harvard.med.screensaver.util.Pair; /** * Backing bean for view that displays error message, when an unexpected error * occurs, and provides some continuation options for users. For developers, * shows formatted stack traces for exception chain. * * @author <a mailto="andrew_tolopko@hms.harvard.edu">Andrew Tolopko</a> * @author <a mailto="john_sullivan@hms.harvard.edu">John Sullivan</a> */ public class ExceptionReporter extends AbstractBackingBean { public static final String EXCEPTION_SESSION_PARAM = "javax.servlet.error.exception"; private Menu _menu; public void setMenu(Menu menuController) { _menu = menuController; } public String loginAgain() { return _menu.logout(); } public DataModel getThrowablesDataModel() { return new ListDataModel(getStackTrace()); } private List<ExceptionInfo> getStackTrace() { List<ExceptionInfo> throwables = new ArrayList<ExceptionInfo>(); Throwable t = (Throwable) getHttpSession().getAttribute(EXCEPTION_SESSION_PARAM); while (t != null) { throwables.add(new ExceptionInfo(t)); if (t instanceof ServletException) { t = ((ServletException) t).getRootCause(); } else { t = t.getCause(); } } return throwables; } public static class ExceptionInfo { private String nameAndMessage; private DataModel stackTrace; public ExceptionInfo(Throwable t) { nameAndMessage = t.getClass().getName() + ": " + t.getMessage(); List<Pair<Boolean,String>> lines = new ArrayList<Pair<Boolean,String>>(); for (StackTraceElement e : t.getStackTrace()) { lines.add(new Pair<Boolean,String>(e.getClassName().indexOf("edu.harvard") != -1, e.toString())); } stackTrace = new ListDataModel(lines); } public String getNameAndMessage() { return nameAndMessage; } public DataModel getStackTraceDataModel() { return stackTrace; } } }