/*
* Copyright (c) 2013-2017 Chris Newland.
* Licensed under https://github.com/AdoptOpenJDK/jitwatch/blob/master/LICENSE-BSD
* Instructions: https://github.com/AdoptOpenJDK/jitwatch/wiki
*/
package org.adoptopenjdk.jitwatch.ui.report;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.adoptopenjdk.jitwatch.core.JITWatchConstants;
import org.adoptopenjdk.jitwatch.report.Report;
import org.adoptopenjdk.jitwatch.ui.main.IStageAccessProxy;
import org.adoptopenjdk.jitwatch.ui.main.JITWatchUI;
import org.adoptopenjdk.jitwatch.ui.report.cell.LinkedBCICell;
import org.adoptopenjdk.jitwatch.ui.report.cell.MemberTableCell;
import org.adoptopenjdk.jitwatch.ui.report.elidedlock.ElidedLockRowBean;
import org.adoptopenjdk.jitwatch.ui.report.elidedlock.ElidedLockRowBuilder;
import org.adoptopenjdk.jitwatch.ui.report.eliminatedallocation.EliminatedAllocationRowBean;
import org.adoptopenjdk.jitwatch.ui.report.eliminatedallocation.EliminatedAllocationRowBuilder;
import org.adoptopenjdk.jitwatch.ui.report.inlining.InliningRowBean;
import org.adoptopenjdk.jitwatch.ui.report.inlining.InliningRowBuilder;
import org.adoptopenjdk.jitwatch.ui.report.suggestion.SuggestionRowBean;
import org.adoptopenjdk.jitwatch.ui.report.suggestion.SuggestionRowBuilder;
import org.adoptopenjdk.jitwatch.util.UserInterfaceUtil;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
public class ReportStage extends Stage
{
private VBox vbox;
private TableView<IReportRowBean> tableView;
private ObservableList<IReportRowBean> observableList = FXCollections.observableArrayList();
private Set<String> filterPackageSet = new HashSet<>();
private List<Report> reportList;
private ReportStageType type;
public ReportStage(final IStageAccessProxy proxy, String title, ReportStageType type, List<Report> reportList)
{
this.reportList = reportList;
this.type = type;
MemberTableCell.setTriViewAccessor(proxy);
LinkedBCICell.setTriViewAccessor(proxy);
initStyle(StageStyle.DECORATED);
BorderPane borderPane = new BorderPane();
vbox = new VBox();
ReportPackageFilter filter = new ReportPackageFilter(this);
borderPane.setTop(filter);
borderPane.setCenter(vbox);
Scene scene = UserInterfaceUtil.getScene(borderPane, JITWatchUI.WINDOW_WIDTH, JITWatchUI.WINDOW_HEIGHT);
switch (type)
{
case SUGGESTION:
setTitle(title);
tableView = SuggestionRowBuilder.buildTableSuggestion(observableList);
break;
case ELIMINATED_ALLOCATION:
setTitle(title);
tableView = EliminatedAllocationRowBuilder.buildTableSuggestion(observableList);
break;
case ELIDED_LOCK:
setTitle(title);
tableView = ElidedLockRowBuilder.buildTableSuggestion(observableList);
break;
case INLINING:
setTitle(title);
tableView = InliningRowBuilder.buildTableSuggestion(observableList);
break;
}
filter.prefWidthProperty().bind(scene.widthProperty());
vbox.getChildren().add(tableView);
tableView.prefHeightProperty().bind(scene.heightProperty());
setScene(scene);
display();
}
public void clear()
{
observableList.clear();
}
public ReportStageType getType()
{
return type;
}
private void display()
{
clear();
if (reportList.size() == 0)
{
vbox.getChildren().clear();
vbox.getChildren().add(new Label("No results"));
}
else
{
for (Report report : reportList)
{
boolean show = false;
if (filterPackageSet.size() == 0)
{
show = true;
}
else
{
for (String allowedPackage : filterPackageSet)
{
if (report.getCaller() != null
&& report.getCaller().getFullyQualifiedMemberName().startsWith(allowedPackage.trim()))
{
show = true;
}
}
}
if (show)
{
switch (type)
{
case SUGGESTION:
observableList.add(new SuggestionRowBean(report));
break;
case ELIMINATED_ALLOCATION:
observableList.add(new EliminatedAllocationRowBean(report));
break;
case ELIDED_LOCK:
observableList.add(new ElidedLockRowBean(report));
break;
case INLINING:
observableList.add(new InliningRowBean(report));
break;
}
}
}
}
}
public void setFilter(String packageFilter)
{
String[] packages = packageFilter.split(JITWatchConstants.S_COMMA);
filterPackageSet.clear();
filterPackageSet.addAll(Arrays.asList(packages));
display();
}
}