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 0000000000000000000000000000000000000000..a45f5cf7bd268c5aacf681ed18a8ca86e3289f36 --- /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 0d9323fc833a8c79bda1d07efea959902963aea7..ad0343f54656e7fcaa85e9b7a6009735bf7a4d8d 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 a1f531ae0129b4625536113f8bdeb99b71b08f84..ae302c8dc2d758433c3c47c744af0aa2a1983b2f 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 2e394b5c57940bdebf75ace8aa52f4c209e2cc37..01aeee870f4c95c50b2b5223a48bcd74aa85ee07 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 1bc684ed66192232f2e1be44d57d1e23cfd6aac3..7b31d986a3a7f4360c8066f05fb40fa12b9e588a 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 96bf8d5cccd483905f3388fb0535ed7af61d0932..503327719ab49b8f5eac8a171f3cd35f9e1a9c9f 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 2123c80df22a060166253836d2d4c8a2edae9e5b..3654a1737ddb4d841a518f9b655fb7cc5fc37daa 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 783bdd3c4ba544a8f20f2fc24aac64f9252da077..8dd31c37778428b697459a9476fd215143ae39ab 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 782961c5e8acca19ca28f55fb05304bf1bfc4659..7a8cc1f69c776f00142b8a6af621804498cb6745 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 2563656790e36b90c3595522f65af35f1240d3f5..aa8ca0d00e667612391b59187f145ca30b2212ef 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>