/*
* Autopsy Forensic Browser
*
* Copyright 2015-16 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.timeline.filters;
import java.util.Set;
import java.util.stream.Collectors;
import javafx.beans.binding.BooleanBinding;
import javafx.collections.FXCollections;
/**
* An implementation of IntersectionFilter designed to be used as the root of a
* filter tree. provides named access to specific subfilters.
*/
public class RootFilter extends IntersectionFilter<Filter> {
private final HideKnownFilter knownFilter;
private final TagsFilter tagsFilter;
private final HashHitsFilter hashFilter;
private final TextFilter textFilter;
private final TypeFilter typeFilter;
private final DataSourcesFilter dataSourcesFilter;
public DataSourcesFilter getDataSourcesFilter() {
return dataSourcesFilter;
}
public TagsFilter getTagsFilter() {
return tagsFilter;
}
public HashHitsFilter getHashHitsFilter() {
return hashFilter;
}
public TypeFilter getTypeFilter() {
return typeFilter;
}
public HideKnownFilter getKnownFilter() {
return knownFilter;
}
public TextFilter getTextFilter() {
return textFilter;
}
public RootFilter(HideKnownFilter knownFilter, TagsFilter tagsFilter, HashHitsFilter hashFilter, TextFilter textFilter, TypeFilter typeFilter, DataSourcesFilter dataSourceFilter, Set<Filter> annonymousSubFilters) {
super(FXCollections.observableArrayList(
textFilter,
knownFilter,
dataSourceFilter, tagsFilter,
hashFilter,
typeFilter
));
this.knownFilter = knownFilter;
this.tagsFilter = tagsFilter;
this.hashFilter = hashFilter;
this.textFilter = textFilter;
this.typeFilter = typeFilter;
this.dataSourcesFilter = dataSourceFilter;
getSubFilters().addAll(annonymousSubFilters);
setSelected(Boolean.TRUE);
setDisabled(false);
}
@Override
public RootFilter copyOf() {
Set<Filter> annonymousSubFilters = getSubFilters().stream()
.filter(subFilter ->
!(subFilter.equals(knownFilter)
|| subFilter.equals(tagsFilter)
|| subFilter.equals(hashFilter)
|| subFilter.equals(typeFilter)
|| subFilter.equals(textFilter)
|| subFilter.equals(dataSourcesFilter)))
.map(Filter::copyOf)
.collect(Collectors.toSet());
RootFilter filter = new RootFilter(
knownFilter.copyOf(),
tagsFilter.copyOf(),
hashFilter.copyOf(),
textFilter.copyOf(),
typeFilter.copyOf(),
dataSourcesFilter.copyOf(),
annonymousSubFilters);
filter.setSelected(isSelected());
filter.setDisabled(isDisabled());
return filter;
}
@Override
public int hashCode() {
return super.hashCode();
}
@Override
@SuppressWarnings("unchecked")
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
return areSubFiltersEqual(this, (CompoundFilter<Filter>) obj);
}
@Override
public boolean isActive() {
return true;
}
@Override
public BooleanBinding activeProperty() {
return new BooleanBinding() {
@Override
protected boolean computeValue() {
return true;
}
};
}
}