sync all filters with data from case

This commit is contained in:
millmanorama 2018-11-01 12:04:30 +01:00
parent b108c86195
commit e9bb6ed8f1
3 changed files with 32 additions and 37 deletions

View File

@ -32,16 +32,13 @@ import java.util.Set;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.logging.Level; import java.util.logging.Level;
import javafx.beans.Observable; import javafx.beans.InvalidationListener;
import javafx.beans.property.ReadOnlyObjectProperty; import javafx.beans.property.ReadOnlyObjectProperty;
import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.MapChangeListener;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.collections.ObservableMap; import javafx.collections.ObservableMap;
import javafx.collections.ObservableSet; import javafx.collections.ObservableSet;
import javafx.collections.SetChangeListener;
import static org.apache.commons.lang3.StringUtils.isBlank; import static org.apache.commons.lang3.StringUtils.isBlank;
import org.joda.time.DateTimeZone; import org.joda.time.DateTimeZone;
import org.joda.time.Interval; import org.joda.time.Interval;
@ -159,26 +156,19 @@ public final class FilteredEventsModel {
minCache = CacheBuilder.newBuilder() minCache = CacheBuilder.newBuilder()
.build(new CacheLoaderImpl<>(ignored -> eventManager.getMinTime())); .build(new CacheLoaderImpl<>(ignored -> eventManager.getMinTime()));
datasourcesMap.addListener((MapChangeListener.Change<? extends Long, ? extends DataSource> change) -> { InvalidationListener filterSyncListener = observable -> {
DataSourceFilter dataSourceFilter = new DataSourceFilter(change.getValueAdded().getName(), change.getKey());
RootFilterState rootFilter = filterProperty().get().copyOf();
rootFilter.getDataSourcesFilterState().getFilter().addSubFilter(dataSourceFilter);
requestedFilter.set(rootFilter);
});
hashSets.addListener((SetChangeListener.Change< ? extends String> change) -> {
HashSetFilter hashSetFilter = new HashSetFilter(change.getElementAdded());
RootFilterState rootFilter = filterProperty().get(); RootFilterState rootFilter = filterProperty().get();
rootFilter.getHashHitsFilterState().getFilter().addSubFilter(hashSetFilter); syncFilters(rootFilter);
requestedFilter.set(rootFilter); requestedFilter.set(rootFilter);
}); };
tagNames.addListener((ListChangeListener.Change<? extends TagName> change) -> {
RootFilterState rootFilter = filterProperty().get(); datasourcesMap.addListener(filterSyncListener);
syncTagsFilter(rootFilter); getHashSets().addListener(filterSyncListener);
requestedFilter.set(rootFilter); getTagNames().addListener(filterSyncListener);
});
requestedFilter.set(getDefaultFilter()); requestedFilter.set(getDefaultFilter());
requestedZoomState.addListener((Observable observable) -> { requestedZoomState.addListener(observable -> {
final ZoomState zoomState = requestedZoomState.get(); final ZoomState zoomState = requestedZoomState.get();
if (zoomState != null) { if (zoomState != null) {
@ -269,9 +259,10 @@ public final class FilteredEventsModel {
} }
/** /**
* "sync" the given tags filter with the tagnames in use: Disable filters * "sync" the given root filter with the state of the casee: Disable filters
* for tags that are not in use in the case, and add new filters for tags * for tags that are not in use in the case, and add new filters for tags,
* that don't have them. New filters are selected by default. * hashsets, and datasources. that don't have them. New filters are selected
* by default.
* *
* @param rootFilterState the filter state to modify so it is consistent * @param rootFilterState the filter state to modify so it is consistent
* with the tags in use in the case * with the tags in use in the case
@ -281,7 +272,17 @@ public final class FilteredEventsModel {
rootFilterState.getTagsFilterState().getFilter().addSubFilter(new TagNameFilter(tagName)); rootFilterState.getTagsFilterState().getFilter().addSubFilter(new TagNameFilter(tagName));
}); });
for (FilterState<? extends TagNameFilter> filterState : rootFilterState.getTagsFilterState().getSubFilterStates()) { for (FilterState<? extends TagNameFilter> filterState : rootFilterState.getTagsFilterState().getSubFilterStates()) {
filterState.setDisabled(tagNames.contains(filterState.getFilter().getTagName()) == false); tagFilterState.setDisabled(tagNames.contains(tagFilterState.getFilter().getTagName()) == false);
}
DataSourcesFilter dataSourcesFilter = rootFilter.getDataSourcesFilterState().getFilter();
for (Map.Entry<Long, DataSource> entry : datasourcesMap.entrySet()) {
dataSourcesFilter.addSubFilter(new DataSourceFilter(entry.getValue().getName(), entry.getKey()));
}
HashHitsFilter hashSetsFilter = rootFilter.getHashHitsFilterState().getFilter();
for (String hashSet : getHashSets()) {
hashSetsFilter.addSubFilter(new HashSetFilter(hashSet));
} }
} }

View File

@ -285,7 +285,7 @@ public class TimeLineController {
*/ */
historyManager.currentState().addListener(( observable, oldState, newState) -> { historyManager.currentState().addListener(( observable, oldState, newState) -> {
ZoomState historyManagerState = newState; ZoomState historyManagerState = newState;
filteredEvents.syncTagsFilter(historyManagerState.getFilterState()); filteredEvents.syncFilters(historyManagerState.getFilterState());
currentParams.set(historyManagerState); currentParams.set(historyManagerState);
}); });

View File

@ -21,10 +21,8 @@ package org.sleuthkit.autopsy.timeline.ui.filtering;
import java.util.Arrays; import java.util.Arrays;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.beans.InvalidationListener; import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.binding.Bindings; import javafx.beans.binding.Bindings;
import javafx.beans.value.ChangeListener; import javafx.beans.binding.BooleanBinding;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ObservableMap; import javafx.collections.ObservableMap;
import javafx.fxml.FXML; import javafx.fxml.FXML;
@ -46,6 +44,7 @@ import org.sleuthkit.autopsy.timeline.FXMLConstructor;
import org.sleuthkit.autopsy.timeline.FilteredEventsModel; import org.sleuthkit.autopsy.timeline.FilteredEventsModel;
import org.sleuthkit.autopsy.timeline.TimeLineController; import org.sleuthkit.autopsy.timeline.TimeLineController;
import org.sleuthkit.autopsy.timeline.actions.ResetFilters; import org.sleuthkit.autopsy.timeline.actions.ResetFilters;
import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.CompoundFilterState;
import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.FilterState; import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.FilterState;
import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.RootFilterState; import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.RootFilterState;
import org.sleuthkit.datamodel.timeline.TimelineFilter; import org.sleuthkit.datamodel.timeline.TimelineFilter;
@ -119,8 +118,8 @@ final public class FilterSetPanel extends BorderPane {
legendColumn.setCellFactory(col -> new LegendCell(this.controller)); legendColumn.setCellFactory(col -> new LegendCell(this.controller));
//type is the only filter expanded initialy //type is the only filter expanded initialy
expansionMap.put(controller.getEventsModel().getFilterState().getFilter(), true); expansionMap.put(filteredEvents.getFilterState().getFilter(), true);
expansionMap.put(controller.getEventsModel().getFilterState().getEventTypeFilterState().getFilter(), true); expansionMap.put(filteredEvents.getFilterState().getEventTypeFilterState().getFilter(), true);
InvalidationListener applyFiltersListener = observable -> applyFilters(); InvalidationListener applyFiltersListener = observable -> applyFilters();
@ -128,12 +127,7 @@ final public class FilterSetPanel extends BorderPane {
filteredEvents.descriptionLODProperty().addListener(applyFiltersListener); filteredEvents.descriptionLODProperty().addListener(applyFiltersListener);
filteredEvents.timeRangeProperty().addListener(applyFiltersListener); filteredEvents.timeRangeProperty().addListener(applyFiltersListener);
filteredEvents.filterProperty().addListener(new InvalidationListener() { filteredEvents.filterProperty().addListener(observable -> refresh());
@Override
public void invalidated(Observable observable) {
refresh();
}
});
refresh(); refresh();
hiddenDescriptionsListView.setItems(controller.getQuickHideFilters()); hiddenDescriptionsListView.setItems(controller.getQuickHideFilters());
@ -173,7 +167,7 @@ final public class FilterSetPanel extends BorderPane {
} }
private void refresh() { private void refresh() {
FilterTreeItem filterTreeItem = new FilterTreeItem(filteredEvents.getFilterState().copyOf(), expansionMap); FilterTreeItem filterTreeItem = new FilterTreeItem(filteredEvents.filterProperty().getValue(), expansionMap);
Platform.runLater(() -> { Platform.runLater(() -> {
filterTreeTable.setRoot(filterTreeItem); filterTreeTable.setRoot(filterTreeItem);
}); });