use of com.att.aro.ui.model.waterfall.WaterfallCategory in project VideoOptimzer by attdevsupport.
the class WaterfallPanel method refresh.
/**
* Refreshes the waterfall display with the specified analysis data
* @param Analyzed data from aro core.
*/
public void refresh(AROTraceData aModel) {
this.data = aModel;
this.popup.refresh(null, 0);
this.popup.setVisible(false);
// Create sorted list of request/response pairs
categoryList = new ArrayList<WaterfallCategory>();
if (aModel != null && aModel.getAnalyzerResult() != null) {
this.traceDuration = aModel.getAnalyzerResult().getTraceresult().getTraceDuration();
// add 20% to make sure labels close to the right edge of the screen are visible
this.traceDuration *= 1.2;
for (Session tcpSession : aModel.getAnalyzerResult().getSessionlist()) {
Session thisSession = tcpSession;
if (!tcpSession.isUdpOnly()) {
for (HttpRequestResponseInfo reqResInfo : tcpSession.getRequestResponseInfo()) {
if (reqResInfo.getDirection() == HttpDirection.REQUEST && reqResInfo.getWaterfallInfos() != null) {
categoryList.add(new WaterfallCategory(reqResInfo, thisSession));
}
}
}
}
// Sort and set index
Collections.sort(categoryList);
int index = 0;
for (WaterfallCategory wCategory : categoryList) {
wCategory.setIndex(++index);
}
}
// Horizontal scroll bar used to scroll through trace duration
JScrollBar hScrollBar = getHorizontalScroll();
hScrollBar.setMaximum((int) Math.ceil(this.traceDuration));
CategoryAxis cAxis = getCategoryAxis();
cAxis.clearCategoryLabelToolTips();
DefaultCategoryDataset underlying = new DefaultCategoryDataset();
for (WaterfallCategory wfc : categoryList) {
RequestResponseTimeline rrTimeLine = wfc.getReqResp().getWaterfallInfos();
underlying.addValue(rrTimeLine.getStartTime(), Waterfall.BEFORE, wfc);
underlying.addValue(rrTimeLine.getDnsLookupDuration(), Waterfall.DNS_LOOKUP, wfc);
underlying.addValue(rrTimeLine.getInitialConnDuration(), Waterfall.INITIAL_CONNECTION, wfc);
underlying.addValue(rrTimeLine.getSslNegotiationDuration(), Waterfall.SSL_NEGOTIATION, wfc);
underlying.addValue(rrTimeLine.getRequestDuration(), Waterfall.REQUEST_TIME, wfc);
underlying.addValue(rrTimeLine.getTimeToFirstByte(), Waterfall.TIME_TO_FIRST_BYTE, wfc);
underlying.addValue(rrTimeLine.getContentDownloadDuration(), Waterfall.CONTENT_DOWNLOAD, wfc);
underlying.addValue(null, Waterfall.HTTP_3XX_REDIRECTION, wfc);
underlying.addValue(null, Waterfall.HTTP_4XX_CLIENTERROR, wfc);
int code = wfc.getReqResp().getAssocReqResp().getStatusCode();
double endTime = this.traceDuration - rrTimeLine.getStartTime() - rrTimeLine.getTotalTime();
if (code >= 300 && code < 400) {
underlying.addValue(endTime, Waterfall.AFTER_3XX, wfc);
} else if (code >= 400) {
underlying.addValue(endTime, Waterfall.AFTER_4XX, wfc);
} else {
underlying.addValue(endTime, Waterfall.AFTER, wfc);
}
cAxis.addCategoryLabelToolTip(wfc, wfc.getTooltip());
}
// Vertical scroll bar is used to scroll through data
JScrollBar vScrollBar = getVerticalScroll();
int count = underlying.getColumnCount();
vScrollBar.setValue(0);
vScrollBar.setMaximum(count);
vScrollBar.setVisibleAmount(count > 0 ? this.dataset.getMaximumCategoryCount() - 1 / count : 1);
// Add the dataset to the plot
CategoryPlot plot = getChartPanel().getChart().getCategoryPlot();
this.dataset = new SlidingCategoryDataset(underlying, 0, CATEGORY_MAX_COUNT);
plot.setDataset(this.dataset);
// Set the visible time range
setTimeRange(startGraphRange, startGraphRange + 100);
// Place proper colors on renderer for waterfall states
final CategoryItemRenderer renderer = plot.getRenderer();
for (Object obj : underlying.getRowKeys()) {
Waterfall wFall = (Waterfall) obj;
int index = underlying.getRowIndex(wFall);
Color paint;
switch(wFall) {
case DNS_LOOKUP:
paint = dnsLoolupColor;
break;
case INITIAL_CONNECTION:
paint = initiaConnColor;
break;
case SSL_NEGOTIATION:
paint = sslNegColor;
break;
case REQUEST_TIME:
paint = requestTimeColor;
break;
case TIME_TO_FIRST_BYTE:
paint = firstByteTimeColor;
break;
case CONTENT_DOWNLOAD:
paint = contentDownloadColor;
break;
case INACTIVE:
paint = inactiveConnectionColor;
break;
case AFTER_3XX:
paint = noneColor;
renderer.setSeriesItemLabelPaint(index, threexColor);
renderer.setSeriesVisibleInLegend(index, false);
break;
case AFTER_4XX:
paint = noneColor;
renderer.setSeriesItemLabelPaint(index, fourxColor);
renderer.setSeriesVisibleInLegend(index, false);
break;
case HTTP_3XX_REDIRECTION:
paint = threexColor;
break;
case HTTP_4XX_CLIENTERROR:
paint = fourxColor;
break;
default:
renderer.setSeriesItemLabelPaint(index, Color.black);
renderer.setSeriesVisibleInLegend(index, false);
paint = noneColor;
}
renderer.setSeriesPaint(index, paint);
}
// Adding the label at the end of bars
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator() {
private static final long serialVersionUID = 1L;
@Override
public String generateLabel(CategoryDataset dataset, int row, int column) {
if (Waterfall.AFTER == dataset.getRowKey(row) || Waterfall.AFTER_3XX == dataset.getRowKey(row) || Waterfall.AFTER_4XX == dataset.getRowKey(row)) {
WaterfallCategory waterfallItem = (WaterfallCategory) dataset.getColumnKey(column);
RequestResponseTimeline waterfallInfos = waterfallItem.getReqResp().getWaterfallInfos();
DecimalFormat formatter = new DecimalFormat("#.##");
int code = waterfallItem.getReqResp().getAssocReqResp().getStatusCode();
return MessageFormat.format(getMessageString("waterfall.totalTime"), formatter.format(waterfallInfos.getTotalTime()), code > 0 ? waterfallItem.getReqResp().getScheme() + " " + code : getMessageString("waterfall.unknownCode"));
}
return null;
}
});
new Thread(() -> setCrosshairs(aModel)).start();
}
Aggregations