/*
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.widget;
import io.haskins.java.cloudtrailviewer.model.event.Event;
import io.haskins.java.cloudtrailviewer.utils.EventUtils;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Tooltip;
import javafx.scene.input.MouseEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Abstract class that provides common XY Chart functionality
*
* Created by markhaskins on 25/01/2017.
*/
abstract class XYChartController extends AbstractBaseController {
@FXML XYChart<String,Number> chart;
@FXML CategoryAxis xAxis;
@FXML NumberAxis yAxis;
final List<String> categories = new ArrayList<>();
final Map<String, Map<String, List<Event>>> multiSeries = new HashMap<>();
private final Map<String, List<Event>> singleSeries = new HashMap<>();
@Override
public void clearEvents() {
categories.clear();
multiSeries.clear();
singleSeries.clear();
super.clearEvents();
}
public void newEvents(List<Event> events) {
for (Event event : events) {
newEvent(event);
}
}
@Override
public void newEvent(Event event) {
super.newEvent(event);
String s = EventUtils.getEventProperty(this.widget.getSeriesField(), event);
if (s != null) {
List<Event> events;
if (singleSeries.containsKey(s)) {
events = singleSeries.get(s);
} else {
events = new ArrayList<>();
singleSeries.put(s, events);
}
events.add(event);
}
}
public void finishedLoading(boolean reload) {
if (reload) {
chart.getData().clear();
}
xAxis.setLabel(widget.getSeriesField());
yAxis.setLabel("Count");
List<Map.Entry<String, Integer>> topEvents = getTopEvents();
if (topEvents != null) {
categories.clear();
for (Map.Entry<String, Integer> entry : topEvents) {
String seriesName = entry.getKey();
categories.add(seriesName);
XYChart.Series<String, Number> series = new XYChart.Series<>();
series.setName(seriesName);
series.getData().add(new XYChart.Data<>(seriesName, entry.getValue()));
chart.getData().add(series);
}
for (XYChart.Series<String,Number> serie: chart.getData()){
for (XYChart.Data<String, Number> item: serie.getData()){
item.getNode().setOnMousePressed((MouseEvent event) -> eventTableService.setTableEvents(singleSeries.get(serie.getName())));
Node node = item.getNode();
Tooltip t = new Tooltip(serie.getName() + " : " + item.getYValue());
Tooltip.install(node, t);
}
}
}
xAxis.setCategories(FXCollections.observableArrayList(categories));
}
}