summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2008-05-17 18:27:44 +0000
committerPaul Buetow <paul@buetow.org>2008-05-17 18:27:44 +0000
commitc4fe31d41aa6c2ae75ba77a84c86c2c959d1cc7a (patch)
tree3bf57e1223d6d891b80ba741152ec9c8868a3eca
parent9157da2144f3f405875c4b3cf82280e3fe2f199e (diff)
Logging filter works!
-rw-r--r--sources/prefs/VSDefaultPrefs.java2
-rw-r--r--sources/simulator/VSLogging.java97
-rw-r--r--sources/simulator/VSSimulation.java74
-rw-r--r--sources/simulator/VSSimulationPanel.java17
4 files changed, 153 insertions, 37 deletions
diff --git a/sources/prefs/VSDefaultPrefs.java b/sources/prefs/VSDefaultPrefs.java
index 9f1d4cf..476d669 100644
--- a/sources/prefs/VSDefaultPrefs.java
+++ b/sources/prefs/VSDefaultPrefs.java
@@ -44,6 +44,7 @@ public class VSDefaultPrefs extends VSPrefs {
initString("lang.time.lamport", "Lamportzeit");
initString("lang.message.sent", "Nachricht versendet");
initString("lang.logging.active", "Logging");
+ initString("lang.logging.clear", "Loggs löschen");
initString("lang.message", "Nachricht");
initString("lang.message.recv", "Nachricht erhalten");
initString("lang.about", "About");
@@ -55,6 +56,7 @@ public class VSDefaultPrefs extends VSPrefs {
initString("lang.colorchooser2", "Bitte Farbe auswählen");
initString("lang.default", "Defaults");
initString("lang.remove", "Entfernen");
+ initString("lang.filter", "Filter");
initString("lang.edit", "Editieren");
initString("lang.editor", "Editor");
initString("lang.activate", "aktivieren");
diff --git a/sources/simulator/VSLogging.java b/sources/simulator/VSLogging.java
index c65198b..3683c3a 100644
--- a/sources/simulator/VSLogging.java
+++ b/sources/simulator/VSLogging.java
@@ -1,20 +1,27 @@
package simulator;
-import javax.swing.*;
import java.util.*;
+import java.util.regex.*;
+import javax.swing.*;
import utils.*;
public class VSLogging {
private JTextArea loggingArea;
+ private String filterText;
+ private ArrayList<StringBuffer> pauseLines;
+ private ArrayList<StringBuffer> loggingLines;
private VSSimulationPanel simulationPanel;
- private volatile boolean isPaused;
- private StringBuffer pauseBuffer;
+ private boolean isFiltered;
+ private boolean isPaused;
+ private Pattern filterPattern;
public VSLogging() {
loggingArea = new JTextArea(0, 0);
loggingArea.setEditable(false);
- pauseBuffer = new StringBuffer();
+ loggingLines = new ArrayList<StringBuffer>();
+ pauseLines = new ArrayList<StringBuffer>();
+ filterText = "";
}
public void setSimulationPanel(VSSimulationPanel simulationPanel) {
@@ -32,26 +39,88 @@ public class VSLogging {
logg(message, simulationPanel.getTime());
}
- public void logg(String message, long time) {
+ public synchronized void logg(String message, long time) {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append(VSTools.getTimeString(time));
+ buffer.append(": ");
+ buffer.append(message);
+
if (isPaused) {
- pauseBuffer.append(VSTools.getTimeString(time));
- pauseBuffer.append(": ");
- pauseBuffer.append(message);
- pauseBuffer.append("\n");
+ pauseLines.add(buffer);
+ loggingLines.add(buffer);
+ loggingArea.append(buffer.toString()+"\n");
+ loggingArea.setCaretPosition(loggingArea.getDocument().getLength());
} else {
- loggingArea.append(VSTools.getTimeString(time) + ": " + message + "\n");
- loggingArea.setCaretPosition(loggingArea.getDocument().getLength());
+ loggFiltered(buffer);
}
}
- public void isPaused(boolean isPaused) {
+ public synchronized void isPaused(boolean isPaused) {
this.isPaused = isPaused;
if (!isPaused) {
- loggingArea.append(pauseBuffer.toString());
+ for (StringBuffer buffer : pauseLines)
+ loggFiltered(buffer);
+
+ pauseLines.clear();
+ }
+ }
+
+ private void loggFiltered(StringBuffer buffer) {
+ loggingLines.add(buffer);
+ if (!isFiltered) {
+ loggingArea.append(buffer.toString()+"\n");
loggingArea.setCaretPosition(loggingArea.getDocument().getLength());
- pauseBuffer.delete(0, pauseBuffer.length());
+
+ } else if (filterPattern != null && filterPattern.matcher(buffer).find()) {
+ loggingArea.append(buffer.toString()+"\n");
+ loggingArea.setCaretPosition(loggingArea.getDocument().getLength());
+ }
+ }
+
+ public synchronized void isFiltered(boolean isFiltered) {
+ this.isFiltered = isFiltered;
+
+ if (!isFiltered)
+ setFilterText("");
+ else
+ filter();
+ }
+
+ public synchronized void setFilterText(String filterText) {
+ this.filterText = filterText;
+ filter();
+ }
+
+ public synchronized void clear() {
+ loggingLines.clear();
+ pauseLines.clear();
+ loggingArea.setText("");
+ }
+
+ private void filter() {
+ try {
+ filterPattern = Pattern.compile(filterText);
+ StringBuffer buffer = new StringBuffer();
+
+ for (StringBuffer line : loggingLines) {
+ if (isFiltered) {
+ Matcher matcher = filterPattern.matcher(line);
+ if (matcher.find()) {
+ buffer.append(line);
+ buffer.append("\n");
+ }
+ } else {
+ buffer.append(line);
+ buffer.append("\n");
+ }
+ }
+ loggingArea.setText(buffer.toString());
+
+ } catch (Exception e) {
+ filterPattern = null;
+ loggingArea.setText("");
}
}
}
diff --git a/sources/simulator/VSSimulation.java b/sources/simulator/VSSimulation.java
index 89ffd7c..2c6de8c 100644
--- a/sources/simulator/VSSimulation.java
+++ b/sources/simulator/VSSimulation.java
@@ -11,20 +11,22 @@ import core.*;
import utils.*;
public class VSSimulation extends VSFrame implements ActionListener {
+ private JTextField filterTextField;
+ private JCheckBox filterActiveCheckBox;
+ private JCheckBox lamportActiveCheckBox;
+ private JCheckBox vectorTimeActiveCheckBox;
private JMenuItem pauseItem;
private JMenuItem replayItem;
private JMenuItem resetItem;
private JMenuItem startItem;
+ private JPanel processEditPanel;
private JSplitPane splitPaneH;
private JSplitPane splitPaneV;
- private JPanel processEditPanel;
- private VSSimulationPanel simulationPanel;
private Thread thread;
+ private VSLogging logging;
private VSPrefs prefs;
+ private VSSimulationPanel simulationPanel;
private boolean hasStarted = false;
- private VSLogging logging;
- private JCheckBox lamportActiveCheckBox;
- private JCheckBox vectorTimeActiveCheckBox;
public VSSimulation (VSPrefs prefs, Component relativeTo) {
super(prefs.getString("name"), relativeTo);
@@ -184,16 +186,6 @@ public class VSSimulation extends VSFrame implements ActionListener {
JPanel toolsPanel = new JPanel();
toolsPanel.setLayout(new BoxLayout(toolsPanel, BoxLayout.X_AXIS));
- JCheckBox loggingActiveCheckBox = new JCheckBox(prefs.getString("lang.logging.active"));
- loggingActiveCheckBox.setSelected(true);
- loggingActiveCheckBox.addChangeListener(new ChangeListener() {
- public void stateChanged(ChangeEvent ce) {
- AbstractButton abstractButton = (AbstractButton) ce.getSource();
- ButtonModel buttonModel = abstractButton.getModel();
- logging.isPaused(!buttonModel.isSelected());
- }
- });
- toolsPanel.add(loggingActiveCheckBox);
lamportActiveCheckBox = new JCheckBox(prefs.getString("lang.time.lamport"));
lamportActiveCheckBox.setSelected(false);
@@ -221,6 +213,58 @@ public class VSSimulation extends VSFrame implements ActionListener {
});
toolsPanel.add(vectorTimeActiveCheckBox);
+ JCheckBox loggingActiveCheckBox = new JCheckBox(prefs.getString("lang.logging.active"));
+ loggingActiveCheckBox.setSelected(true);
+ loggingActiveCheckBox.addChangeListener(new ChangeListener() {
+ public void stateChanged(ChangeEvent ce) {
+ AbstractButton abstractButton = (AbstractButton) ce.getSource();
+ ButtonModel buttonModel = abstractButton.getModel();
+ logging.isPaused(!buttonModel.isSelected());
+ }
+ });
+ toolsPanel.add(loggingActiveCheckBox);
+
+ filterActiveCheckBox = new JCheckBox(prefs.getString("lang.filter"));
+ filterActiveCheckBox.setSelected(false);
+ filterActiveCheckBox.addChangeListener(new ChangeListener() {
+ public void stateChanged(ChangeEvent ce) {
+ AbstractButton abstractButton = (AbstractButton) ce.getSource();
+ ButtonModel buttonModel = abstractButton.getModel();
+ logging.isFiltered(buttonModel.isSelected());
+ if (buttonModel.isSelected())
+ logging.setFilterText(filterTextField.getText());
+ }
+ });
+ toolsPanel.add(filterActiveCheckBox);
+
+ filterTextField = new JTextField();
+ filterTextField.getDocument().addDocumentListener(new DocumentListener() {
+ public void insertUpdate(DocumentEvent de) {
+ logging.setFilterText(filterTextField.getText());
+ }
+
+ public void removeUpdate(DocumentEvent de) {
+ logging.setFilterText(filterTextField.getText());
+ }
+
+ public void changedUpdate(DocumentEvent de) {
+ logging.setFilterText(filterTextField.getText());
+ }
+ });
+ toolsPanel.add(filterTextField);
+
+ JButton clearButton = new JButton(prefs.getString("lang.logging.clear"));
+ clearButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent ae) {
+ String actionCommand = ae.getActionCommand();
+
+ if (actionCommand.equals(prefs.getString("lang.logging.clear"))) {
+ logging.clear();
+ }
+ }
+ });
+ toolsPanel.add(clearButton);
+
return toolsPanel;
}
diff --git a/sources/simulator/VSSimulationPanel.java b/sources/simulator/VSSimulationPanel.java
index 07b5287..4159b5e 100644
--- a/sources/simulator/VSSimulationPanel.java
+++ b/sources/simulator/VSSimulationPanel.java
@@ -545,6 +545,7 @@ public class VSSimulationPanel extends JPanel implements Runnable, MouseMotionLi
messageLines.clear();
}
repaint();
+ logging.clear();
}
}
@@ -574,11 +575,11 @@ public class VSSimulationPanel extends JPanel implements Runnable, MouseMotionLi
for (VSProcess receiverProcess : processes) {
if (receiverProcess.equals(sendingProcess)) {
- if (recvOwn) {
- deliverTime = sendingProcess.getGlobalTime();
- task = new VSTask(deliverTime, receiverProcess, message);
- taskManager.addTask(task);
- }
+ if (recvOwn) {
+ deliverTime = sendingProcess.getGlobalTime();
+ task = new VSTask(deliverTime, receiverProcess, message);
+ taskManager.addTask(task);
+ }
} else {
durationTime = sendingProcess.getDurationTime();
@@ -593,9 +594,9 @@ public class VSSimulationPanel extends JPanel implements Runnable, MouseMotionLi
synchronized (messageLines) {
messageLines.add(
- new VSMessageLine(receiverProcess, sendingProcess.getGlobalTime(),
- deliverTime, outageTime, sendingProcess.getProcessID(),
- receiverProcess.getProcessID()));
+ new VSMessageLine(receiverProcess, sendingProcess.getGlobalTime(),
+ deliverTime, outageTime, sendingProcess.getProcessID(),
+ receiverProcess.getProcessID()));
}
}
}