From 0891b4981b58b1defc9276e066614909846c7492 Mon Sep 17 00:00:00 2001 From: Nils Christian Ehmke <nils@rhocas.de> Date: Sat, 10 Oct 2015 13:30:52 +0200 Subject: [PATCH] #4 --- .../diagnosis/common/FilterUtility.java | 28 +++++++++++++ .../SettingsDialogViewController.java | 6 ++- .../AggregatedCallsViewController.java | 31 +++++--------- .../AggregatedTracesViewController.java | 31 ++++---------- .../subview/calls/CallsViewController.java | 42 ++++++------------- .../subview/traces/TracesViewController.java | 42 +++++-------------- .../diagnosis/model/PropertiesModel.java | 17 +++++++- .../settings/settingsdialogview.properties | 4 +- .../settings/settingsdialogview_de.properties | 4 +- .../dialog/settings/SettingsDialogView.fxml | 13 ++++++ 10 files changed, 106 insertions(+), 112 deletions(-) create mode 100644 src/main/java/kieker/diagnosis/common/FilterUtility.java diff --git a/src/main/java/kieker/diagnosis/common/FilterUtility.java b/src/main/java/kieker/diagnosis/common/FilterUtility.java new file mode 100644 index 00000000..a45f5cf7 --- /dev/null +++ b/src/main/java/kieker/diagnosis/common/FilterUtility.java @@ -0,0 +1,28 @@ +package kieker.diagnosis.common; + +import java.util.function.Function; +import java.util.function.Predicate; + +import javafx.scene.control.TextField; +import kieker.diagnosis.model.PropertiesModel; + +public final class FilterUtility { + + private FilterUtility() {} + + public static <T> Predicate<T> useFilter(final TextField filter, final Function<T, String> function) { + final String text = filter.getText(); + + if ((text == null) || text.isEmpty()) { + return (x -> true); + } else { + final boolean regularExpressionsActive = PropertiesModel.getInstance().isActivateRegularExpressions(); + if (regularExpressionsActive) { + return (x -> function.apply(x).matches(text)); + } else { + return (x -> function.apply(x).toLowerCase().contains(text.toLowerCase())); + } + } + } + +} diff --git a/src/main/java/kieker/diagnosis/mainview/dialog/settings/SettingsDialogViewController.java b/src/main/java/kieker/diagnosis/mainview/dialog/settings/SettingsDialogViewController.java index 0d9323fc..ad0343f5 100644 --- a/src/main/java/kieker/diagnosis/mainview/dialog/settings/SettingsDialogViewController.java +++ b/src/main/java/kieker/diagnosis/mainview/dialog/settings/SettingsDialogViewController.java @@ -39,12 +39,14 @@ public final class SettingsDialogViewController extends AbstractDialogController @FXML private ComboBox<ComponentNames> componentNames; @FXML private ComboBox<TimeUnit> timeunits; @FXML private ComboBox<Boolean> additionalLogChecks; + @FXML private ComboBox<Boolean> activateRegularExpressions; public void initialize() { this.timeunits.setItems(FXCollections.observableArrayList(SettingsDialogViewController.TIME_UNITS)); this.componentNames.setItems(FXCollections.observableArrayList(ComponentNames.values())); this.operationNames.setItems(FXCollections.observableArrayList(OperationNames.values())); this.additionalLogChecks.setItems(FXCollections.observableArrayList(Boolean.TRUE, Boolean.FALSE)); + this.activateRegularExpressions.setItems(FXCollections.observableArrayList(Boolean.TRUE, Boolean.FALSE)); this.loadSettings(); } @@ -59,13 +61,15 @@ public final class SettingsDialogViewController extends AbstractDialogController this.componentNames.getSelectionModel().select(this.propertiesModel.getComponentNames()); this.timeunits.getSelectionModel().select(this.propertiesModel.getTimeUnit()); this.additionalLogChecks.getSelectionModel().select(this.propertiesModel.isAdditionalLogChecks()); + this.activateRegularExpressions.getSelectionModel().select(this.propertiesModel.isActivateRegularExpressions()); } - + private void saveSettings() { this.propertiesModel.setOperationNames(this.operationNames.getSelectionModel().getSelectedItem()); this.propertiesModel.setComponentNames(this.componentNames.getSelectionModel().getSelectedItem()); this.propertiesModel.setTimeUnit(this.timeunits.getSelectionModel().getSelectedItem()); this.propertiesModel.setAdditionalLogChecks(this.additionalLogChecks.getSelectionModel().getSelectedItem()); + this.propertiesModel.setActivateRegularExpressions(this.activateRegularExpressions.getSelectionModel().getSelectedItem()); } } diff --git a/src/main/java/kieker/diagnosis/mainview/subview/aggregatedcalls/AggregatedCallsViewController.java b/src/main/java/kieker/diagnosis/mainview/subview/aggregatedcalls/AggregatedCallsViewController.java index a1f531ae..ae302c8d 100644 --- a/src/main/java/kieker/diagnosis/mainview/subview/aggregatedcalls/AggregatedCallsViewController.java +++ b/src/main/java/kieker/diagnosis/mainview/subview/aggregatedcalls/AggregatedCallsViewController.java @@ -19,6 +19,7 @@ package kieker.diagnosis.mainview.subview.aggregatedcalls; import java.util.Optional; import java.util.ResourceBundle; import java.util.function.Function; +import java.util.function.Predicate; import javafx.beans.binding.Bindings; import javafx.beans.binding.StringBinding; @@ -30,6 +31,7 @@ import javafx.fxml.FXML; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.input.MouseEvent; +import kieker.diagnosis.common.FilterUtility; import kieker.diagnosis.domain.AggregatedOperationCall; import kieker.diagnosis.mainview.subview.util.NameConverter; import kieker.diagnosis.model.DataModel; @@ -117,33 +119,20 @@ public final class AggregatedCallsViewController { } public void useContainerFilter() { - final String text = this.filterContainer.getText(); - - if ((text == null) || text.isEmpty()) { - this.sndFilteredData.setPredicate(null); - } else { - this.sndFilteredData.setPredicate(call -> call.getContainer().toLowerCase().contains(text.toLowerCase())); - } + final Predicate<AggregatedOperationCall> predicate = FilterUtility.useFilter(this.filterContainer, AggregatedOperationCall::getContainer); + this.sndFilteredData.setPredicate(predicate); } public void useComponentFilter() { - final String text = this.filterComponent.getText(); - - if ((text == null) || text.isEmpty()) { - this.thdFilteredData.setPredicate(null); - } else { - this.thdFilteredData.setPredicate(call -> call.getComponent().toLowerCase().contains(text.toLowerCase())); - } + final Predicate<AggregatedOperationCall> predicate = FilterUtility.useFilter(this.filterComponent, AggregatedOperationCall::getComponent); + this.thdFilteredData.setPredicate(predicate); } public void useOperationFilter() { - final String text = this.filterOperation.getText(); - - if ((text == null) || text.isEmpty()) { - this.fthFilteredData.setPredicate(null); - } else { - this.fthFilteredData.setPredicate(call -> call.getOperation().toLowerCase().contains(text.toLowerCase())); - } + final Predicate<AggregatedOperationCall> predicate = FilterUtility.useFilter(this.filterOperation, AggregatedOperationCall::getOperation); + this.fthFilteredData.setPredicate(predicate); } + + } diff --git a/src/main/java/kieker/diagnosis/mainview/subview/aggregatedtraces/AggregatedTracesViewController.java b/src/main/java/kieker/diagnosis/mainview/subview/aggregatedtraces/AggregatedTracesViewController.java index 2e394b5c..01aeee87 100644 --- a/src/main/java/kieker/diagnosis/mainview/subview/aggregatedtraces/AggregatedTracesViewController.java +++ b/src/main/java/kieker/diagnosis/mainview/subview/aggregatedtraces/AggregatedTracesViewController.java @@ -32,6 +32,7 @@ import javafx.scene.control.TextField; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeTableView; import javafx.scene.input.MouseEvent; +import kieker.diagnosis.common.FilterUtility; import kieker.diagnosis.domain.AggregatedOperationCall; import kieker.diagnosis.domain.AggregatedTrace; import kieker.diagnosis.mainview.subview.util.LazyOperationCallTreeItem; @@ -125,38 +126,20 @@ public final class AggregatedTracesViewController { } public void useContainerFilter() { - final String text = this.filterContainer.getText(); - - if ((text == null) || text.isEmpty()) { - this.sndPredicate = call -> true; - } else { - this.sndPredicate = call -> call.getContainer().toLowerCase().contains(text.toLowerCase()); - } - + final Predicate<AggregatedOperationCall> predicate = FilterUtility.useFilter(this.filterContainer, AggregatedOperationCall::getContainer); + this.sndPredicate = predicate; this.reloadTreetable(); } public void useComponentFilter() { - final String text = this.filterComponent.getText(); - - if ((text == null) || text.isEmpty()) { - this.thdPredicate = call -> true; - } else { - this.thdPredicate = call -> call.getComponent().toLowerCase().contains(text.toLowerCase()); - } - + final Predicate<AggregatedOperationCall> predicate = FilterUtility.useFilter(this.filterComponent, AggregatedOperationCall::getComponent); + this.thdPredicate = predicate; this.reloadTreetable(); } public void useOperationFilter() { - final String text = this.filterOperation.getText(); - - if ((text == null) || text.isEmpty()) { - this.fthPredicate = call -> true; - } else { - this.fthPredicate = call -> call.getOperation().toLowerCase().contains(text.toLowerCase()); - } - + final Predicate<AggregatedOperationCall> predicate = FilterUtility.useFilter(this.filterOperation, AggregatedOperationCall::getOperation); + this.fthPredicate = predicate; this.reloadTreetable(); } diff --git a/src/main/java/kieker/diagnosis/mainview/subview/calls/CallsViewController.java b/src/main/java/kieker/diagnosis/mainview/subview/calls/CallsViewController.java index 1bc684ed..7b31d986 100644 --- a/src/main/java/kieker/diagnosis/mainview/subview/calls/CallsViewController.java +++ b/src/main/java/kieker/diagnosis/mainview/subview/calls/CallsViewController.java @@ -19,6 +19,7 @@ package kieker.diagnosis.mainview.subview.calls; import java.util.Optional; import java.util.ResourceBundle; import java.util.function.Function; +import java.util.function.Predicate; import javafx.beans.binding.Bindings; import javafx.beans.binding.StringBinding; @@ -30,6 +31,7 @@ import javafx.fxml.FXML; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.input.MouseEvent; +import kieker.diagnosis.common.FilterUtility; import kieker.diagnosis.domain.OperationCall; import kieker.diagnosis.mainview.subview.util.NameConverter; import kieker.diagnosis.model.DataModel; @@ -114,43 +116,23 @@ public final class CallsViewController { } public void useContainerFilter() { - final String text = this.filterContainer.getText(); - - if ((text == null) || text.isEmpty()) { - this.sndFilteredData.setPredicate(null); - } else { - this.sndFilteredData.setPredicate(call -> call.getContainer().toLowerCase().contains(text.toLowerCase())); - } + final Predicate<OperationCall> predicate = FilterUtility.useFilter(this.filterContainer, OperationCall::getContainer); + this.sndFilteredData.setPredicate(predicate); } - public void useComponentFilter() { - final String text = this.filterComponent.getText(); - - if ((text == null) || text.isEmpty()) { - this.thdFilteredData.setPredicate(null); - } else { - this.thdFilteredData.setPredicate(call -> call.getComponent().toLowerCase().contains(text.toLowerCase())); - } + public void useComponentFilter() { + final Predicate<OperationCall> predicate = FilterUtility.useFilter(this.filterComponent, OperationCall::getComponent); + this.thdFilteredData.setPredicate(predicate); } public void useOperationFilter() { - final String text = this.filterOperation.getText(); - - if ((text == null) || text.isEmpty()) { - this.fthFilteredData.setPredicate(null); - } else { - this.fthFilteredData.setPredicate(call -> call.getOperation().toLowerCase().contains(text.toLowerCase())); - } + final Predicate<OperationCall> predicate = FilterUtility.useFilter(this.filterOperation, OperationCall::getOperation); + this.fthFilteredData.setPredicate(predicate); } public void useTraceIDFilter() { - final String text = this.filterTraceID.getText(); - - if ((text == null) || text.isEmpty()) { - this.fifFilteredData.setPredicate(null); - } else { - this.fifFilteredData.setPredicate(call -> Long.toString(call.getTraceID()).contains(text)); - } + final Function<OperationCall, String> function = (call -> Long.toString(call.getTraceID())); + final Predicate<OperationCall> predicate = FilterUtility.useFilter(this.filterTraceID, function); + this.fifFilteredData.setPredicate(predicate); } - } diff --git a/src/main/java/kieker/diagnosis/mainview/subview/traces/TracesViewController.java b/src/main/java/kieker/diagnosis/mainview/subview/traces/TracesViewController.java index 96bf8d5c..50332771 100644 --- a/src/main/java/kieker/diagnosis/mainview/subview/traces/TracesViewController.java +++ b/src/main/java/kieker/diagnosis/mainview/subview/traces/TracesViewController.java @@ -32,6 +32,7 @@ import javafx.scene.control.TextField; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeTableView; import javafx.scene.input.MouseEvent; +import kieker.diagnosis.common.FilterUtility; import kieker.diagnosis.domain.OperationCall; import kieker.diagnosis.domain.Trace; import kieker.diagnosis.mainview.subview.util.LazyOperationCallTreeItem; @@ -131,50 +132,27 @@ public final class TracesViewController { } public void useContainerFilter() { - final String text = this.filterContainer.getText(); - - if ((text == null) || text.isEmpty()) { - this.sndPredicate = call -> true; - } else { - this.sndPredicate = call -> call.getContainer().toLowerCase().contains(text.toLowerCase()); - } - + final Predicate<OperationCall> predicate = FilterUtility.useFilter(this.filterContainer, OperationCall::getContainer); + this.sndPredicate = predicate; this.reloadTreetable(); } public void useComponentFilter() { - final String text = this.filterComponent.getText(); - - if ((text == null) || text.isEmpty()) { - this.thdPredicate = call -> true; - } else { - this.thdPredicate = call -> call.getComponent().toLowerCase().contains(text.toLowerCase()); - } - + final Predicate<OperationCall> predicate = FilterUtility.useFilter(this.filterComponent, OperationCall::getComponent); + this.thdPredicate = predicate; this.reloadTreetable(); } public void useOperationFilter() { - final String text = this.filterOperation.getText(); - - if ((text == null) || text.isEmpty()) { - this.fthPredicate = call -> true; - } else { - this.fthPredicate = call -> call.getOperation().toLowerCase().contains(text.toLowerCase()); - } - + final Predicate<OperationCall> predicate = FilterUtility.useFilter(this.filterOperation, OperationCall::getOperation); + this.fthPredicate = predicate; this.reloadTreetable(); } public void useTraceIDFilter() { - final String text = this.filterTraceID.getText(); - - if ((text == null) || text.isEmpty()) { - this.fifPredicate = call -> true; - } else { - this.fifPredicate = call -> Long.toString(call.getTraceID()).contains(text); - } - + final Function<OperationCall, String> function = (call -> Long.toString(call.getTraceID())); + final Predicate<OperationCall> predicate = FilterUtility.useFilter(this.filterTraceID, function); + this.fifPredicate = predicate; this.reloadTreetable(); } diff --git a/src/main/java/kieker/diagnosis/model/PropertiesModel.java b/src/main/java/kieker/diagnosis/model/PropertiesModel.java index 2123c80d..3654a173 100644 --- a/src/main/java/kieker/diagnosis/model/PropertiesModel.java +++ b/src/main/java/kieker/diagnosis/model/PropertiesModel.java @@ -36,12 +36,14 @@ public final class PropertiesModel { private static final String KEY_COMPONENTS = "components"; private static final String KEY_GRAPHVIZ_PATH = "graphvizpath"; private static final String KEY_ADDITIONAL_LOG_CHECKS = "additionalLogChecks"; - + private static final String KEY_REGULAR_EXPRESSIONS = "regularExpressions"; + private String graphvizPath; private TimeUnit timeUnit; private ComponentNames componentNames; private OperationNames operationNames; private boolean additionalLogChecks; + private boolean activateRegularExpressions; public PropertiesModel() { this.loadSettings(); @@ -55,6 +57,7 @@ public final class PropertiesModel { this.componentNames = ComponentNames.valueOf(preferences.get(PropertiesModel.KEY_COMPONENTS, ComponentNames.LONG.name())); this.operationNames = OperationNames.valueOf(preferences.get(PropertiesModel.KEY_OPERATIONS, OperationNames.SHORT.name())); this.additionalLogChecks = Boolean.valueOf(preferences.get(PropertiesModel.KEY_ADDITIONAL_LOG_CHECKS, Boolean.FALSE.toString())); + this.activateRegularExpressions = Boolean.valueOf(preferences.get(PropertiesModel.KEY_REGULAR_EXPRESSIONS, Boolean.FALSE.toString())); } private void saveSettings() { @@ -65,7 +68,8 @@ public final class PropertiesModel { preferences.put(PropertiesModel.KEY_COMPONENTS, this.componentNames.name()); preferences.put(PropertiesModel.KEY_OPERATIONS, this.operationNames.name()); preferences.put(PropertiesModel.KEY_ADDITIONAL_LOG_CHECKS, Boolean.toString(this.additionalLogChecks)); - + preferences.put(PropertiesModel.KEY_REGULAR_EXPRESSIONS, Boolean.toString(this.activateRegularExpressions)); + try { preferences.flush(); } catch (final BackingStoreException e) { @@ -122,6 +126,15 @@ public final class PropertiesModel { this.saveSettings(); } + public boolean isActivateRegularExpressions() { + return activateRegularExpressions; + } + + public void setActivateRegularExpressions(boolean activateRegularExpressions) { + this.activateRegularExpressions = activateRegularExpressions; + this.saveSettings(); + } + /** * @author Nils Christian Ehmke */ diff --git a/src/main/resources/locale/kieker/diagnosis/mainview/dialog/settings/settingsdialogview.properties b/src/main/resources/locale/kieker/diagnosis/mainview/dialog/settings/settingsdialogview.properties index 783bdd3c..8dd31c37 100644 --- a/src/main/resources/locale/kieker/diagnosis/mainview/dialog/settings/settingsdialogview.properties +++ b/src/main/resources/locale/kieker/diagnosis/mainview/dialog/settings/settingsdialogview.properties @@ -19,4 +19,6 @@ title=Settings analysis=Analysis additionalLogChecks=Activate additional checks during trace reconstruction\: SettingsDialog.yes=Yes -SettingsDialog.no=No \ No newline at end of file +SettingsDialog.no=No +searchAndFilter=Filter Masks +activateRegularExpressions=Allow regular expressions (Java standard)\: \ No newline at end of file diff --git a/src/main/resources/locale/kieker/diagnosis/mainview/dialog/settings/settingsdialogview_de.properties b/src/main/resources/locale/kieker/diagnosis/mainview/dialog/settings/settingsdialogview_de.properties index 782961c5..7a8cc1f6 100644 --- a/src/main/resources/locale/kieker/diagnosis/mainview/dialog/settings/settingsdialogview_de.properties +++ b/src/main/resources/locale/kieker/diagnosis/mainview/dialog/settings/settingsdialogview_de.properties @@ -19,4 +19,6 @@ title=Einstellungen analysis=Analyse additionalLogChecks=Aktiviere weitere Überprüfungen während der Trace Rekonstruktion\: SettingsDialog.yes=Ja -SettingsDialog.no=Nein \ No newline at end of file +SettingsDialog.no=Nein +searchAndFilter=Filtermasken +activateRegularExpressions=Erlaube reguläre Ausdrücke (Java-Standard)\: \ No newline at end of file diff --git a/src/main/resources/views/kieker/diagnosis/mainview/dialog/settings/SettingsDialogView.fxml b/src/main/resources/views/kieker/diagnosis/mainview/dialog/settings/SettingsDialogView.fxml index 25636567..aa8ca0d0 100644 --- a/src/main/resources/views/kieker/diagnosis/mainview/dialog/settings/SettingsDialogView.fxml +++ b/src/main/resources/views/kieker/diagnosis/mainview/dialog/settings/SettingsDialogView.fxml @@ -29,6 +29,19 @@ </GridPane> </TitledPane> + <TitledPane text="%searchAndFilter" collapsible="false" > + <GridPane> + <hgap>10</hgap> + <vgap>10</vgap> + + <Label text="%activateRegularExpressions" GridPane.columnIndex="1" GridPane.rowIndex="1" /> + <ComboBox fx:id="activateRegularExpressions" GridPane.columnIndex="2" GridPane.rowIndex="1" GridPane.fillWidth="true" GridPane.hgrow="ALWAYS" maxWidth="Infinity"> + <converter><kieker.diagnosis.mainview.dialog.settings.BooleanStringConverter/></converter> + </ComboBox> + + </GridPane> + </TitledPane> + <TitledPane text="%analysis" collapsible="false" > <GridPane> <hgap>10</hgap> -- GitLab