modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/groups/graph/ResourceGroupD3GraphPortlet.java | 14
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/resource/graph/ResourceD3GraphPortlet.java | 14
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/MetricGraphData.java | 15
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/charttype/MetricStackedBarGraph.java | 226 +++++-----
4 files changed, 151 insertions(+), 118 deletions(-)
New commits:
commit bc4978114babc93feb13fe9f0c41c68de6e9fb41
Author: Mike Thompson <mithomps(a)redhat.com>
Date: Fri Apr 5 08:01:20 2013 -0700
Fix NPE condition when autorefreshing a dashboard portlet graph before it has been configured (it has been added but not configured).
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/groups/graph/ResourceGroupD3GraphPortlet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/groups/graph/ResourceGroupD3GraphPortlet.java
index 84177c0..75e398e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/groups/graph/ResourceGroupD3GraphPortlet.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/groups/graph/ResourceGroupD3GraphPortlet.java
@@ -49,6 +49,7 @@ import org.rhq.enterprise.gui.coregui.client.inventory.common.charttype.MetricSt
import org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.monitoring.ResourceGroupMetricD3GraphView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.ResourceScheduledMetricDatasource;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.SingleResourceGroupSelector;
+import org.rhq.enterprise.gui.coregui.client.util.Log;
/**
* @author Greg Hinkle
@@ -80,15 +81,23 @@ public class ResourceGroupD3GraphPortlet extends ResourceGroupMetricD3GraphView
* combination to be valid in multiple dashboards.
*/
public String getFullChartId(){
- return "rChart-"+ graph.getMetricGraphData().getChartId() +"-"+portletWindow.getStoredPortlet().getId();
+ if(portletWindow != null && graph != null && graph.getMetricGraphData() != null){
+ return "rChart-"+ graph.getMetricGraphData().getChartId() +"-"+portletWindow.getStoredPortlet().getId();
+ } else {
+ // handle the case where the portlet has not been configured yet
+ return "";
+ }
}
public void configure(PortletWindow portletWindow, DashboardPortlet storedPortlet) {
+ Log.debug("ResourceGroupPortlet.configure");
if (null == this.portletWindow && null != portletWindow) {
this.portletWindow = portletWindow;
}
- setMetricGraphData(MetricGraphData.createForDashboard(portletWindow.getStoredPortlet().getId()));
+ destroyMembers();
+
+ setGraph(new MetricStackedBarGraph(MetricGraphData.createForDashboard(portletWindow.getStoredPortlet().getId())));
if ((null == storedPortlet) || (null == storedPortlet.getConfiguration())) {
return;
@@ -103,6 +112,7 @@ public class ResourceGroupD3GraphPortlet extends ResourceGroupMetricD3GraphView
if (propertySimple != null && propertySimple.getIntegerValue() != null)
setDefinitionId(propertySimple.getIntegerValue());
}
+ Log.debug("ResourceGroupPortlet.configure.done");
}
public Canvas getHelpCanvas() {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/resource/graph/ResourceD3GraphPortlet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/resource/graph/ResourceD3GraphPortlet.java
index d39f35a..b99c200 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/resource/graph/ResourceD3GraphPortlet.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/resource/graph/ResourceD3GraphPortlet.java
@@ -91,6 +91,7 @@ public class ResourceD3GraphPortlet extends ResourceMetricD3Graph implements Aut
if (null == this.portletWindow && null != portletWindow) {
this.portletWindow = portletWindow;
}
+ destroyMembers();
setGraph(new MetricStackedBarGraph(MetricGraphData.createForDashboard(portletWindow.getStoredPortlet().getId())));
@@ -170,7 +171,7 @@ public class ResourceD3GraphPortlet extends ResourceMetricD3Graph implements Aut
Log.debug("Dashboard Metric data in: "
+ (System.currentTimeMillis() - startTime) + " ms.");
graph.getMetricGraphData().setMetricData(measurementData.get(0));
- drawGraph();
+ drawGraph();
}
});
break;
@@ -285,6 +286,7 @@ public class ResourceD3GraphPortlet extends ResourceMetricD3Graph implements Aut
graph.getMetricGraphData().setDefinitionId(simpleDefId.getIntegerValue());
Log.debug("Redraw Portlet for entityId: " + simple.getIntegerValue() + "-"
+ simpleDefId.getIntegerValue());
+
drawGraph();
}
@@ -297,7 +299,12 @@ public class ResourceD3GraphPortlet extends ResourceMetricD3Graph implements Aut
* combination to be valid in multiple dashboards.
*/
public String getFullChartId(){
- return "rChart-"+ graph.getMetricGraphData().getChartId() +"-"+portletWindow.getStoredPortlet().getId();
+ if(portletWindow != null && graph != null && graph.getMetricGraphData() != null){
+ return "rChart-"+ graph.getMetricGraphData().getChartId() +"-"+portletWindow.getStoredPortlet().getId();
+ } else {
+ // handle the case where the portlet has not been configured yet
+ return "";
+ }
}
public static final class Factory implements PortletViewFactory {
@@ -328,7 +335,8 @@ public class ResourceD3GraphPortlet extends ResourceMetricD3Graph implements Aut
//Custom refresh operation as we are not directly extending Table
@Override
public void refresh() {
- if (isVisible() && !isRefreshing()) {
+ if (isVisible() && !isRefreshing() ){
+ //if (isVisible() && !isRefreshing() && (null != graph.getMetricGraphData().getJsonMetrics()) ) {
drawGraph();
}
}
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 d3a00e6..4ec734b 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
@@ -153,7 +153,12 @@ public class MetricGraphData implements JsonMetricProducer {
public String getChartId() {
if(isPortalGraph){
- return entityId + "-" + definition.getId();
+ if(definition != null){
+ return entityId + "-" + definition.getId();
+ }else {
+ // case when portlet has not been configured yet
+ return "";
+ }
}else {
return entityId + "-" + definitionId;
}
@@ -244,7 +249,13 @@ public class MetricGraphData implements JsonMetricProducer {
public String getChartTitle() {
- return (entityName == null) ? definition.getDisplayName() : entityName + " - "+definition.getDisplayName();
+ if(definition != null){
+ return (entityName == null) ? definition.getDisplayName() : entityName + " - "+definition.getDisplayName();
+ }else {
+ // handle case when dashboard portlet has not been configured yet.
+ return "";
+
+ }
}
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 763bfaa..f6b191a 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
@@ -75,7 +75,6 @@ public final class MetricStackedBarGraph extends AbstractGraph {
var metricStackedBarGraph = function () {
"use strict";
// privates
-
var margin = {top: 10, right: 5, bottom: 5, left: 40},
width = 750 - margin.left - margin.right,
adjustedChartHeight = chartContext.chartHeight - 50,
@@ -99,111 +98,113 @@ public final class MetricStackedBarGraph extends AbstractGraph {
svg;
function getChartWidth() {
- return $wnd.jQuery("#"+chartContext.chartHandle).width();
+ return $wnd.jQuery("#" + chartContext.chartHandle).width();
}
function useSmallCharts() {
- console.info("Chart Width for : "+chartContext.chartHandle+" is "+getChartWidth());
+ console.info("Chart Width for : " + chartContext.chartHandle + " is " + getChartWidth());
return getChartWidth() <= smallChartThresholdInPixels;
}
function determineScale() {
var xTicks, xTickSubDivide, numberOfBarsForSmallGraph = 20;
-
- // if window is too small server up small chart
- if (useSmallCharts()) {
- console.log("Using Small Charts Profile");
- width = 250;
- xTicks = 3;
- xTickSubDivide = 2;
- chartData = chartContext.data.slice(chartContext.data.length - numberOfBarsForSmallGraph, chartContext.data.length - 1);
- }
- else {
- console.log("Using Large Charts Profile");
- // we use the width already defined above
- xTicks = 12;
- xTickSubDivide = 5;
- chartData = chartContext.data;
- }
-
- avg = $wnd.d3.mean(chartContext.data.map(function (d) {
- return d.y;
- }));
- peak = $wnd.d3.max(chartContext.data.map(function (d) {
- if (d.high != undefined) {
- return d.high;
- }
- else {
- return 0;
- }
- }));
- min = $wnd.d3.min(chartContext.data.map(function (d) {
- if (d.low != undefined) {
- return d.low;
- }
- else {
- return Number.MAX_VALUE;
- }
- }));
- // adjust the min scale so blue low line is not in axis
- determineLowBound = function (min, peak) {
- var newLow = min - ((peak - min) * 0.1);
- if (newLow < 0) {
- return 0;
+ if (chartContext.data.length > 0) {
+
+ // if window is too small server up small chart
+ if (useSmallCharts()) {
+ console.log("Using Small Charts Profile");
+ width = 250;
+ xTicks = 3;
+ xTickSubDivide = 2;
+ chartData = chartContext.data.slice(chartContext.data.length - numberOfBarsForSmallGraph, chartContext.data.length - 1);
}
else {
- return newLow;
+ console.log("Using Large Charts Profile");
+ // we use the width already defined above
+ xTicks = 12;
+ xTickSubDivide = 5;
+ chartData = chartContext.data;
}
- };
- lowBound = determineLowBound(min, peak);
- highBound = peak + ((peak - min) * 0.1);
- oobMax = $wnd.d3.max(chartContext.data.map(function (d) {
- if (d.baselineMax == undefined) {
- return 0;
- }
- else {
- return +d.baselineMax;
+
+ avg = $wnd.d3.mean(chartContext.data.map(function (d) {
+ return d.y;
+ }));
+ peak = $wnd.d3.max(chartContext.data.map(function (d) {
+ if (d.high != undefined) {
+ return d.high;
+ }
+ else {
+ return 0;
+ }
+ }));
+ min = $wnd.d3.min(chartContext.data.map(function (d) {
+ if (d.low != undefined) {
+ return d.low;
+ }
+ else {
+ return Number.MAX_VALUE;
+ }
+ }));
+ // adjust the min scale so blue low line is not in axis
+ determineLowBound = function (min, peak) {
+ var newLow = min - ((peak - min) * 0.1);
+ if (newLow < 0) {
+ return 0;
+ }
+ else {
+ return newLow;
+ }
+ };
+ lowBound = determineLowBound(min, peak);
+ highBound = peak + ((peak - min) * 0.1);
+ oobMax = $wnd.d3.max(chartContext.data.map(function (d) {
+ if (d.baselineMax == undefined) {
+ return 0;
+ }
+ else {
+ return +d.baselineMax;
+ }
+ }));
+ calcBarWidth = function () {
+ return (width / chartData.length - barOffset )
+ };
+
+ yScale = $wnd.d3.scale.linear()
+ .clamp(true)
+ .rangeRound([height, 0])
+ .domain([lowBound, highBound]);
+ yAxis = $wnd.d3.svg.axis()
+ .scale(yScale)
+ .tickSubdivide(1)
+ .ticks(5)
+ .tickSize(4, 4, 0)
+ .orient("left");
+
+
+ timeScale = $wnd.d3.time.scale()
+ .range([0, width])
+ .domain($wnd.d3.extent(chartData, function (d) {
+ return d.x;
+ }));
+
+ xAxis = $wnd.d3.svg.axis()
+ .scale(timeScale)
+ .ticks(xTicks)
+ .tickSubdivide(xTickSubDivide)
+ .tickSize(4, 4, 0)
+ .orient("bottom");
+
+ // create the actual chart group
+ chart = $wnd.d3.select("#" + chartContext.chartSelection);
+
+ svg = chart.append("g")
+ .attr("width", width + margin.left + margin.right)
+ .attr("height", height + margin.top - titleHeight - titleSpace + margin.bottom)
+ .attr("transform", "translate(" + margin.left + "," + (+titleHeight + titleSpace + margin.top) + ")");
+
+ if (!useSmallCharts()) {
+ createMinAvgPeakSidePanel(chartContext.minChartTitle, min, chartContext.avgChartTitle, avg, chartContext.peakChartTitle, peak, chartContext.yAxisUnits);
}
- }));
- calcBarWidth = function () {
- return (width / chartData.length - barOffset )
- };
-
- yScale = $wnd.d3.scale.linear()
- .clamp(true)
- .rangeRound([height, 0])
- .domain([lowBound, highBound]);
- yAxis = $wnd.d3.svg.axis()
- .scale(yScale)
- .tickSubdivide(1)
- .ticks(5)
- .tickSize(4, 4, 0)
- .orient("left");
-
-
- timeScale = $wnd.d3.time.scale()
- .range([0, width])
- .domain($wnd.d3.extent(chartData, function (d) {
- return d.x;
- }));
-
- xAxis = $wnd.d3.svg.axis()
- .scale(timeScale)
- .ticks(xTicks)
- .tickSubdivide(xTickSubDivide)
- .tickSize(4, 4, 0)
- .orient("bottom");
-
- // create the actual chart group
- chart = $wnd.d3.select("#"+chartContext.chartSelection);
-
- svg = chart.append("g")
- .attr("width", width + margin.left + margin.right)
- .attr("height", height + margin.top - titleHeight - titleSpace + margin.bottom)
- .attr("transform", "translate(" + margin.left + "," + (+titleHeight + titleSpace + margin.top) + ")");
-
- if (!useSmallCharts()) {
- createMinAvgPeakSidePanel(chartContext.minChartTitle, min, chartContext.avgChartTitle, avg, chartContext.peakChartTitle, peak, chartContext.yAxisUnits);
}
}
@@ -253,7 +254,6 @@ public final class MetricStackedBarGraph extends AbstractGraph {
.attr("y", yBase + yInc)
.text(avgValue.toFixed(decimalPlaces) + " " + uom);
-
// min
chart.append("text")
.attr("class", "minLabel")
@@ -600,23 +600,27 @@ public final class MetricStackedBarGraph extends AbstractGraph {
// Public API
draw: function (chartContext) {
"use strict";
- console.group("Creating Chart: %s --> %s", chartContext.chartSelection, chartContext.chartTitle);
- console.time("chart");
-
- determineScale();
- createHeader(chartContext.chartTitle);
-
- createYAxisGridLines();
- createStackedBars();
- createXandYAxes();
- createAvgLines();
- if (oobMax > 0) {
- console.info("OOB Data Exists!");
- createOOBLines();
+ // Guard condition that can occur when a portlet has not been configured yet
+ if (chartContext.data.length > 0) {
+ console.group("Creating Chart: %s --> %s", chartContext.chartSelection, chartContext.chartTitle);
+ console.time("chart");
+
+
+ determineScale();
+ createHeader(chartContext.chartTitle);
+
+ createYAxisGridLines();
+ createStackedBars();
+ createXandYAxes();
+ createAvgLines();
+ if (oobMax > 0) {
+ console.info("OOB Data Exists!");
+ createOOBLines();
+ }
+ createHovers(chartContext);
+ console.timeEnd("chart");
+ console.groupEnd();
}
- createHovers(chartContext);
- console.timeEnd("chart");
- console.groupEnd();
}
}; // end public closure
}();