/** * OLAT - Online Learning and Training<br> * http://www.olat.org * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> * University of Zurich, Switzerland. */ package org.olat.core.logging; import org.olat.core.util.filter.FilterFactory; /** * Description:<br /> * Thrown if an unrecoverable error occurs. These Exceptions get caught by the Servlet. The user * will get an orange screen and a log message is recorded. * * @author Felix Jost */ public class OLATRuntimeException extends RuntimeException { private static final long serialVersionUID = -1627846608356883591L; private String logMsg; private String usrMsgKey; private String usrMsgPackage; private String[] usrMsgArgs; private Class<?> throwingClazz; /** * @param throwing class * @param usrMsgKey * @param usrMsgArgs * @param usrMsgPackage * @param logMsg * @param cause */ public OLATRuntimeException(Class<?> throwingClazz, String usrMsgKey, String[] usrMsgArgs, String usrMsgPackage, String logMsg, Throwable cause) { super(logMsg); this.throwingClazz = throwingClazz != null ? throwingClazz : OLATRuntimeException.class; this.usrMsgKey = usrMsgKey; this.usrMsgArgs = usrMsgArgs; this.usrMsgPackage = usrMsgPackage; this.logMsg = logMsg; if (cause == null) { cause = new Exception("olat_rtexception_stackgenerator"); } initCause(cause); } /** * @param usrMsgKey * @param usrMsgArgs * @param usrMsgPackage * @param logMsg * @param cause */ public OLATRuntimeException(String usrMsgKey, String[] usrMsgArgs, String usrMsgPackage, String logMsg, Throwable cause) { this (OLATRuntimeException.class, usrMsgKey, usrMsgArgs, usrMsgPackage, logMsg, cause); } /** * @param category * @param logMsg * @param cause */ public OLATRuntimeException(Class<?> throwingClazz, String logMsg, Throwable cause) { this (throwingClazz, null, null, null, logMsg, cause); } /** * @param logMsg * @param cause */ public OLATRuntimeException(String logMsg, Throwable cause) { this (OLATRuntimeException.class, null, null, null, logMsg, cause); } public OLATRuntimeException(String logMsg) { this (OLATRuntimeException.class, null, null, null, logMsg, null); } /** * Format throwable as HTML fragment. * @param th * @return HTML fragment. */ public static String throwableToHtml(Throwable th) { StringBuilder sb = new StringBuilder("<br />"); if (th == null) { sb.append("n/a"); } else { sb.append("Throwable: "+th.getClass().getName()+"<br /><br />"); toHtml(sb, th); // 1st cause: Throwable ca = th.getCause(); int i=1; while (ca != null) { sb.append("<hr /><br />"+i+". cause:<br /><br />"); toHtml(sb,ca); i++; ca = ca.getCause(); } } return FilterFactory.getXSSFilter(10000).filter(sb.toString()); } private static void toHtml(StringBuilder sb, Throwable th) { if (th instanceof OLATRuntimeException) { sb.append("logmsg:").append(((OLATRuntimeException)th).getLogMsg()).append("<br />"); } sb.append("message:" + th.getMessage() + "," +th.getClass().getName() + "<br /><br />"); StackTraceElement[] ste = th.getStackTrace(); int nr = ste.length < 10? ste.length: 10; for (int i = 0; i < nr; i++) { StackTraceElement st = ste[i]; sb.append("at "+ st.toString() + "<br />"); } } /** * @return the log message */ public String getLogMsg() { return logMsg; } public Class<?> getThrowingClazz() { return throwingClazz; } /** * @return String key of user message in the given package */ public String getUsrMsgKey() { return usrMsgKey; } /** * @return String package name where usr msg key is found */ public String getUsrMsgPackage() { return usrMsgPackage; } /** * @return String[] The translator arguments or null if none available */ public String[] getUsrMsgArgs() { return usrMsgArgs; } }