Viewing Issue Advanced Details

ID 0002720 Category [DMDirc] *Unsorted Severity minor
Reproducibility always Date Submitted 2009-07-04 14:24 Last Update 2009-11-05 17:56
Reporter Greboid Assigned To Greboid View Status public
Priority normal Status closed Resolution fixed
Platform Fixed in Version Target Version 0.6.3m2
Product Version Product Build
Summary 0002720: Option to ignore duplicate errors or add a duplicate error count
Description
Option to ignore duplicate errors or add a duplicate error count
Needs unit test no
Upstream Bug URL

Relationships

Notes

authorGregory Holmes <greg@dmdirc.com>2009-07-05 12:12:00 (GMT)
commit0c8b8cb1334b6463d6375a472708b4449d0433ec (patch) (side-by-side diff)
-rw-r--r--src/com/dmdirc/addons/ui_swing/dialogs/error/ErrorDetailPanel.java5
-rw-r--r--src/com/dmdirc/addons/ui_swing/dialogs/error/ErrorTable.java5
-rw-r--r--src/com/dmdirc/addons/ui_swing/dialogs/error/ErrorTableModel.java9
-rw-r--r--src/com/dmdirc/logger/ErrorManager.java28
-rw-r--r--src/com/dmdirc/logger/ProgramError.java71
5 files changed, 91 insertions, 27 deletions
Click to Expand/Collapse
diff src/com/dmdirc/addons/ui_swing/dialogs/error/ErrorDetailPanel.java
@@ -114,7 +114,7 @@ public final class ErrorDetailPanel extends JPanel implements ErrorListener {
errorStatus = new JTextField();
details = new JTextArea();
scrollPane = new JScrollPane(details);
-
+
id.setEditable(false);
date.setEditable(false);
level.setEditable(false);
@@ -144,7 +144,7 @@ public final class ErrorDetailPanel extends JPanel implements ErrorListener {
}
id.setText(String.valueOf(error.getID()));
- date.setText(error.getDate().toString());
+ date.setText(error.occurrencesString());
level.setText(error.getLevel().toString());
reportStatus.setText(error.getReportStatus().toString());
errorStatus.setText(error.getFixedStatus().toString());
@@ -206,6 +206,7 @@ public final class ErrorDetailPanel extends JPanel implements ErrorListener {
if (this.error != null && this.error.equals(error)) {
reportStatus.setText(error.getReportStatus().toString());
errorStatus.setText(error.getFixedStatus().toString());
+ date.setText(this.error.occurrencesString());
}
}
Click to Expand/Collapse
diff src/com/dmdirc/addons/ui_swing/dialogs/error/ErrorTable.java
@@ -24,9 +24,8 @@
package com.dmdirc.addons.ui_swing.dialogs.error;
import com.dmdirc.addons.ui_swing.components.PackingTable;
-
-import com.dmdirc.addons.ui_swing.components.renderers.DateCellRenderer;
import com.dmdirc.addons.ui_swing.components.renderers.ErrorLevelIconCellRenderer;
+
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.table.TableCellRenderer;
@@ -65,8 +64,6 @@ public class ErrorTable extends PackingTable {
public TableCellRenderer getCellRenderer(final int row,
final int column) {
switch (column) {
- case 1:
- return new DateCellRenderer();
case 2:
return new ErrorLevelIconCellRenderer();
default:
Click to Expand/Collapse
diff src/com/dmdirc/addons/ui_swing/dialogs/error/ErrorTableModel.java
@@ -29,7 +29,6 @@ import com.dmdirc.logger.ErrorManager;
import com.dmdirc.logger.ErrorReportStatus;
import com.dmdirc.logger.ProgramError;
-import java.util.Date;
import java.util.List;
import javax.swing.table.AbstractTableModel;
@@ -45,7 +44,7 @@ public final class ErrorTableModel extends AbstractTableModel implements
* structure is changed (or anything else that would prevent serialized
* objects being unserialized with the new class).
*/
- private static final long serialVersionUID = 1;
+ private static final long serialVersionUID = 2;
/** Data list. */
private final List<ProgramError> errors;
@@ -100,7 +99,7 @@ public final class ErrorTableModel extends AbstractTableModel implements
case 0:
return "ID";
case 1:
- return "Time";
+ return "Count";
case 2:
return "Severity";
case 3:
@@ -119,7 +118,7 @@ public final class ErrorTableModel extends AbstractTableModel implements
case 0:
return Integer.class;
case 1:
- return Date.class;
+ return Integer.class;
case 2:
return ErrorLevel.class;
case 3:
@@ -145,7 +144,7 @@ public final class ErrorTableModel extends AbstractTableModel implements
case 0:
return errors.get(rowIndex).getID();
case 1:
- return errors.get(rowIndex).getDate();
+ return errors.get(rowIndex).getCount();
case 2:
return errors.get(rowIndex).getLevel();
case 3:
Click to Expand/Collapse
diff src/com/dmdirc/logger/ErrorManager.java
@@ -160,10 +160,8 @@ public final class ErrorManager implements Serializable, ConfigChangeListener {
final String[] details, final boolean appError, final boolean canReport) {
final ProgramError error = getError(level, message, details, appError);
- if (addError(error) && canReport) {
- error.setReportStatus(ErrorReportStatus.NOT_APPLICABLE);
- error.setFixedStatus(ErrorFixedStatus.DUPLICATE);
- } else if (!canReport || (appError && !error.isValidSource())) {
+ final boolean dupe = addError(error);
+ if (!canReport || (appError && !error.isValidSource())) {
error.setReportStatus(ErrorReportStatus.NOT_APPLICABLE);
error.setFixedStatus(ErrorFixedStatus.INVALID);
} else if (!appError) {
@@ -177,10 +175,12 @@ public final class ErrorManager implements Serializable, ConfigChangeListener {
error.save();
}
- if (level == ErrorLevel.FATAL) {
- fireFatalError(error);
- } else {
- fireErrorAdded(error);
+ if (!dupe) {
+ if (level == ErrorLevel.FATAL) {
+ fireFatalError(error);
+ } else {
+ fireErrorAdded(error);
+ }
}
}
@@ -193,14 +193,18 @@ public final class ErrorManager implements Serializable, ConfigChangeListener {
* otherwise
*/
protected boolean addError(final ProgramError error) {
- boolean res = false;
+ int index;
synchronized (errors) {
- res = errors.contains(error);
- errors.add(error);
+ index = errors.indexOf(error);
+ if (index == -1) {
+ errors.add(error);
+ } else {
+ errors.get(index).updateLastDate();
+ }
}
- return res;
+ return index > -1;
}
/**
Click to Expand/Collapse
diff src/com/dmdirc/logger/ProgramError.java
@@ -33,6 +33,8 @@ import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Serializable;
import java.net.MalformedURLException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
@@ -40,6 +42,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Semaphore;
+import java.util.concurrent.atomic.AtomicInteger;
/**
* Stores a program error.
@@ -71,8 +74,14 @@ public final class ProgramError implements Serializable {
/** Error trace. */
private final String[] trace;
- /** Date/time error occurred. */
- private final Date date;
+ /** Date/time error first occurred. */
+ private final Date firstDate;
+
+ /** Date/time error last occurred. */
+ private Date lastDate;
+
+ /** Number of occurrences. */
+ private AtomicInteger count;
/** Error report Status. */
private ErrorReportStatus reportStatus;
@@ -116,7 +125,9 @@ public final class ProgramError implements Serializable {
this.level = level;
this.message = message;
this.trace = Arrays.copyOf(trace, trace.length);
- this.date = (Date) date.clone();
+ this.firstDate = (Date) date.clone();
+ this.lastDate = (Date) date.clone();
+ this.count = new AtomicInteger(1);
this.reportStatus = ErrorReportStatus.WAITING;
this.fixedStatus = ErrorFixedStatus.UNKNOWN;
}
@@ -154,7 +165,25 @@ public final class ProgramError implements Serializable {
* @return Error time
*/
public Date getDate() {
- return (Date) date.clone();
+ return (Date) firstDate.clone();
+ }
+
+ /**
+ * Returns the number of times this error has occurred.
+ *
+ * @return Error count
+ */
+ public int getCount() {
+ return count.get();
+ }
+
+ /**
+ * Returns the last time this error occurred.
+ *
+ * @return Last occurrence
+ */
+ public Date getLastDate() {
+ return (Date) lastDate.clone();
}
/**
@@ -376,6 +405,40 @@ public final class ProgramError implements Serializable {
return trace[0];
}
+
+ /**
+ * Updates the last date this error occurred.
+ */
+ public void updateLastDate() {
+ updateLastDate(new Date());
+ }
+
+ /**
+ * Updates the last date this error occurred.
+ *
+ * @param date Date error occurred
+ */
+ public void updateLastDate(final Date date) {
+ lastDate = date;
+ count.getAndIncrement();
+ ErrorManager.getErrorManager().fireErrorStatusChanged(this);
+
+ synchronized (this) {
+ notifyAll();
+ }
+ }
+
+ /**
+ * Retruns a human readable string describing the number of times
+ * this error occurred and when these occurrences were.
+ *
+ * @return Occurrences description
+ */
+ public String occurrencesString() {
+ final DateFormat format = new SimpleDateFormat("MM/dd hh:mm aa");
+ return count.get() + " occurrences between " + format.format(getDate())
+ + " and " + format.format(getLastDate());
+ }
/** {@inheritDoc} */
@Override

Issue History

Date Modified Username Field Change
2009-07-04 14:24 Greboid New Issue
2009-07-04 14:24 Greboid Status new => assigned
2009-07-04 14:24 Greboid Assigned To => Greboid
2009-07-05 13:12 Greboid Checkin
2009-07-05 13:12 Greboid Note Added: 0007107
2009-07-05 13:12 Greboid Status assigned => resolved
2009-07-05 13:12 Greboid Resolution open => fixed
2009-11-05 17:56 Greboid Status resolved => closed