summaryrefslogtreecommitdiffstats
path: root/Essentials/src/com/earth2me/essentials/EssentialsErrorHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'Essentials/src/com/earth2me/essentials/EssentialsErrorHandler.java')
-rw-r--r--Essentials/src/com/earth2me/essentials/EssentialsErrorHandler.java121
1 files changed, 121 insertions, 0 deletions
diff --git a/Essentials/src/com/earth2me/essentials/EssentialsErrorHandler.java b/Essentials/src/com/earth2me/essentials/EssentialsErrorHandler.java
new file mode 100644
index 000000000..60512737b
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/EssentialsErrorHandler.java
@@ -0,0 +1,121 @@
+package com.earth2me.essentials;
+
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+
+
+class EssentialsErrorHandler extends Handler
+{
+ HashMap<BigInteger, String> errors = new HashMap<BigInteger, String>();
+ private final LinkedList<LogRecord> records = new LinkedList<LogRecord>();
+
+ public EssentialsErrorHandler()
+ {
+ }
+
+ @Override
+ public void publish(LogRecord lr)
+ {
+ if (lr.getThrown() == null || lr.getLevel().intValue() < Level.WARNING.intValue())
+ {
+ return;
+ }
+ synchronized (records)
+ {
+ records.add(lr);
+ }
+ }
+
+ @Override
+ public void flush()
+ {
+ synchronized (records)
+ {
+ sortRecords();
+ }
+ }
+
+ @Override
+ public void close() throws SecurityException
+ {
+ synchronized (records)
+ {
+ sortRecords();
+ }
+ }
+
+ private void sortRecords()
+ {
+ for (LogRecord lr : records)
+ {
+ try
+ {
+ if (lr.getThrown() == null)
+ {
+ return;
+ }
+ Throwable tr = lr.getThrown();
+ StackTraceElement[] elements = tr.getStackTrace();
+ if (elements == null || elements.length <= 0)
+ {
+ return;
+ }
+ boolean essentialsFound = false;
+ for (StackTraceElement stackTraceElement : elements)
+ {
+ if (stackTraceElement.getClassName().contains("com.earth2me.essentials"))
+ {
+ essentialsFound = true;
+ break;
+ }
+ }
+ if (essentialsFound == false && tr.getCause() != null)
+ {
+ Throwable cause = tr.getCause();
+ StackTraceElement[] elements2 = cause.getStackTrace();
+ if (elements2 != null)
+ {
+ for (StackTraceElement stackTraceElement : elements2)
+ {
+ if (stackTraceElement.getClassName().contains("com.earth2me.essentials"))
+ {
+ essentialsFound = true;
+ break;
+ }
+ }
+ }
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append("[").append(lr.getLevel().getName()).append("] ").append(lr.getMessage()).append("\n");
+ sb.append(tr.getMessage()).append("\n");
+ for (StackTraceElement stackTraceElement : tr.getStackTrace())
+ {
+ sb.append(stackTraceElement.toString()).append("\n");
+ }
+ if (tr.getCause() != null && tr.getCause().getStackTrace() != null)
+ {
+ sb.append(tr.getCause().getMessage()).append("\n");
+ for (StackTraceElement stackTraceElement : tr.getCause().getStackTrace())
+ {
+ sb.append(stackTraceElement.toString()).append("\n");
+ }
+ }
+ String errorReport = sb.toString();
+ byte[] bytesOfMessage = errorReport.getBytes("UTF-8");
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ BigInteger bi = new BigInteger(md.digest(bytesOfMessage));
+ errors.put(bi, errorReport);
+ }
+ catch (Throwable t)
+ {
+ //Ignore all exceptions inside the exception handler
+ }
+ }
+ records.clear();
+ }
+}