modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/resource/graph/ResourceGraphPortlet.java | 9 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMetricD3GraphView.java | 4 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/AbstractGraph.java | 8 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/MetricGraphData.java | 161 +++------- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/MetricStackedBarGraph.java | 34 +- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/D3GraphListView.java | 17 - modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 3 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties | 3 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties | 3 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties | 3 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties | 3 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties | 3 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties | 3 modules/enterprise/gui/coregui/src/main/webapp/js/rhq.js | 5 14 files changed, 128 insertions(+), 131 deletions(-)
New commits: commit f2db5a695ed8cbdc9f2c6d570465e8d7c6704694 Author: Mike Thompson mithomps@redhat.com Date: Tue Feb 5 11:18:28 2013 -0800
Charting - fix erroneous unknown bars to use unknown availability data instead of no data. No data bars added now as well. Hovers supplied for unknown and no data bars. Establish priority in overlapping intervals as 1) down or disabled, 2) unknown, 3) No Data.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/resource/graph/ResourceGraphPortlet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/resource/graph/ResourceGraphPortlet.java index ea9edd3..13c32c6 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/resource/graph/ResourceGraphPortlet.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/resource/graph/ResourceGraphPortlet.java @@ -216,14 +216,13 @@ public class ResourceGraphPortlet extends ResourceMetricD3Graph implements Custo public void onSuccess(PageList<Availability> availList) { Log.debug("\nSuccessfully queried Dashboard availability in: " + (System.currentTimeMillis() - startTime) + " ms."); - PageList<Availability> downAvailList = new PageList<Availability>(); + PageList<Availability> availabilityList = new PageList<Availability>(); for (Availability availability : availList) { - if (availability.getAvailabilityType().equals(AvailabilityType.DOWN) - || availability.getAvailabilityType().equals(AvailabilityType.DISABLED)) { - downAvailList.add(availability); + if (!availability.getAvailabilityType().equals(AvailabilityType.UP)){ + availabilityList.add(availability); } } - graph.getMetricGraphData().setAvailabilityDownList(downAvailList); + graph.getMetricGraphData().setAvailabilityList(availabilityList); countDownLatch.countDown(); } }); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMetricD3GraphView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMetricD3GraphView.java index 7ccbd60..a51910e 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMetricD3GraphView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMetricD3GraphView.java @@ -143,6 +143,10 @@ public abstract class AbstractMetricD3GraphView extends LocatableVLayout { " width="6" height="3">" + " <path d="M 0 0 6 0" style="stroke:#CCCCCC; fill:none;"/>" + " </pattern>" + + " <pattern id="blueStripes" patternUnits="userSpaceOnUse" x="0" y="0"" + + " width="6" height="3">" + + " <path d="M 0 0 6 0" style="stroke:#69BFDE; fill:none;"/>" + + " </pattern>" + " <pattern id="redStripes" patternUnits="userSpaceOnUse" x="0" y="0"" + " width="6" height="3">" + " <path d="M 0 0 6 0" style="stroke:#ff8a9a; fill:none;"/>" + diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/AbstractGraph.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/AbstractGraph.java index e78ab51..4eca060 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/AbstractGraph.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/AbstractGraph.java @@ -87,8 +87,8 @@ public abstract class AbstractGraph implements HasD3JsniChart { metricGraphData.setMetricData(metricData); }
- public void setAvailabilityDownList(PageList<Availability> availabilityDownList) { - metricGraphData.setAvailabilityDownList(availabilityDownList); + public void setAvailabilityList(PageList<Availability> availabilityDownList) { + metricGraphData.setAvailabilityList(availabilityDownList); }
public void setMeasurementOOBCompositeList(PageList<MeasurementOOBComposite> measurementOOBCompositeList) { @@ -123,6 +123,10 @@ public abstract class AbstractGraph implements HasD3JsniChart { return metricGraphData.getChartUnknownLabel(); }
+ public String getChartNoDataLabel() { + return metricGraphData.getChartNoDataLabel(); + } + public String getChartHoverStartLabel() { return metricGraphData.getChartHoverStartLabel(); } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/MetricGraphData.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/MetricGraphData.java index c88acaa..35a31b7 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/MetricGraphData.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/MetricGraphData.java @@ -20,7 +20,6 @@ package org.rhq.enterprise.gui.coregui.client.inventory.common.charttype;
import java.util.ArrayList; import java.util.Date; -import java.util.LinkedList; import java.util.List;
import org.rhq.core.domain.measurement.Availability; @@ -46,9 +45,9 @@ import org.rhq.enterprise.gui.coregui.client.util.MeasurementConverterClient; */ public class MetricGraphData implements JsonMetricProducer {
+ private static final Integer DEFAULT_CHART_HEIGHT = 200; // i18n final protected Messages MSG = CoreGUI.getMessages(); - private static final Integer DEFAULT_CHART_HEIGHT = 200; private final String chartTitleMinLabel = MSG.chart_title_min_label(); private final String chartTitleAvgLabel = MSG.chart_title_avg_label(); private final String chartTitlePeakLabel = MSG.chart_title_peak_label(); @@ -56,24 +55,20 @@ public class MetricGraphData implements JsonMetricProducer { private final String chartTimeLabel = MSG.chart_time_label(); private final String chartDownLabel = MSG.chart_down_label(); private final String chartUnknownLabel = MSG.chart_unknown_label(); - //private final String chartNoDataLabel = MSG.chart_no_data_label(); + private final String chartNoDataLabel = MSG.chart_no_data_label(); private final String chartHoverStartLabel = MSG.chart_hover_start_label(); private final String chartHoverEndLabel = MSG.chart_hover_end_label(); private final String chartHoverPeriodLabel = MSG.chart_hover_period_label(); private final String chartHoverBarLabel = MSG.chart_hover_bar_label(); - private int entityId; private String entityName; private int definitionId; - private MeasurementUnits adjustedMeasurementUnits; private MeasurementDefinition definition; private List<MeasurementDataNumericHighLowComposite> metricData; - //private List<DatePair> unknownIntervalList; - private PageList<Availability> availabilityDownList; + private PageList<Availability> availabilityList; private PageList<MeasurementOOBComposite> measurementOOBCompositeList; private MeasurementOOBComposite lastOOB; - private Integer chartHeight;
public MetricGraphData() { @@ -96,13 +91,15 @@ public class MetricGraphData implements JsonMetricProducer { this.metricData = metricData; }
- public MetricGraphData(int entityId, String entityName, MeasurementDefinition measurementDef, List<MeasurementDataNumericHighLowComposite> metrics, PageList<Availability> downAvailList, PageList<MeasurementOOBComposite> measurementOOBCompositeList) { + public MetricGraphData(int entityId, String entityName, MeasurementDefinition measurementDef, + List<MeasurementDataNumericHighLowComposite> metrics, PageList<Availability> downAvailList, + PageList<MeasurementOOBComposite> measurementOOBCompositeList) { this.entityName = entityName; setEntityId(entityId); setDefinitionId(measurementDef.getId()); this.definition = measurementDef; this.metricData = metrics; - this.availabilityDownList = downAvailList; + this.availabilityList = downAvailList; this.measurementOOBCompositeList = measurementOOBCompositeList; }
@@ -148,12 +145,10 @@ public class MetricGraphData implements JsonMetricProducer { this.metricData = metricData; }
- - public void setAvailabilityDownList(PageList<Availability> availabilityDownList) { - this.availabilityDownList = availabilityDownList; + public void setAvailabilityList(PageList<Availability> availabilityList) { + this.availabilityList = availabilityList; }
- public void setMeasurementOOBCompositeList(PageList<MeasurementOOBComposite> measurementOOBCompositeList) { this.measurementOOBCompositeList = measurementOOBCompositeList; } @@ -186,6 +181,10 @@ public class MetricGraphData implements JsonMetricProducer { return chartUnknownLabel; }
+ public String getChartNoDataLabel() { + return chartNoDataLabel; + } + public String getChartHoverStartLabel() { return chartHoverStartLabel; } @@ -203,9 +202,9 @@ public class MetricGraphData implements JsonMetricProducer { }
public Integer getChartHeight() { - if(null != chartHeight){ + if (null != chartHeight) { return chartHeight; - }else { + } else {
return DEFAULT_CHART_HEIGHT; } @@ -217,13 +216,13 @@ public class MetricGraphData implements JsonMetricProducer {
public String getYAxisTitle() {
- Log.debug("** Definition: "+definition+ ", id: "+ definitionId); + Log.debug("** Definition: " + definition + ", id: " + definitionId); if (null != definition.getDisplayName() && definition.getDisplayName().length() > 55) { return definition.getDisplayName().substring(0, 55) + "..."; } else { - if(definition == null ){ - return ""; - }else { + if (definition == null) { + return ""; + } else { return definition.getDisplayName(); } } @@ -239,7 +238,7 @@ public class MetricGraphData implements JsonMetricProducer { if (adjustedMeasurementUnits == null) { Log.error("AbstractMetricD3GraphView.adjustedMeasurementUnits is populated by getJsonMetrics. Make sure it is called first."); return ""; - }else { + } else { return adjustedMeasurementUnits.toString(); } } @@ -256,7 +255,7 @@ public class MetricGraphData implements JsonMetricProducer { public String getJsonMetrics() { StringBuilder sb = new StringBuilder("["); boolean gotAdjustedMeasurementUnits = false; - //Log.debug(" avail records loaded: "+getAvailabilityDownList().size()); + Log.debug(" avail records loaded: " + availabilityList.size()); if (null != metricData) { long firstBarTime = metricData.get(0).getTimestamp(); long secondBarTime = metricData.get(1).getTimestamp(); @@ -269,22 +268,31 @@ public class MetricGraphData implements JsonMetricProducer { for (MeasurementDataNumericHighLowComposite measurement : metricData) { sb.append("{ "x":" + measurement.getTimestamp() + ",");
- if (null != availabilityDownList) { + if (null != availabilityList) { // loop through the avail down intervals - for (Availability availability : availabilityDownList) { + for (Availability availability : availabilityList) {
// we know we are in an interval - //Log.debug("Availability: " + availability); - //Log.debug("Measurement: " + measurement); // @todo: when resource is down measurement is null NPE if (measurement.getTimestamp() >= availability.getStartTime() && measurement.getTimestamp() <= availability.getEndTime()) { - sb.append(" "availStart":" + availability.getStartTime() + ", "); - sb.append(" "availEnd":" + availability.getEndTime() + ", "); - long availDuration = availability.getEndTime() - availability.getStartTime(); - String availDurationString = MeasurementConverterClient.format((double) availDuration, - MeasurementUnits.MILLISECONDS, true); - sb.append(" "availDuration": "" + availDurationString + "", "); + if (availability.getAvailabilityType().equals(AvailabilityType.DOWN) + || availability.getAvailabilityType().equals(AvailabilityType.DISABLED)) { + sb.append(" "availStart":" + availability.getStartTime() + ", "); + sb.append(" "availEnd":" + availability.getEndTime() + ", "); + long availDuration = availability.getEndTime() - availability.getStartTime(); + String availDurationString = MeasurementConverterClient.format((double) availDuration, + MeasurementUnits.MILLISECONDS, true); + sb.append(" "availDuration": "" + availDurationString + "", "); + } else if (availability.getAvailabilityType().equals(AvailabilityType.UNKNOWN)) { + sb.append(" "unknownStart":" + availability.getStartTime() + ", "); + sb.append(" "unknownEnd":" + availability.getEndTime() + ", "); + long availDuration = availability.getEndTime() - availability.getStartTime(); + String availDurationString = MeasurementConverterClient.format((double) availDuration, + MeasurementUnits.MILLISECONDS, true); + sb.append(" "unknownDuration": "" + availDurationString + "", "); + + } break; } } @@ -295,7 +303,9 @@ public class MetricGraphData implements JsonMetricProducer { }
if (isAvailabilityDownOrDisabledForBar(measurement.getTimestamp())) { - sb.append(" "down":true, "); + sb.append(" "down":true "); + } else if (isAvailabilityUnknownForBar(measurement.getTimestamp())) { + sb.append(" "unknown":true "); } else { if (!Double.isNaN(measurement.getValue())) {
@@ -322,7 +332,7 @@ public class MetricGraphData implements JsonMetricProducer { } } } - if(!sb.toString().endsWith("},")){ + if (!sb.toString().endsWith("},")) { sb.append(" },"); } } @@ -353,13 +363,13 @@ public class MetricGraphData implements JsonMetricProducer {
private boolean isAvailabilityDownOrDisabledForBar(long timestamp) { Date timestampDate = new Date(timestamp); - if (null != availabilityDownList) { - for (Availability availability : availabilityDownList) { - boolean downOrDisabled = (availability.getAvailabilityType().equals(AvailabilityType.DOWN) || - availability.getAvailabilityType().equals(AvailabilityType.DISABLED)); + if (null != availabilityList) { + for (Availability availability : availabilityList) { + boolean downOrDisabled = (availability.getAvailabilityType().equals(AvailabilityType.DOWN) || availability + .getAvailabilityType().equals(AvailabilityType.DISABLED)); if (downOrDisabled - && (timestampDate.after(new Date(availability.getStartTime())) - && timestampDate.before(new Date(availability.getEndTime())))) { + && (timestampDate.after(new Date(availability.getStartTime())) && timestampDate.before(new Date( + availability.getEndTime())))) { return true; } } @@ -367,13 +377,13 @@ public class MetricGraphData implements JsonMetricProducer { return false; }
- private boolean isAvailabilityUnknownForBar(long timestamp) { + private boolean isAvailabilityUnknownForBar(long timestamp) { Date timestampDate = new Date(timestamp); - if (null != availabilityDownList) { - for (Availability availability : availabilityDownList) { + if (null != availabilityList) { + for (Availability availability : availabilityList) { if (availability.getAvailabilityType().equals(AvailabilityType.UNKNOWN) - && (timestampDate.after(new Date(availability.getStartTime())) - && timestampDate.before(new Date(availability.getEndTime())))) { + && (timestampDate.after(new Date(availability.getStartTime())) && timestampDate.before(new Date( + availability.getEndTime())))) { return true; } } @@ -408,35 +418,4 @@ public class MetricGraphData implements JsonMetricProducer { return startTime + timeThreshold < endTime; }
- /** - * Immutable DatePair for storing the start and DateTime for an interval. - * Used in measuring downtime and unknown intervals. - * Intervals are inclusive of the startDateTime and endDateTime. - */ -// private final class DatePair { -// -// private Date startDateTime; -// private Date endDateTime; -// -// public DatePair(Date startDateTime, Date endDateTime) { -// this.startDateTime = startDateTime; -// this.endDateTime = endDateTime; -// } -// -// public Date getStartDateTime() { -// return startDateTime; -// } -// -// public Date getEndDateTime() { -// return endDateTime; -// } -// -// @Override -// public String toString() { -// return "DatePair{" + -// "startDateTime=" + startDateTime + -// ", endDateTime=" + endDateTime + -// '}'; -// } -// } } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/MetricStackedBarGraph.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/MetricStackedBarGraph.java index 82a6d85..b663630 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/MetricStackedBarGraph.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/MetricStackedBarGraph.java @@ -59,6 +59,7 @@ public final class MetricStackedBarGraph extends AbstractGraph { global.@org.rhq.enterprise.gui.coregui.client.inventory.common.charttype.AbstractGraph::getChartTimeLabel()(), global.@org.rhq.enterprise.gui.coregui.client.inventory.common.charttype.AbstractGraph::getChartDownLabel()(), global.@org.rhq.enterprise.gui.coregui.client.inventory.common.charttype.AbstractGraph::getChartUnknownLabel()(), + global.@org.rhq.enterprise.gui.coregui.client.inventory.common.charttype.AbstractGraph::getChartNoDataLabel()(), global.@org.rhq.enterprise.gui.coregui.client.inventory.common.charttype.AbstractGraph::getChartHoverStartLabel()(), global.@org.rhq.enterprise.gui.coregui.client.inventory.common.charttype.AbstractGraph::getChartHoverEndLabel()(), global.@org.rhq.enterprise.gui.coregui.client.inventory.common.charttype.AbstractGraph::getChartHoverPeriodLabel()(), @@ -243,7 +244,7 @@ public final class MetricStackedBarGraph extends AbstractGraph { return timeScale(d.x); }) .attr("y", function (d) { - if (d.down || d.nodata) { + if (d.down || d.unknown || d.nodata) { return yScale(highBound); } else { @@ -251,7 +252,7 @@ public final class MetricStackedBarGraph extends AbstractGraph { } }) .attr("height", function (d) { - if (d.down || d.nodata) { + if (d.down || d.unknown || d.nodata) { return height - yScale(highBound) - pixelsOffHeight; } else { @@ -263,11 +264,12 @@ public final class MetricStackedBarGraph extends AbstractGraph { })
.attr("opacity", ".9") - .attr("fill", function (d, i) { + .attr("fill", function (d) { if (d.down) { return "url(#redStripes)"; - } - else if (d.nodata) { + } else if (d.unknown) { + return "url(#blueStripes)"; + }else if (d.nodata) { return "url(#grayStripes)"; } else { @@ -314,7 +316,7 @@ public final class MetricStackedBarGraph extends AbstractGraph { return isNaN(d.y) ? height : yScale(d.y); }) .attr("height", function (d) { - if (d.down || d.nodata) { + if (d.down || d.unknown || d.nodata) { return height - yScale(lowBound); } else { @@ -339,7 +341,7 @@ public final class MetricStackedBarGraph extends AbstractGraph { return isNaN(d.y) ? height : yScale(d.y)-2; }) .attr("height", function (d) { - if (d.down || d.nodata) { + if (d.down || d.unknown || d.nodata) { return height - yScale(lowBound); } else { @@ -569,6 +571,7 @@ public final class MetricStackedBarGraph extends AbstractGraph { avgValue = (d.y == undefined) ? 0 : d.y.toFixed(2);
if (d.down) { + // down availability hoverString = '<div style="text-align:left;z-index:990000;"><span style="width:50px;font-weight: bold;color:#d3d3d6";">' + chartContext.timeLabel + ': </span>' + timeFormatter(date) + '</div>' + '<div style="text-align: left;"><span style="width:50px;font-weight: bold;color:#d3d3d6"";">' + chartContext.dateLabel + ': </span>' + dateFormatter(date) + '</div>' + @@ -578,17 +581,32 @@ public final class MetricStackedBarGraph extends AbstractGraph { '<div style="text-align: right;"><span style="width:100%;font-weight:bold;color:#d3d3d6"";">'+chartContext.hoverPeriodLabel+": "+ availDuration + '</span></div>' + '<div style="text-align: right;"><span style="width:100%;font-weight: bold;color:#ff8a9a"";">'+chartContext.downLabel +'</span></div>' + '</div>'; + } else if (d.unknown) { + // unknown availability + hoverString = + '<div style="text-align:left;z-index:990000;"><span style="width:50px;font-weight: bold;color:#d3d3d6";">' + chartContext.timeLabel + ': </span>' + timeFormatter(date) + '</div>' + + '<div style="text-align: left;"><span style="width:50px;font-weight: bold;color:#d3d3d6"";">' + chartContext.dateLabel + ': </span>' + dateFormatter(date) + '</div>' + + '<hr style="width:100%;text-align: center;border: #d3d3d3 solid thin;"></hr>' + + '<div style="text-align: right;"><span style="width:100%;font-weight:bold;color:#d3d3d6"";">'+chartContext.hoverStartLabel+": "+ timeFormatter(unknownStartDate)+ '</span></div>' + + '<div style="text-align: right;"><span style="width:100%;font-weight:bold;color:#d3d3d6"";">'+chartContext.hoverEndLabel+": "+ timeFormatter(unknownEndDate) + '</span></div>' + + '<div style="text-align: right;"><span style="width:100%;font-weight:bold;color:#d3d3d6"";">'+chartContext.hoverPeriodLabel+": "+ unknownDuration + '</span></div>' + + '<div style="text-align: right;"><span style="width:100%;font-weight:bold;color:#d3d3d6"";">'+chartContext.unknownLabel+'</span></div>' + + '</div>'; } + else if (d.y == undefined) { + // no data hoverString = '<div style="text-align:left;z-index:990000;"><span style="width:50px;font-weight: bold;color:#d3d3d6";">' + chartContext.timeLabel + ': </span>' + timeFormatter(date) + '</div>' + '<div style="text-align: left;"><span style="width:50px;font-weight: bold;color:#d3d3d6"";">' + chartContext.dateLabel + ': </span>' + dateFormatter(date) + '</div>' + '<hr style="width:100%;text-align: center;border: #d3d3d3 solid thin;"></hr>' + - '<div style="text-align: right;"><span style="width:100%;font-weight:bold;color:#d3d3d6"";">'+chartContext.unknownLabel+'</span></div>' + + '<div style="text-align: right;"><span style="width:100%;font-weight:bold;color:#d3d3d6"";">'+chartContext.noDataLabel+'</span></div>' + '</div>';
+ } else { + // regular bar hover hoverString = '<div style="text-align:left;z-index:990000;"><span style="width:50px;font-weight: bold;color:#d3d3d6";">' + chartContext.timeLabel + ': </span><span style="width:50px;">' + timeFormatter(date) + '</span></div>' + '<div style="text-align: left;"><span style="width:50px;font-weight: bold;color:#d3d3d6"";">' + chartContext.dateLabel + ': </span><span style="width:50px;">' + dateFormatter(date) + '</span></div>' + diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/D3GraphListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/D3GraphListView.java index 5b91df1..32524d9 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/D3GraphListView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/D3GraphListView.java @@ -70,7 +70,7 @@ public class D3GraphListView extends LocatableVLayout { private Label loadingLabel = new Label(MSG.common_msg_loading()); private UserPreferencesMeasurementRangeEditor measurementRangeEditor; private boolean useSummaryData = false; - private PageList<Availability> downAvailList; + private PageList<Availability> availabilityList; private PageList<MeasurementOOBComposite> measurementOOBCompositeList; private List<List<MeasurementDataNumericHighLowComposite>> metricsDataList;
@@ -248,14 +248,13 @@ public class D3GraphListView extends LocatableVLayout { public void onSuccess(PageList<Availability> availList) { Log.debug("\nSuccessfully queried availability in: " + (System.currentTimeMillis() - startTime) + " ms."); - downAvailList = new PageList<Availability>(); + availabilityList = new PageList<Availability>(); for (Availability availability : availList) { - if (availability.getAvailabilityType().equals(AvailabilityType.DOWN) - || availability.getAvailabilityType().equals(AvailabilityType.DISABLED)) { - downAvailList.add(availability); + if (!availability.getAvailabilityType().equals(AvailabilityType.UP)){ + availabilityList.add(availability); } } - Log.debug("Down avail list: " + downAvailList.size()); + Log.debug("avail list size: " + availabilityList.size()); countDownLatch.countDown(); } }); @@ -312,7 +311,7 @@ public class D3GraphListView extends LocatableVLayout { int i = 0; for (MeasurementDefinition measurementDefinition : measurementDefinitions) { if (summaryIds.contains(measurementDefinition.getId())) { - buildSingleGraph(downAvailList, measurementOOBCompositeList, measurementDefinition, + buildSingleGraph(availabilityList, measurementOOBCompositeList, measurementDefinition, measurementData.get(i), 250); } i++; @@ -332,12 +331,12 @@ public class D3GraphListView extends LocatableVLayout { if (null != selectedDefinitionId) { // single graph case if (measurementId == selectedDefinitionId) { - buildSingleGraph(downAvailList, measurementOOBCompositeList, measurementDefinition, + buildSingleGraph(availabilityList, measurementOOBCompositeList, measurementDefinition, metric, 300); } } else { // multiple graph case - buildSingleGraph(downAvailList, measurementOOBCompositeList, measurementDefinition, + buildSingleGraph(availabilityList, measurementOOBCompositeList, measurementDefinition, metric, 300); } } diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties index 0336da9..eb9b95c 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties @@ -9,7 +9,8 @@ chart_date_label = Date chart_down_label = Down chart_time_label = Time -chart_unknown_label = No Data +chart_unknown_label = Unknown +chart_no_data_label = No Data chart_title_avg_label = Avg chart_title_min_label = Min chart_title_peak_label = Peak diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties index 5aaf834..420a0fb 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties @@ -32,7 +32,8 @@ ##chart_date_label = Date ##chart_down_label = Down ##chart_time_label = Time -##chart_unknown_label = No Data +##chart_unknown_label = Unknown +##chart_no_data_label = No Data ##chart_title_avg_label = Avg ##chart_title_min_label = Min ##chart_title_peak_label = Peak diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties index f868454..a6e9244 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties @@ -12,7 +12,8 @@ ##chart_date_label = Date ##chart_down_label = Down ##chart_time_label = Time -##chart_unknown_label = No Data +##chart_unknown_label = Unknown +##chart_no_data_label = No Data ##chart_title_avg_label = Avg ##chart_title_min_label = Min ##chart_title_peak_label = Peak diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties index 73beb27..4d9d8be 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties @@ -12,7 +12,8 @@ ##chart_date_label = Date ##chart_down_label = Down ##chart_time_label = Time -##chart_unknown_label = No Data +##chart_unknown_label = Unknown +##chart_no_data_label = No Data ##chart_title_avg_label = Avg ##chart_title_min_label = Min ##chart_title_peak_label = Peak diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties index 5273b92..5ad7167 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties @@ -9,7 +9,8 @@ ##chart_date_label = Date ##chart_down_label = Down ##chart_time_label = Time -##chart_unknown_label = No Data +##chart_unknown_label = Unknown +##chart_no_data_label = No Data ##chart_title_avg_label = Avg ##chart_title_min_label = Min ##chart_title_peak_label = Peak diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties index 45a494d..744f456 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties @@ -9,7 +9,8 @@ ##chart_date_label = Date ##chart_down_label = Down ##chart_time_label = Time -##chart_unknown_label = No Data +##chart_unknown_label = Unknown +##chart_no_data_label = No Data ##chart_title_avg_label = Avg ##chart_title_min_label = Min ##chart_title_peak_label = Peak diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties index 624a2a6..033398a 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties @@ -9,7 +9,8 @@ ##chart_date_label = Date ##chart_down_label = Down ##chart_time_label = Time -##chart_unknown_label = No Data +##chart_unknown_label = Unknown +##chart_no_data_label = No Data ##chart_title_avg_label = Avg ##chart_title_min_label = Min ##chart_title_peak_label = Peak diff --git a/modules/enterprise/gui/coregui/src/main/webapp/js/rhq.js b/modules/enterprise/gui/coregui/src/main/webapp/js/rhq.js index 84550c7..03e0341 100644 --- a/modules/enterprise/gui/coregui/src/main/webapp/js/rhq.js +++ b/modules/enterprise/gui/coregui/src/main/webapp/js/rhq.js @@ -9,7 +9,7 @@ * A ChartContext can be passed to multiple chart renders to display different chart types * of that data. */ -var ChartContext = function (chartId, chartHeight, metricsData, xAxisLabel, yAxisLabel, yAxisUnits, minChartTitle, avgChartTitle, peakChartTitle, dateLabel, timeLabel, downLabel, unknownLabel, hoverStartLabel,hoverEndLabel, hoverPeriodLabel, hoverBarLabel) +var ChartContext = function (chartId, chartHeight, metricsData, xAxisLabel, yAxisLabel, yAxisUnits, minChartTitle, avgChartTitle, peakChartTitle, dateLabel, timeLabel, downLabel, unknownLabel, noDataLabel, hoverStartLabel,hoverEndLabel, hoverPeriodLabel, hoverBarLabel) { "use strict"; this.chartId = chartId; @@ -27,6 +27,7 @@ var ChartContext = function (chartId, chartHeight, metricsData, xAxisLabel, yAxi this.timeLabel = timeLabel; this.downLabel = downLabel; this.unknownLabel = unknownLabel; + this.noDataLabel = noDataLabel; this.hoverStartLabel = hoverStartLabel; this.hoverEndLabel = hoverEndLabel; this.hoverPeriodLabel = hoverPeriodLabel;
commit bf365ee5ff4b9729da24e3d8dcf2e9b9d9c28aa4 Author: Mike Thompson mithomps@redhat.com Date: Tue Feb 5 08:48:35 2013 -0800
Charting - eliminate unsafe javascript eval and replace with jQuery.parseJSON instead, also ensure json is proper by adding quotes around attributes.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/MetricGraphData.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/MetricGraphData.java index 7943b7e..c88acaa 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/MetricGraphData.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/MetricGraphData.java @@ -69,7 +69,7 @@ public class MetricGraphData implements JsonMetricProducer { private MeasurementUnits adjustedMeasurementUnits; private MeasurementDefinition definition; private List<MeasurementDataNumericHighLowComposite> metricData; - private List<DatePair> unknownIntervalList; + //private List<DatePair> unknownIntervalList; private PageList<Availability> availabilityDownList; private PageList<MeasurementOOBComposite> measurementOOBCompositeList; private MeasurementOOBComposite lastOOB; @@ -267,7 +267,7 @@ public class MetricGraphData implements JsonMetricProducer { calculateOOB();
for (MeasurementDataNumericHighLowComposite measurement : metricData) { - sb.append("{ x:" + measurement.getTimestamp() + ","); + sb.append("{ "x":" + measurement.getTimestamp() + ",");
if (null != availabilityDownList) { // loop through the avail down intervals @@ -279,23 +279,23 @@ public class MetricGraphData implements JsonMetricProducer { // @todo: when resource is down measurement is null NPE if (measurement.getTimestamp() >= availability.getStartTime() && measurement.getTimestamp() <= availability.getEndTime()) { - sb.append(" availStart:" + availability.getStartTime() + ", "); - sb.append(" availEnd:" + availability.getEndTime() + ", "); + sb.append(" "availStart":" + availability.getStartTime() + ", "); + sb.append(" "availEnd":" + availability.getEndTime() + ", "); long availDuration = availability.getEndTime() - availability.getStartTime(); String availDurationString = MeasurementConverterClient.format((double) availDuration, MeasurementUnits.MILLISECONDS, true); - sb.append(" availDuration: "" + availDurationString + "", "); + sb.append(" "availDuration": "" + availDurationString + "", "); break; } } } if (null != lastOOB) { - sb.append(" baselineMin:" + lastOOB.getBlMin() + ", "); - sb.append(" baselineMax:" + lastOOB.getBlMax() + ", "); + sb.append(" "baselineMin":" + lastOOB.getBlMin() + ", "); + sb.append(" "baselineMax":" + lastOOB.getBlMax() + ", "); }
if (isAvailabilityDownOrDisabledForBar(measurement.getTimestamp())) { - sb.append(" down:true, "); + sb.append(" "down":true, "); } else { if (!Double.isNaN(measurement.getValue())) {
@@ -309,28 +309,14 @@ public class MetricGraphData implements JsonMetricProducer { adjustedMeasurementUnits = newValue.getUnits(); gotAdjustedMeasurementUnits = true; } - sb.append(" barDuration: "" + barDurationString + "", "); - sb.append(" high:" + newHigh.getValue() + ","); - sb.append(" low:" + newLow.getValue() + ","); - sb.append(" y:" + newValue.getValue() + "},"); + sb.append(" "barDuration": "" + barDurationString + "", "); + sb.append(" "high":" + newHigh.getValue() + ","); + sb.append(" "low":" + newLow.getValue() + ","); + sb.append(" "y":" + newValue.getValue() + "},"); } else { if (!isAvailabilityDownOrDisabledForBar(measurement.getTimestamp())) { // NaN measure no measurement was collected - // loop through the unknown intervals - for (DatePair datePair : unknownIntervalList) { - // we know we are in an interval - if (measurement.getTimestamp() >= datePair.getStartDateTime().getTime() - && measurement.getTimestamp() <= datePair.getEndDateTime().getTime()) { - sb.append(" unknownStart:" + datePair.getStartDateTime().getTime() + ", "); - sb.append(" unknownEnd:" + datePair.getEndDateTime().getTime() + ", "); - long unknownDuration = datePair.getEndDateTime().getTime() - datePair.getStartDateTime().getTime(); - String unknownDurationString = MeasurementConverterClient.format((double) unknownDuration, - MeasurementUnits.MILLISECONDS, true); - sb.append(" unknownDuration: "" + unknownDurationString + "", "); - break; - } - } - sb.append(" nodata:true },"); + sb.append(" "nodata":true },"); } else { sb.append(" },"); } @@ -427,30 +413,30 @@ public class MetricGraphData implements JsonMetricProducer { * Used in measuring downtime and unknown intervals. * Intervals are inclusive of the startDateTime and endDateTime. */ - private final class DatePair { - - private Date startDateTime; - private Date endDateTime; - - public DatePair(Date startDateTime, Date endDateTime) { - this.startDateTime = startDateTime; - this.endDateTime = endDateTime; - } - - public Date getStartDateTime() { - return startDateTime; - } - - public Date getEndDateTime() { - return endDateTime; - } - - @Override - public String toString() { - return "DatePair{" + - "startDateTime=" + startDateTime + - ", endDateTime=" + endDateTime + - '}'; - } - } +// private final class DatePair { +// +// private Date startDateTime; +// private Date endDateTime; +// +// public DatePair(Date startDateTime, Date endDateTime) { +// this.startDateTime = startDateTime; +// this.endDateTime = endDateTime; +// } +// +// public Date getStartDateTime() { +// return startDateTime; +// } +// +// public Date getEndDateTime() { +// return endDateTime; +// } +// +// @Override +// public String toString() { +// return "DatePair{" + +// "startDateTime=" + startDateTime + +// ", endDateTime=" + endDateTime + +// '}'; +// } +// } } diff --git a/modules/enterprise/gui/coregui/src/main/webapp/js/rhq.js b/modules/enterprise/gui/coregui/src/main/webapp/js/rhq.js index f78bc99..84550c7 100644 --- a/modules/enterprise/gui/coregui/src/main/webapp/js/rhq.js +++ b/modules/enterprise/gui/coregui/src/main/webapp/js/rhq.js @@ -16,7 +16,7 @@ var ChartContext = function (chartId, chartHeight, metricsData, xAxisLabel, yAxi this.chartHandle = "#rChart-" + this.chartId; this.chartSelection = this.chartHandle + " svg"; this.chartHeight = chartHeight; - this.data = eval(metricsData); // make into json + this.data = jQuery.parseJSON(metricsData); // make into json this.xAxisLabel = xAxisLabel; this.yAxisLabel = yAxisLabel; this.yAxisUnits = yAxisUnits;
rhq-commits@lists.fedorahosted.org