Functionality that overwrite standard error message with trace to user friendly message with error number stored in DB.
Not yet completed some stuff with trx...
Please review this.
DB table:
CREATE TABLE stored_error_msg
(
id number PRIMARY KEY
,msg VARCHAR2(2000)
,trace CLOB
,browser VARCHAR2(2000)
,date date
,user VARCHAR2(100)
,ses_id number
);
@ UI
this.getCurrent().setErrorHandler(new StoredErrorWriter());
StoredErrorWriter
package components;
import java.io.PrintWriter;
import java.io.StringWriter;
import com.vaadin.server.DefaultErrorHandler;
import com.vaadin.server.ErrorEvent;
import com.vaadin.server.ErrorHandler;
import com.vaadin.server.ErrorMessage;
import com.vaadin.server.UserError;
import com.vaadin.server.WebBrowser;
import com.vaadin.ui.AbstractComponent;
import com.vaadin.ui.UI;
import java.util.logging.Level;
import java.util.logging.Logger;
/*
* @author: Kristaps Zukovskis
* Write info about: user, date, err_msg, backtrace, browser info, ses_id
* @ DB table stored_error_msg
*/
public class StoredErrorWriter implements ErrorHandler {
private static final long serialVersionUID = 5117130906083582416L;
public static String ERROR_MSG = "System error! Error number in journal :";
private Logger logger = Logger.getAnonymousLogger();
@Override
public void error(ErrorEvent event) {
Throwable t = event.getThrowable();
if (t != null) {
String trace = getTrace(t);
final String msg = t.getMessage();
AbstractComponent component = DefaultErrorHandler
.findAbstractComponent(event);
if (component != null) {
final Integer errorNumber = InsertTrace(msg,trace);
ErrorMessage errorMessage = new UserError(ERROR_MSG
+ errorNumber);
if (errorMessage != null) {
component.setComponentError(errorMessage);
logger.log(Level.SEVERE, trace);
return;
}
}
}
DefaultErrorHandler.doDefault(event);
}
private static String getTrace(Throwable t) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
t.printStackTrace(pw);
return sw.toString();
}
public static String getInfo() {
@SuppressWarnings("deprecation")
WebBrowser browser = UI.getCurrent().getSession().getBrowser();
String browserName = "unknown";
if (browser.isOpera())
browserName = "Opera";
else if (browser.isSafari())
browserName = "Apple Safari";
else if (browser.isChrome())
browserName = "Google Chrome";
else if (browser.isIE())
browserName = "Internet Explorer";
else if (browser.isFirefox())
browserName = "Mozilla Firefox";
String screenSize = " Screen Size: " + browser.getScreenWidth() + "x"
+ browser.getScreenHeight();
String version = String.valueOf(browser.getBrowserMajorVersion());
return browserName + " " + version + screenSize;
}
public static Integer InsertTrace(String msg, String trace) {
final String browser = getInfo();
final String user = null;// TODO
Integer id = getSeq();
java.util.Date utilDate = new java.util.Date();
java.sql.Date date = new java.sql.Date(utilDate.getTime());
// TODO ses_id
// TODO trx
System.out.println("==id == " + id + " msg " + msg + " trace "+ trace +" browser"
+ browser + " Date " + date);
return id;
}
public static Integer getSeq() {
Integer id =1;
String v_sql = "SELECT err_seq.NEXTVAL FROM DUAL";
// TODO trx
return id;
}
}
// Edit
package components;
import java.io.PrintWriter;
import java.io.StringWriter;
import com.vaadin.server.DefaultErrorHandler;
import com.vaadin.server.ErrorEvent;
import com.vaadin.server.ErrorHandler;
import com.vaadin.server.ErrorMessage;
import com.vaadin.server.UserError;
import com.vaadin.server.WebBrowser;
import com.vaadin.ui.AbstractComponent;
import com.vaadin.ui.UI;
import java.sql.SQLException;
import java.util.logging.Logger;
/*
* @author: Kristaps Zukovskis
* Write info about: user, date, err_msg, backtrace, browser info, ses_id
* @ DB table stored_error_msg
*/
public class StoredErrorWriter implements ErrorHandler {
private static final long serialVersionUID = 5117130906083582416L;
public static String ERROR_MSG = "System error! Error number in journal :";
private Logger logger = Logger.getAnonymousLogger();
@Override
public void error(ErrorEvent event) {
Throwable throwable = event.getThrowable();
if (throwable == null) {
DefaultErrorHandler.doDefault(event);
return;
}
if (StoredErrorWriter.getException(throwable)) {
DefaultErrorHandler.doDefault(event);
return;
}
AbstractComponent component = DefaultErrorHandler
.findAbstractComponent(event);
if (component == null) {
DefaultErrorHandler.doDefault(event);
return;
}
final String trace = StoredErrorWriter.getTrace(throwable);
final String msg = throwable.getMessage();
final Integer errorNumber = insertTrace(msg, trace);
ErrorMessage errorMessage = new UserError(ERROR_MSG + errorNumber);
component.setComponentError(errorMessage);
logger.severe(trace);
}
private static String getTrace(Throwable t) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
t.printStackTrace(pw);
return sw.toString();
}
public static String getInfo() {
@SuppressWarnings("deprecation")
WebBrowser browser = UI.getCurrent().getSession().getBrowser();
String browserName = "unknown";
if (browser.isOpera())
browserName = "Opera";
else if (browser.isSafari())
browserName = "Apple Safari";
else if (browser.isChrome())
browserName = "Google Chrome";
else if (browser.isIE())
browserName = "Internet Explorer";
else if (browser.isFirefox())
browserName = "Mozilla Firefox";
String screenSize = " Screen Size: " + browser.getScreenWidth() + "x"
+ browser.getScreenHeight();
String version = String.valueOf(browser.getBrowserMajorVersion());
return browserName + " " + version + screenSize;
}
public static Integer insertTrace(String msg, String trace) {
final String browser = getInfo();
final String user = null;// TODO
final Integer id = getSeq();
java.util.Date utilDate = new java.util.Date();
java.sql.Date date = new java.sql.Date(utilDate.getTime());
// TODO ses_id
// TODO trx
System.out.println("==id == " + id + " msg " + msg + " trace " + trace
+ " browser" + browser + " Date " + date);
return id;
}
public static Integer getSeq() {
final Integer id = 1;
String v_sql = "SELECT SETTINGS.err_seq.NEXTVAL FROM DUAL";
// TODO trx
return id;
}
private static Boolean getException(Throwable t) {
Boolean error = true;
IllegalArgumentException exception = getCauseOfType(t,
IllegalArgumentException.class);
if (exception != null) {
error = false;
}
SQLException sqlException = getCauseOfType(t, SQLException.class);
if (sqlException != null) {
error = false;
}
//...
return error;
}
@SuppressWarnings("unchecked")
private static <T extends Throwable> T getCauseOfType(Throwable th,
Class<T> type) {
while (th != null) {
if (type.isAssignableFrom(th.getClass())) {
return (T) th;
} else {
th = th.getCause();
}
}
return null;
}
}