/*
CloudTrail Viewer, is a Java desktop application for reading AWS CloudTrail logs
files.
Copyright (C) 2017 Mark P. Haskins
This program is free software: you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software Foundation,
either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package io.haskins.java.cloudtrailviewer.controller.dialog.filechooser;
import io.haskins.java.cloudtrailviewer.controls.warningcell.WarningCellFactory;
import io.haskins.java.cloudtrailviewer.filter.CompositeFilter;
import io.haskins.java.cloudtrailviewer.filter.EventFieldFilter;
import io.haskins.java.cloudtrailviewer.filter.Filter;
import io.haskins.java.cloudtrailviewer.model.observable.LogFileFilter;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.geometry.Side;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.BorderPane;
/**
* Provides the logic for the filter panel
*
* Created by markhaskins on 27/01/2017.
*/
public class FilterPanelController extends BorderPane {
@FXML private TableView<LogFileFilter> filterTable;
@FXML private Button addBtn;
private final ObservableList<LogFileFilter> data = FXCollections.observableArrayList();
private final ContextMenu addFilterMenu = new ContextMenu();
private FilterPanelControllerListener listener;
private CompositeFilter filters = new CompositeFilter();
@FXML
public void initialize() {
initTable();
initContextMenu();
addBtn.setOnAction(e -> addFilterMenu.show(addBtn, Side.BOTTOM, 0, 0));
}
@FXML
private void remove() {
LogFileFilter selected = filterTable.getSelectionModel().getSelectedItem();
filterTable.getItems().remove(selected);
}
@FXML private void modeOr() {
filters.setMode(CompositeFilter.BITWISE_OR);
}
@FXML private void modeAnd() {
filters.setMode(CompositeFilter.BITWISE_AND);
}
void addListener(FilterPanelControllerListener listener) {
this.listener = listener;
}
CompositeFilter getFilters() {
return filters;
}
private void initTable() {
TableColumn<LogFileFilter, String> nameCol = new TableColumn<>("Filter");
nameCol.setMinWidth(100);
nameCol.setCellValueFactory(new PropertyValueFactory<>("name"));
TableColumn<LogFileFilter, String> valueCol = new TableColumn<>("Value");
valueCol.setMinWidth(100);
valueCol.setCellValueFactory(new PropertyValueFactory<>("needle"));
valueCol.setCellFactory(new WarningCellFactory(0));
valueCol.setOnEditCommit(
(TableColumn.CellEditEvent<LogFileFilter, String> t) -> {
LogFileFilter acct = t.getTableView().getItems().get(t.getTablePosition().getRow());
acct.setNeedle(t.getNewValue());
filtersUpdated();
}
);
filterTable.getColumns().addAll(nameCol, valueCol);
filterTable.setEditable(true);
filterTable.setItems(data);
data.addListener((ListChangeListener<LogFileFilter>) pChange -> {
while(pChange.next()) {
filtersUpdated();
}
});
}
private void initContextMenu() {
configureMenuItem(new MenuItem("No Filter"), new LogFileFilter("No Filter", "", "", ""));
configureMenuItem(new MenuItem("Text Filter"), new LogFileFilter("Text Filter", "AllFilter", "", ""));
// configureMenuItem(new MenuItem("Date Filter"), new LogFileFilter("Date Filter", "DateFilter", "", ""));
// configureMenuItem(new MenuItem("Ignore Filter"), new LogFileFilter("Ignore Filter", "IgnoreFilter", "", ""));
configureMenuItem(new MenuItem("Event Name"), new LogFileFilter("Event Name", "EventFieldFilter", "eventName", ""));
configureMenuItem(new MenuItem("AWS Region"), new LogFileFilter("AWS Region", "EventFieldFilter", "awsRegion", ""));
configureMenuItem(new MenuItem("Source IP Address"), new LogFileFilter("Source IP Address", "EventFieldFilter", "sourceIPAddress", ""));
configureMenuItem(new MenuItem("User Agent"), new LogFileFilter("User Agent", "EventFieldFilter", "userAgent", ""));
configureMenuItem(new MenuItem("Event Source"), new LogFileFilter("Event Source", "EventFieldFilter", "eventSource", ""));
configureMenuItem(new MenuItem("Error Code"), new LogFileFilter("Error Code", "EventFieldFilter", "errorCode", ""));
configureMenuItem(new MenuItem("Error Message"), new LogFileFilter("Error Message", "EventFieldFilter", "errorMessage", ""));
configureMenuItem(new MenuItem("Recipient Account Id"), new LogFileFilter("Recipient Account Id", "EventFieldFilter", "recipientAccountId", ""));
configureMenuItem(new MenuItem("User Identity : Type"), new LogFileFilter("User Identity : Type", "EventFieldFilter", "userIdentity.type", ""));
configureMenuItem(new MenuItem("User Identity : Principal Id"), new LogFileFilter("User Identity : Principal Id", "EventFieldFilter", "userIdentity.principalId", ""));
configureMenuItem(new MenuItem("User Identity : Arn"), new LogFileFilter("User Identity : Arn", "EventFieldFilter", "userIdentity.arn", ""));
configureMenuItem(new MenuItem("User Identity : Account Id"), new LogFileFilter("User Identity : Account Id", "EventFieldFilter", "userIdentity.accountId", ""));
configureMenuItem(new MenuItem("User Identity : Access Key Id"), new LogFileFilter("User Identity : Access Key Id", "EventFieldFilter", "userIdentity.accessKeyId", ""));
configureMenuItem(new MenuItem("User Identity : User name"), new LogFileFilter("User Identity : User name", "EventFieldFilter", "userIdentity.userName", ""));
configureMenuItem(new MenuItem("User Identity : Invoked By"), new LogFileFilter("User Identity : Invoked By", "EventFieldFilter", "userIdentity.invokedBy", ""));
configureMenuItem(new MenuItem("User Identity : Web Id Federation Data"), new LogFileFilter("User Identity : Web Id Federation Data", "EventFieldFilter", "userIdentity.webIdFederationData", ""));
configureMenuItem(new MenuItem("Session Issuer : Type"), new LogFileFilter("Session Issuer : Type", "EventFieldFilter", "userIdentity.sessionContext.sessionIssuer.type", ""));
configureMenuItem(new MenuItem("Session Issuer : Principal Id"), new LogFileFilter("Session Issuer : Principal Id", "EventFieldFilter", "userIdentity.sessionContext.sessionIssuer.principalId", ""));
configureMenuItem(new MenuItem("Session Issuer : Arn"), new LogFileFilter("Session Issuer : Arn", "EventFieldFilter", "userIdentity.sessionContext.sessionIssuer.arn", ""));
configureMenuItem(new MenuItem("Session Issuer : Account Id"), new LogFileFilter("Session Issuer : Account Id", "EventFieldFilter", "userIdentity.sessionContext.sessionIssuer.accountId", ""));
configureMenuItem(new MenuItem("Session Issuer : User name"), new LogFileFilter("Session Issuer : User name", "EventFieldFilter", "userIdentity.sessionContext.sessionIssuer.userName", ""));
}
private void configureMenuItem(MenuItem menuItem, LogFileFilter observable) {
menuItem.setUserData(observable);
menuItem.setOnAction(e -> {
LogFileFilter selected = (LogFileFilter)((MenuItem)e.getSource()).getUserData();
filterTable.getItems().add(selected);
});
addFilterMenu.getItems().add(menuItem);
}
private void filtersUpdated() {
boolean passed = true;
if (data.size() == 0) {
passed = false;
} else {
for (LogFileFilter aData : data) {
passed &= aData.isfilterConfigure();
}
}
if (passed) {
for (LogFileFilter aData : data) {
filters.addFilter(getFilter(aData));
}
} else {
filters.clear();
}
listener.scanAvailable(passed);
}
private Filter getFilter(LogFileFilter filterChoiceObservable) {
Filter filter = null;
try {
String filterFQPN = "io.haskins.java.cloudtrailviewer.filter." + filterChoiceObservable.getFilter();
Class filterClass = Class.forName(filterFQPN);
if (filterClass != null) {
filter = (Filter)filterClass.newInstance();
if (filter instanceof EventFieldFilter) {
((EventFieldFilter)filter).setOption(filterChoiceObservable.getField());
}
filter.setNeedle(filterChoiceObservable.getNeedle());
}
} catch (InstantiationException | IllegalAccessException |ClassNotFoundException ex) {
// LOGGER.log(Level.WARNING, "Failed to load filter", ex);
}
return filter;
}
}