msg.setDomReplaceable(false);
Version v = (Version) CoreSpringFactory.getBean("org.olat.core.Version");
msg.contextPut("buildversion", v.getVersion());
OLATRuntimeException o3e;
if (th == null){
o3e = new OLATRuntimeException("Error Screen with a Throwable == null", null);
} else if (!(th instanceof OLATRuntimeException)) {
o3e = new OLATRuntimeException(th.getMessage(), th);
} else {
o3e = (OLATRuntimeException) th;
}
String detailedmessage = null;
// translate user message if available
if (o3e.getUsrMsgKey() != null && o3e.getUsrMsgPackage() != null) {
PackageTranslator usrMsgTrans = new PackageTranslator(o3e.getUsrMsgPackage(), ureq.getLocale());
if (o3e.getUsrMsgArgs() == null) {
detailedmessage = usrMsgTrans.translate(o3e.getUsrMsgKey());
} else {
detailedmessage = usrMsgTrans.translate(o3e.getUsrMsgKey(), o3e.getUsrMsgArgs());
}
}
// fix detailed message
if (detailedmessage == null) {
if (o3e instanceof StaleObjectRuntimeException) {
StaleObjectRuntimeException soe = (StaleObjectRuntimeException) o3e;
detailedmessage = trans.translate("error.staleobjectexception") + "<br />(" + soe.getKey() + " : " + soe.getPersClassName() + ")";
}
else detailedmessage = "-";
}
// fetch more info
// get the latest window which caused this exception
String componentListenerInfo = "";
Windows ws = Windows.getWindows(ureq);
Window window = ws.getWindow(ureq);
if (window != null) {
Component target = window.getAndClearLatestDispatchedComponent();
if (target != null) {
// there was a component id given, and a matching target could be found
componentListenerInfo = "<dispatchinfo>\n\t<componentinfo>\n\t\t<compname>" + target.getComponentName() + "</compname>\n\t\t<compclass>"
+ target.getClass().getName() + "</compclass>\n\t\t<extendedinfo>" + target.getExtendedDebugInfo()
+ "</extendedinfo>\n\t\t<event>";
Event latestEv = target.getAndClearLatestFiredEvent();
if (latestEv != null) {
componentListenerInfo += "\n\t\t\t<class>"+latestEv.getClass().getName()+"</class>\n\t\t\t<command>"+latestEv.getCommand()+"</command>\n\t\t\t<tostring>"+latestEv+"</tostring>";
}
componentListenerInfo += "\n\t\t</event>\n\t</componentinfo>\n\t<controllerinfo>";
Controller c = target.getLatestDispatchedController();
if (c != null) {
// can be null if the error occured in the component itself
// componentListenerInfo += c.toString();
//WindowControl control = c.getWindowControl();
// sorry, getting windowcontrol on a controller which does not have one (all should have one, legacy) throws an exception
try {
WindowControlInfo wci = c.getWindowControlForDebug().getWindowControlInfo();
while (wci != null) {
String cName = wci.getControllerClassName();
componentListenerInfo += "\n\t\t<controllername>" + cName + "</controllername>";
wci = wci.getParentWindowControlInfo();
}
} catch (Exception e) {
componentListenerInfo += "no info, probably no windowcontrol set: "+e.getClass().getName()+", "+e.getMessage();
}
}
componentListenerInfo += "\n\t</controllerinfo>\n</dispatchinfo>";
}
}
if(o3e instanceof KnownIssueException){
KnownIssueException kie = (KnownIssueException)o3e;
msg.contextPut("knownissuelink", kie.getJiraLink());
}
// TODO: DB.getInstance().hasTransaction() TODO: log db transaction id if in
// transaction
long refNum = Tracing.logError("**RedScreen** "+o3e.getLogMsg() + " ::_::" + componentListenerInfo + " ::_::", o3e, o3e.getThrowingClazz());
// only if debug
if (Settings.isDebuging()) {
msg.contextPut("debug", Boolean.TRUE);
} else {
msg.contextPut("debug", Boolean.FALSE);