modules/enterprise/gui/coregui/pom.xml
| 15
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/IconEnum.java
| 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
| 10
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/AbstractMetricGraph.java
| 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/ButtonBarDateTimeRangeEditor.java
| 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/MetricGraphData.java
| 11
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/AvailabilityLineGraphType.java
| 311 -------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/AvailabilityOverUnderGraphType.java
| 13
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/LineMetricGraph.java
| 158 ---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/StackedBarMetricGraphImpl.java
| 9
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/D3GroupGraphListView.java
| 115 +-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/table/CompositeGroupMultiLineGraphListView.java
| 79 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/DashboardLinkUtility.java
| 258 ++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
| 33
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
| 204 -----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/D3GraphListView.java
| 308 +++----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/MetricD3Graph.java
| 27
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/avail/ResourceAvailabilityView.java
| 399 ----------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/AddToDashboardComponent.java
| 185 ++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MeasurementTableView.java
| 237 -----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsResourceView.java
| 167 ++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsTableDataSource.java
| 213 ++++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsTableView.java
| 385 +++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsViewDataSource.java
| 307 +++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/ResourceMetricAvailabilityView.java
| 208 +++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/searchbar/BasicSearchStrategy.java
| 15
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/enhanced/Enhanced.java
| 2
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
| 7
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties
| 5
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
| 5
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
| 5
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties
| 5
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
| 5
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties
| 5
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
| 5
modules/enterprise/gui/coregui/src/main/webapp/js/rhq.js
| 4
36 files changed, 2078 insertions(+), 1649 deletions(-)
New commits:
commit 97003022a49e9e534fd54488966eb89950760c39
Author: Mike Thompson <mithomps(a)redhat.com>
Date: Thu Jul 25 14:16:38 2013 -0700
[BZ 988574] - Consolidated Metrics Screen - UXD Redesign
diff --git a/modules/enterprise/gui/coregui/pom.xml
b/modules/enterprise/gui/coregui/pom.xml
index 969ab8e..353f4d9 100644
--- a/modules/enterprise/gui/coregui/pom.xml
+++ b/modules/enterprise/gui/coregui/pom.xml
@@ -19,7 +19,7 @@
<properties>
<!-- dependency versions -->
- <gwt.version>2.5.0</gwt.version>
+ <gwt.version>${gwt.version}</gwt.version>
<smartgwt.version>3.0</smartgwt.version>
<!-- If this is too much memory to allocate to your gwt:debug process then
override this property in
@@ -136,16 +136,7 @@
</dependency>
- <!-- the GWT graphing library (note, this provides jquery 1.3.2. If we get rid
of GFlot we will need
- to provide jquery explcitly for jquery.sparkline support. See
CoreGUI.gwt.xml for the jquery.sparkline
- declaration and coregui/webapp/js for the lib inclusion.) -->
- <!-- NOTE: soon to be deprecated by d3.js -->
- <dependency>
- <groupId>com.googlecode.gflot</groupId>
- <artifactId>gflot</artifactId>
- <version>2.4.3</version>
- <scope>provided</scope>
- </dependency>
+
<!-- for file uploads -->
<dependency>
@@ -245,7 +236,7 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>gwt-maven-plugin</artifactId>
- <version>2.5.0</version>
+ <version>${gwt.version}</version>
<configuration>
<noServer>true</noServer>
<inplace>false</inplace>
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/IconEnum.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/IconEnum.java
index d11467a..b48a712 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/IconEnum.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/IconEnum.java
@@ -114,6 +114,12 @@ public enum IconEnum {
STORAGE_NODE("global/StorageNode_16.png",
"global/StorageNode_24.png"),
/////////////////////////////
+ // General
+ /////////////////////////////
+ EXPANDED_ICON("[SKIN]/ListGrid/row_expanded.png"),
+ COLLAPSED_ICON("[SKIN]/ListGrid/row_collapsed.png"),
+
+ /////////////////////////////
// Resource Specific Tabs
/////////////////////////////
CALLTIME("global/Recent_16.png", "global/Recent_24.png");
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
index 4cfe199..4ce05d2 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
@@ -1202,16 +1202,15 @@ public class Table<DS extends RPCDataSource> extends
EnhancedHLayout implements
}
if (hiddenItem != null) {
- Log.debug("Found hidden items");
// Add the hidden item if it exists
FormItem[] tmpItems = new FormItem[items.length + 1];
System.arraycopy(items, 0, tmpItems, 0, items.length);
tmpItems[items.length] = hiddenItem;
items = tmpItems;
}
- for (FormItem item : items) {
- Log.debug(" ******** Form Items sent: " + item.getName() +
": " + item.getValue());
- }
+// for (FormItem item : items) {
+// Log.debug(" ******** Form Items sent: " + item.getName()
+ ": " + item.getValue());
+// }
super.setItems(items);
}
@@ -1223,19 +1222,16 @@ public class Table<DS extends RPCDataSource> extends
EnhancedHLayout implements
@Override
public void onKeyPress(KeyPressEvent event) {
if (event.getKeyName().equals("Enter")) {
- Log.debug("Table.TableFilter Pressed Enter key");
if (null != searchBarItem) {
if (searchBarItem.getSearchBar().isFilterEnabled()) {
TextItem searchTextItem =
searchBarItem.getSearchBar().getSearchTextItem();
String searchBarValue = searchTextItem.getValueAsString();
String hiddenValue = (String) hiddenItem.getValue();
- Log.debug("Table.TableFilter searchBarValue :" +
searchBarValue + ", hiddenValue" + hiddenValue);
// Only send a fetch request if the user actually changed the
search expression.
if (!equals(searchBarValue, hiddenValue)) {
hiddenItem.setValue(searchBarValue);
- Log.debug("Table.TableFilter
fetchFilteredTableData");
fetchFilteredTableData();
}
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/AbstractMetricGraph.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/AbstractMetricGraph.java
index e75b65a..ace6154 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/AbstractMetricGraph.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/AbstractMetricGraph.java
@@ -202,6 +202,10 @@ public abstract class AbstractMetricGraph extends VLayout implements
HasD3Metric
return metricGraphData.getPortalId();
}
+ public boolean isHideLegend(){
+ return metricGraphData.isHideLegend();
+ }
+
public void setGraphListView(AbstractD3GraphListView graphListView) {
this.graphListView = graphListView;
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/ButtonBarDateTimeRangeEditor.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/ButtonBarDateTimeRangeEditor.java
index 2075783..b4f1354 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/ButtonBarDateTimeRangeEditor.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/ButtonBarDateTimeRangeEditor.java
@@ -77,7 +77,7 @@ public class ButtonBarDateTimeRangeEditor extends EnhancedVLayout {
prefs = measurementUserPreferences.getMetricRangePreferences();
Log.debug("ButtonBarDateTimeRangeEditor initialized with start Date: "
+ new Date(prefs.begin) + " end Date: "
+ new Date(prefs.end));
- createButtons();
+ //createButtons();
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/MetricGraphData.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/MetricGraphData.java
index ecd3b46..5ae392f 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/MetricGraphData.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/MetricGraphData.java
@@ -73,6 +73,7 @@ public class MetricGraphData implements JsonMetricProducer {
private MeasurementOOBComposite lastOOB;
private Integer chartHeight;
private boolean isPortalGraph;
+ private boolean hideLegend;
private MetricGraphData(int portalId) {
@@ -249,6 +250,14 @@ public class MetricGraphData implements JsonMetricProducer {
return isPortalGraph;
}
+ public boolean isHideLegend() {
+ return hideLegend;
+ }
+
+ public void setHideLegend(boolean hideLegend) {
+ this.hideLegend = hideLegend;
+ }
+
public String getChartTitle() {
if(definition != null){
@@ -380,8 +389,8 @@ public class MetricGraphData implements JsonMetricProducer {
* @see StackedBarMetricGraphImpl
*/
public boolean showBarAvgTrendLine() {
+ int numberOfAggBars = 0;
for (MeasurementDataNumericHighLowComposite measurement : metricData) {
- int numberOfAggBars = 0;
boolean noValuesInCurrentBarUndefined =
(!Double.isNaN(measurement.getValue()) &&
!Double.isNaN(measurement.getHighValue()) &&
!Double.isNaN(measurement.getLowValue()));
boolean foundAggregateBar = (measurement.getValue() !=
measurement.getHighValue() || measurement.getHighValue() != measurement.getLowValue());
// if there exists a even one aggregate bar then I can short circuit this and
exit
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/AvailabilityLineGraphType.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/AvailabilityLineGraphType.java
deleted file mode 100644
index 34ca60b..0000000
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/AvailabilityLineGraphType.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2012 Red Hat, Inc.
- * All rights reserved.
- *
- * 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 version 2 of the License.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype;
-
-import java.util.Date;
-import java.util.List;
-
-import org.rhq.core.domain.measurement.Availability;
-import org.rhq.core.domain.measurement.MeasurementUnits;
-import org.rhq.core.domain.resource.group.composite.ResourceGroupAvailability;
-import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.Messages;
-import
org.rhq.enterprise.gui.coregui.client.inventory.common.graph.AvailabilityGraphType;
-import org.rhq.enterprise.gui.coregui.client.util.Log;
-import org.rhq.enterprise.gui.coregui.client.util.MeasurementConverterClient;
-
-/**
- * This is now old and for demonstration purposes only.
- * Contains the javascript chart definition for an implementation of the d3 availability
chart. This implementation is
- * just a line that changes color based on availability type: up=green, down=red,
orange=disabled, unknown=grey,
- * empty=grey, warn=yellow. This version of the availability graph shows continuous
intervals.
- * @deprecated
- * @see AvailabilityOverUnderGraphType
- *
- * @author Mike Thompson
- */
-public class AvailabilityLineGraphType implements AvailabilityGraphType {
-
- private static Messages MSG = CoreGUI.getMessages();
- private List<Availability> availabilityList;
- private List<ResourceGroupAvailability> groupAvailabilityList;
- private Integer entityId;
-
- /**
- * General constructor for stacked bar graph when you have all the data needed to
produce the graph. (This is true
- * for all cases but the dashboard portlet).
- */
- public AvailabilityLineGraphType(Integer entityId) {
- this.entityId = entityId;
- }
-
- public void setAvailabilityList(List<Availability> availabilityList) {
- this.availabilityList = availabilityList;
- }
-
- public void setGroupAvailabilityList(List<ResourceGroupAvailability>
groupAvailabilityList) {
- this.groupAvailabilityList = groupAvailabilityList;
- }
-
- public String getAvailabilityJson() {
- StringBuilder sb = new StringBuilder("[");
- if (null != availabilityList) {
- // loop through the avail intervals
- for (Availability availability : availabilityList) {
- sb.append("{ \"availType\":\"" +
availability.getAvailabilityType() + "\", ");
- sb.append(" \"availTypeMessage\":\"" +
availability.getAvailabilityType()+ "\", ");
- sb.append(" \"availStart\":" +
availability.getStartTime() + ", ");
- // last record will be null
- long endTime = availability.getEndTime() != null ?
availability.getEndTime() : (new Date()).getTime();
- sb.append(" \"availEnd\":" + endTime + ",
");
-
- long availDuration = endTime - availability.getStartTime();
- String availDurationString = MeasurementConverterClient.format((double)
availDuration,
- MeasurementUnits.MILLISECONDS, true);
- sb.append(" \"availDuration\": \"" +
availDurationString + "\" },");
-
- }
- sb.setLength(sb.length() - 1);
-
- } else if (null != groupAvailabilityList) {
- // loop through the group avail down intervals
- for (ResourceGroupAvailability groupAvailability : groupAvailabilityList) {
- // allows substitution for situations like WARN=MIXED for easier
terminology
- String availabilityTypeMessage =
(groupAvailability.getGroupAvailabilityType().equals(ResourceGroupComposite.GroupAvailabilityType.WARN))
- ? MSG.chart_hover_availability_type_warn() :
groupAvailability.getGroupAvailabilityType().name();
-
- sb.append("{ \"availType\":\"" +
groupAvailability.getGroupAvailabilityType() + "\", ");
- sb.append(" \"availTypeMessage\":\"" +
availabilityTypeMessage + "\", ");
- sb.append(" \"availStart\":" +
groupAvailability.getStartTime() + ", ");
- // last record will be null
- long endTime = groupAvailability.getEndTime() != null ?
groupAvailability.getEndTime() : (new Date())
- .getTime();
- sb.append(" \"availEnd\":" + endTime + ",
");
-
- long availDuration = endTime - groupAvailability.getStartTime();
- String availDurationString = MeasurementConverterClient.format((double)
availDuration,
- MeasurementUnits.MILLISECONDS, true);
- sb.append(" \"availDuration\": \"" +
availDurationString + "\" },");
-
- }
- sb.setLength(sb.length() - 1);
- }
-
- sb.append("]");
- Log.debug(sb.toString());
- return sb.toString();
- }
-
- /**
- * The magic JSNI to draw the charts with d3.
- */
- public native void drawJsniChart() /*-{
- console.log("Draw Availability chart");
-
- var global = this,
- // tidy up all of our interactions with java (via JSNI) thru AvailChartContext
class
- // NOTE: rhq.js has the javascript object constructors in it.
- availChartContext = new
$wnd.AvailChartContext(global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.AvailabilityLineGraphType::getChartId()(),
-
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.AvailabilityLineGraphType::getAvailabilityJson()(),
-
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.AvailabilityLineGraphType::getChartDateLabel()(),
-
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.AvailabilityLineGraphType::getChartTimeLabel()(),
-
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.AvailabilityLineGraphType::getChartHoverStartLabel()(),
-
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.AvailabilityLineGraphType::getChartHoverEndLabel()(),
-
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.AvailabilityLineGraphType::getChartHoverBarLabel()(),
-
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.AvailabilityLineGraphType::getChartHoverAvailabilityLabel()(),
-
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.AvailabilityLineGraphType::getChartHoverTimeFormat()(),
-
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.AvailabilityLineGraphType::getChartHoverDateFormat()()
- );
-
-
- var availabilityGraph = function () {
- "use strict";
- // privates
-
- var margin = {top: 5, right: 5, bottom: 5, left: 40},
- barOffset = 10,
- width = 750 - margin.left - margin.right + barOffset,
- height = 20 - margin.top - margin.bottom,
- pixelsOffHeight = 0,
- svg;
-
-
- function drawBars(availChartContext) {
- var xAxisMin = $wnd.d3.min(availChartContext.data, function (d) {
- return +d.availStart;
- }),
- xAxisMax = $wnd.d3.max(availChartContext.data, function (d) {
- return +d.availEnd;
- }),
-
- timeScale = $wnd.d3.time.scale()
- .range([0, width])
- .domain([xAxisMin, xAxisMax]),
-
- yScale = $wnd.d3.scale.linear()
- .clamp(true)
- .rangeRound([height, 0])
- .domain([0, 4]),
-
- svg =
$wnd.d3.select(availChartContext.chartSelection).append("g")
- .attr("width", width + margin.left +
margin.right)
- .attr("height", height + margin.top +
margin.bottom)
- .attr("transform", "translate(" +
margin.left + "," + margin.top + ")");
-
-
- // The gray bars at the bottom leading up
- svg.selectAll("rect.availBars")
- .data(availChartContext.data)
- .enter().append("rect")
- .attr("class", "availBars")
- .attr("x", function (d) {
- return timeScale(+d.availStart);
- })
- .attr("y", function (d) {
- return yScale(0);
- })
- .attr("height", function (d) {
- return height - yScale(4) - pixelsOffHeight;
- })
- .attr("width", function (d) {
- return timeScale(+d.availEnd) - timeScale(+d.availStart);
- })
-
- .attr("opacity", ".9")
- .attr("fill", function (d) {
- if (d.availType === 'DOWN') {
- return "#FF1919"; // red
- }
- else if (d.availType === 'DISABLED') {
- return "#FF9933"; // orange
- }
- else if (d.availType === 'UNKNOWN') {
- return "#CCC"; // gray
- }
- else if (d.availType === 'UP') {
- return "#198C19"; // green
- }
- else if (d.availType === 'WARN') {
- return "#FFFF00"; // yellow
- }
- else if (d.availType === 'EMPTY') {
- return "#CCC"; // gray
- }
- else {
- // should not ever happen, but...
- console.warn("AvailabilityType not valid.");
- return "#000"; //black
- }
- });
- }
-
- function createHovers() {
- $wnd.jQuery('svg rect.availBars').tipsy({
- gravity: 'n',
- html: true,
- trigger: 'hover',
- title: function () {
- var d = this.__data__;
- return formatHovers(d);
- },
- show: function (e, el) {
- el.css({ 'z-index': '990000'})
- }
- });
- }
-
- function formatHovers(d) {
- var hoverString,
- timeFormatter =
$wnd.d3.time.format(availChartContext.chartHoverTimeFormat),
- dateFormatter =
$wnd.d3.time.format(availChartContext.chartHoverDateFormat),
- availStart = new Date(+d.availStart),
- availEnd = new Date(+d.availEnd);
-
- hoverString =
- '<div class="chartHoverEnclosingDiv">' +
- '<div
class="chartHoverAlignRight"><span >' +
availChartContext.hoverBarAvailabilityLabel + ': </span><span
style="width:50px;">' + d.availTypeMessage +
'</span></div>' +
- '<div
class="chartHoverAlignRight"><span >' +
availChartContext.hoverStartLabel + ': </span><span
style="width:50px;">' + timeFormatter(availStart) +
'</span></div>' +
- '<div
class="chartHoverAlignRight"><span >' + ' </span><span
style="width:50px;">' + dateFormatter(availStart) +
'</span></div>' +
- '<div
class="chartHoverAlignRight"><span >' +
availChartContext.hoverEndLabel + ': </span><span
style="width:50px;">' + timeFormatter(availEnd) +
'</span></div>' +
- '<div
class="chartHoverAlignRight"><span >' + ' </span><span
style="width:50px;">' + dateFormatter(availEnd) +
'</span></div>' +
- '<div
class="chartHoverAlignRight"><span >' +
availChartContext.hoverBarLabel + ': </span><span
style="width:50px;">' + d.availDuration +
'</span></div>' +
- '</div>';
- return hoverString;
-
- }
-
- return {
- // Public API
- draw: function (chartContext) {
- "use strict";
- console.info("AvailabilityChart");
- //console.time("availabilityChart");
-
- drawBars(availChartContext);
- createHovers();
- //console.timeEnd("availabilityChart");
- }
- }; // end public closure
-
-
- }();
-
- if (availChartContext.data !== undefined && availChartContext.data.length
> 0) {
- availabilityGraph.draw(availChartContext);
- }
-
- }-*/;
-
- public String getChartId() {
- return String.valueOf(entityId);
- }
-
- public String getChartTimeLabel() {
- return MSG.chart_time_label();
- }
-
- public String getChartDateLabel() {
- return MSG.chart_date_label();
- }
-
- public String getChartHoverAvailabilityLabel() {
- return MSG.chart_hover_availability_label();
- }
-
- public String getChartHoverStartLabel() {
- return MSG.chart_hover_start_label();
- }
-
- public String getChartHoverEndLabel() {
- return MSG.chart_hover_end_label();
- }
-
- public String getChartHoverBarLabel() {
- return MSG.chart_hover_bar_label();
- }
-
- public String getChartHoverTimeFormat() {
- return MSG.chart_hover_time_format();
- }
-
- public String getChartHoverDateFormat() {
- return MSG.chart_hover_date_format();
- }
-}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/AvailabilityOverUnderGraphType.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/AvailabilityOverUnderGraphType.java
index 7c5f80a..811a579 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/AvailabilityOverUnderGraphType.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/AvailabilityOverUnderGraphType.java
@@ -311,13 +311,6 @@ public class AvailabilityOverUnderGraphType implements
AvailabilityGraphType {
});
}
- function timeFormat(formats) {
- return function(date) {
- var i = formats.length - 1, f = formats[i];
- while (!f[1](date)) f = formats[--i];
- return f[0](date);
- }
- }
function formatHovers(d) {
var timeFormatter =
$wnd.d3.time.format(availChartContext.chartHoverTimeFormat),
@@ -345,11 +338,13 @@ public class AvailabilityOverUnderGraphType implements
AvailabilityGraphType {
}();
- if (availChartContext.data !== undefined && availChartContext.data.length
> 0) {
+ console.log("Avail Data records: "+availChartContext.data.length);
+ if (typeof availChartContext.data !== 'undefined' &&
availChartContext.data.length > 0) {
availabilityGraph.draw(availChartContext);
+ console.log("Availability Chart Drawn");
}
- }-*/;
+ }-*/;
public String getChartId() {
return String.valueOf(entityId);
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/LineMetricGraph.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/LineMetricGraph.java
deleted file mode 100644
index 079b2ab..0000000
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/LineMetricGraph.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2012 Red Hat, Inc.
- * All rights reserved.
- *
- * 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 version 2 of the License.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype;
-
-import org.rhq.enterprise.gui.coregui.client.inventory.common.graph.AbstractMetricGraph;
-import org.rhq.enterprise.gui.coregui.client.inventory.common.graph.MetricGraphData;
-
-/**
- * Contains the javascript chart definition for a d3 Line graph chart.
- * NOTE: this class isn't used just provided as an example as how to create
- * other graph types.
- *
- * @author Mike Thompson
- */
-public final class LineMetricGraph extends AbstractMetricGraph {
-
- /**
- * General constructor for stacked bar graph when you have all the data needed to
- * produce the graph. (This is true for all cases but the dashboard portlet).
- */
- public LineMetricGraph(MetricGraphData metricGraphData) {
- setMetricGraphData(metricGraphData);
- }
-
- /**
- * The magic JSNI to draw the charts with d3.
- */
- public native void drawJsniChart() /*-{
- console.log("Draw Metric Line jsni chart");
- var global = this,
- chartId =
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.MetricGraphData::getChartId()(),
- chartHandle = "#rChart-"+chartId,
- chartSelection = chartHandle + " svg",
- json =
$wnd.jQuery.parseJSON(global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.MetricGraphData::getJsonMetrics()()),
- yAxisLabel =
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.MetricGraphData::getChartTitle()(),
- yAxisUnits =
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.MetricGraphData::getYAxisUnits()(),
- xAxisLabel =
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.MetricGraphData::getXAxisTitle()();
-
- console.log("chart id: "+chartSelection );
-
console.log(global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.MetricGraphData::getJsonMetrics()());
-
-
- function draw(data){
- "use strict";
-
- var margin = {top: 10, right: 5, bottom: 30, left: 70},
- width = 400 - margin.left - margin.right,
- height = 150 - margin.top - margin.bottom;
-
- var timeScale = $wnd.d3.time.scale()
- .range([0, width])
- .domain($wnd.d3.extent(data, function(d) { return d.x; }));
-
- var yScale = $wnd.d3.scale.linear()
- .rangeRound([height, 0])
- .domain([$wnd.d3.min(data.map(function(x) {return x.low;})),
$wnd.d3.max(data.map(function(x){return x.high;}))]);
-
- var xAxis = $wnd.d3.svg.axis()
- .scale(timeScale)
- .ticks(5)
- .orient("bottom");
-
- var yAxis = $wnd.d3.svg.axis()
- .scale(yScale)
- .ticks(5)
- .orient("left");
-
- var interpolation = "basis";
-
- var line = $wnd.d3.svg.line()
- .interpolate(interpolation)
- .x(function(d) { return timeScale(d.x); })
- .y(function(d) { return yScale(+d.y); });
-
- var highLine = $wnd.d3.svg.line()
- .interpolate(interpolation)
- .x(function(d) { return timeScale(d.x); })
- .y(function(d) { return yScale(+d.high); });
-
- var lowLine = $wnd.d3.svg.line()
- .interpolate(interpolation)
- .x(function(d) { return timeScale(d.x); })
- .y(function(d) { return yScale(+d.low); });
-
- var svg = $wnd.d3.select(chartSelection).append("g")
- .attr("width", width + margin.left + margin.right)
- .attr("height", height + margin.top + margin.bottom)
- .attr("transform", "translate(" + margin.left +
"," + margin.top + ")");
-
- svg.append("g")
- .attr("class", "x axis")
- .attr("transform", "translate(0," + height +
")")
- .call(xAxis);
-
-
- svg.append("g")
- .attr("class", "y axis")
- .call(yAxis)
- .append("text")
- .attr("transform", "rotate(-90)")
- .attr("y", -60)
- .attr("dy", ".71em")
- .style("text-anchor", "end")
- .text(yAxisUnits === "NONE" ? "" : yAxisUnits);
-
- console.log("finished axes");
-
- svg.append("path")
- .datum(data)
- .attr("class", "line")
- .attr("fill", "none")
- .attr("stroke", "steelblue")
- .attr("stroke-width", "2")
- .attr("d", line);
-
- svg.append("path")
- .datum(data)
- .attr("class", "highLine")
- .attr("fill", "none")
- .attr("stroke", "red")
- .attr("stroke-width", "1.5")
- //.attr("stroke-dasharray", "20,10,5,5,5,10")
- .attr("stroke-dasharray", "5,5")
- .attr("stroke-opacity", ".3")
- .attr("d", highLine);
-
- svg.append("path")
- .datum(data)
- .attr("class", "lowLine")
- .attr("fill", "none")
- .attr("stroke", "blue")
- .attr("stroke-width", "1.5")
- .attr("stroke-dasharray", "5,5")
- .attr("stroke-opacity", ".3")
- .attr("d", lowLine);
-
- console.log("finished paths");
- }(data);
-
- }-*/;
-
-}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/StackedBarMetricGraphImpl.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/StackedBarMetricGraphImpl.java
index 9058ea5..67552d3 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/StackedBarMetricGraphImpl.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/graphtype/StackedBarMetricGraphImpl.java
@@ -73,7 +73,8 @@ public class StackedBarMetricGraphImpl extends AbstractMetricGraph {
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.AbstractMetricGraph::getButtonBarDateTimeFormat()(),
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.AbstractMetricGraph::getChartSingleValueLabel()(),
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.AbstractMetricGraph::getXAxisTimeFormatHours()(),
-
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.AbstractMetricGraph::getXAxisTimeFormatHoursMinutes()()
+
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.AbstractMetricGraph::getXAxisTimeFormatHoursMinutes()(),
+
global.@org.rhq.enterprise.gui.coregui.client.inventory.common.graph.AbstractMetricGraph::isHideLegend()()
);
@@ -217,8 +218,8 @@ public class StackedBarMetricGraphImpl extends AbstractMetricGraph {
.attr("transform", "translate(" +
margin.left + "," + (+titleHeight + titleSpace + margin.top) + ")");
legendUnDefined = (typeof min === 'undefined') || (typeof avg
=== 'undefined') || (typeof peak === 'undefined');
- if (!useSmallCharts() && !legendUnDefined) {
- createMinAvgPeakSidePanel(chartContext.minChartTitle, min,
chartContext.avgChartTitle, avg, chartContext.peakChartTitle, peak,
chartContext.yAxisUnits);
+ if (!(chartContext.hideLegend && !useSmallCharts())) {
+ createMinAvgPeakSidePanel(chartContext.minChartTitle, min,
chartContext.avgChartTitle, avg, chartContext.peakChartTitle, peak,
chartContext.yAxisUnits);
}
}
@@ -693,7 +694,7 @@ public class StackedBarMetricGraphImpl extends AbstractMetricGraph {
}; // end public closure
}();
- if(typeof chartContext.data !== 'undefined' &&
chartContext.data.length > 0){
+ if(typeof chartContext.data !== 'undefined' && chartContext.data
!== null && chartContext.data.length > 0){
metricStackedBarGraph.draw(chartContext);
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/D3GroupGraphListView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/D3GroupGraphListView.java
index 59737ac..a9789c6 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/D3GroupGraphListView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/D3GroupGraphListView.java
@@ -21,7 +21,6 @@ package org.rhq.enterprise.gui.coregui.client.inventory.groups.detail;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
-import java.util.EnumSet;
import java.util.List;
import com.google.gwt.core.client.GWT;
@@ -35,19 +34,17 @@ import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.DisplayType;
import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.measurement.composite.MeasurementDataNumericHighLowComposite;
-import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.resource.group.composite.ResourceGroupAvailability;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.inventory.AutoRefresh;
import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractD3GraphListView;
-import
org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.AvailabilityOverUnderGraphType;
import org.rhq.enterprise.gui.coregui.client.inventory.common.graph.MetricGraphData;
+import
org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.AvailabilityOverUnderGraphType;
import
org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.StackedBarMetricGraphImpl;
import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.MetricD3Graph;
import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.avail.AvailabilityD3GraphView;
-import
org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
import org.rhq.enterprise.gui.coregui.client.util.Log;
import org.rhq.enterprise.gui.coregui.client.util.async.CountDownLatch;
@@ -55,7 +52,7 @@ import org.rhq.enterprise.gui.coregui.client.util.async.CountDownLatch;
* Build the Group version of the View that shows the individual graph views.
* @author Mike Thompson
*/
-public final class D3GroupGraphListView extends AbstractD3GraphListView implements
AutoRefresh{
+public final class D3GroupGraphListView extends AbstractD3GraphListView implements
AutoRefresh {
private ResourceGroup resourceGroup;
private VLayout graphsVLayout;
@@ -75,7 +72,8 @@ public final class D3GroupGraphListView extends AbstractD3GraphListView
implemen
addMember(buttonBarDateTimeRangeEditor);
if (showAvailabilityGraph) {
- availabilityGraph = new
AvailabilityD3GraphView<AvailabilityOverUnderGraphType>(new
AvailabilityOverUnderGraphType(resourceGroup.getId()));
+ availabilityGraph = new
AvailabilityD3GraphView<AvailabilityOverUnderGraphType>(
+ new AvailabilityOverUnderGraphType(resourceGroup.getId()));
addMember(availabilityGraph);
}
graphsVLayout = new VLayout();
@@ -89,7 +87,6 @@ public final class D3GroupGraphListView extends AbstractD3GraphListView
implemen
addMember(graphsVLayout);
}
-
public void redrawGraphs() {
this.onDraw();
}
@@ -100,68 +97,60 @@ public final class D3GroupGraphListView extends
AbstractD3GraphListView implemen
private void buildGraphs() {
queryAvailability(EntityContext.forGroup(resourceGroup),
buttonBarDateTimeRangeEditor.getStartTime(),
- buttonBarDateTimeRangeEditor.getEndTime(), null);
+ buttonBarDateTimeRangeEditor.getEndTime(), null);
-
ResourceTypeRepository.Cache.getInstance().getResourceTypes(resourceGroup.getResourceType().getId(),
- EnumSet.of(ResourceTypeRepository.MetadataType.measurements),
- new ResourceTypeRepository.TypeLoadedCallback() {
- public void onTypesLoaded(final ResourceType type) {
+ final ArrayList<MeasurementDefinition> measurementDefinitions = new
ArrayList<MeasurementDefinition>();
- final ArrayList<MeasurementDefinition> measurementDefinitions =
new ArrayList<MeasurementDefinition>();
+ for (MeasurementDefinition def :
resourceGroup.getResourceType().getMetricDefinitions()) {
+ if (def.getDataType() == DataType.MEASUREMENT && def.getDisplayType()
== DisplayType.SUMMARY) {
+ measurementDefinitions.add(def);
+ }
+ }
- for (MeasurementDefinition def : type.getMetricDefinitions()) {
- if (def.getDataType() == DataType.MEASUREMENT &&
def.getDisplayType() == DisplayType.SUMMARY) {
- measurementDefinitions.add(def);
- }
- }
+ Collections.sort(measurementDefinitions, new
Comparator<MeasurementDefinition>() {
+ public int compare(MeasurementDefinition o1, MeasurementDefinition o2) {
+ return new
Integer(o1.getDisplayOrder()).compareTo(o2.getDisplayOrder());
+ }
+ });
- Collections.sort(measurementDefinitions, new
Comparator<MeasurementDefinition>() {
- public int compare(MeasurementDefinition o1,
MeasurementDefinition o2) {
- return new
Integer(o1.getDisplayOrder()).compareTo(o2.getDisplayOrder());
- }
- });
+ int[] measDefIdArray = new int[measurementDefinitions.size()];
+ for (int i = 0; i < measDefIdArray.length; i++) {
+ measDefIdArray[i] = measurementDefinitions.get(i).getId();
+ }
- int[] measDefIdArray = new int[measurementDefinitions.size()];
- for (int i = 0; i < measDefIdArray.length; i++) {
- measDefIdArray[i] = measurementDefinitions.get(i).getId();
- }
+
GWTServiceLookup.getMeasurementDataService().findDataForCompatibleGroup(resourceGroup.getId(),
measDefIdArray,
+ buttonBarDateTimeRangeEditor.getStartTime(),
buttonBarDateTimeRangeEditor.getEndTime(), 60,
+ new
AsyncCallback<List<List<MeasurementDataNumericHighLowComposite>>>() {
+ @Override
+ public void onFailure(Throwable caught) {
+
CoreGUI.getErrorHandler().handleError(MSG.view_resource_monitor_graphs_loadFailed(),
caught);
+
loadingLabel.setContents(MSG.view_resource_monitor_graphs_loadFailed());
+ }
-
GWTServiceLookup.getMeasurementDataService().findDataForCompatibleGroup(resourceGroup.getId(),
- measDefIdArray, buttonBarDateTimeRangeEditor.getStartTime(),
buttonBarDateTimeRangeEditor.getEndTime(), 60,
- new
AsyncCallback<List<List<MeasurementDataNumericHighLowComposite>>>() {
- @Override
- public void onFailure(Throwable caught) {
-
CoreGUI.getErrorHandler().handleError(MSG.view_resource_monitor_graphs_loadFailed(),
- caught);
-
loadingLabel.setContents(MSG.view_resource_monitor_graphs_loadFailed());
- }
-
- @Override
- public void
onSuccess(List<List<MeasurementDataNumericHighLowComposite>> result) {
- if (result.isEmpty()) {
-
loadingLabel.setContents(MSG.view_resource_monitor_graphs_noneAvailable());
- } else {
- loadingLabel.hide();
- int i = 0;
- for
(List<MeasurementDataNumericHighLowComposite> data : result) {
-
buildIndividualGraph(measurementDefinitions.get(i++), data);
- }
- // There is a weird timing case when
availabilityGraph can be null
- if (availabilityGraph != null) {
-
availabilityGraph.setGroupAvailabilityList(groupAvailabilityList);
- new Timer(){
- @Override
- public void run() {
- availabilityGraph.drawJsniChart();
- }
- }.schedule(150);
- }
+ @Override
+ public void
onSuccess(List<List<MeasurementDataNumericHighLowComposite>> result) {
+ if (result.isEmpty()) {
+
loadingLabel.setContents(MSG.view_resource_monitor_graphs_noneAvailable());
+ } else {
+ loadingLabel.hide();
+ int i = 0;
+ for (List<MeasurementDataNumericHighLowComposite> data :
result) {
+ buildIndividualGraph(measurementDefinitions.get(i++), data);
+ }
+ // There is a weird timing case when availabilityGraph can be
null
+ if (availabilityGraph != null) {
+
availabilityGraph.setGroupAvailabilityList(groupAvailabilityList);
+ new Timer() {
+ @Override
+ public void run() {
+ availabilityGraph.drawJsniChart();
}
- }
- });
-
+ }.schedule(150);
+ }
+ }
}
});
+
}
protected void queryAvailability(final EntityContext groupContext, Long startTime,
Long endTime,
@@ -197,7 +186,7 @@ public final class D3GroupGraphListView extends
AbstractD3GraphListView implemen
List<MeasurementDataNumericHighLowComposite> data) {
MetricGraphData metricGraphData =
MetricGraphData.createForResourceGroup(resourceGroup.getId(),
- resourceGroup.getName(), measurementDefinition, data );
+ resourceGroup.getName(), measurementDefinition, data);
StackedBarMetricGraphImpl graph = GWT.create(StackedBarMetricGraphImpl.class);
graph.setMetricGraphData(metricGraphData);
@@ -207,11 +196,9 @@ public final class D3GroupGraphListView extends
AbstractD3GraphListView implemen
graphView.setWidth("95%");
graphView.setHeight(MULTI_CHART_HEIGHT);
- if(graphsVLayout != null){
+ if (graphsVLayout != null) {
graphsVLayout.addMember(graphView);
}
}
-
-
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/table/CompositeGroupMultiLineGraphListView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/table/CompositeGroupMultiLineGraphListView.java
new file mode 100644
index 0000000..101df60
--- /dev/null
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/table/CompositeGroupMultiLineGraphListView.java
@@ -0,0 +1,79 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2012 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.monitoring.table;
+
+
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.Messages;
+
+/**
+ * A MultiLine version of the Composite group single metric multiple resource charts.
+ *
+ * @author Mike Thompson
+ */
+public final class CompositeGroupMultiLineGraphListView extends
CompositeGroupD3GraphListView
+{
+ private static final Messages MSG = CoreGUI.getMessages();
+
+ public CompositeGroupMultiLineGraphListView(int groupId, int defId, boolean
isAutogroup)
+ {
+ super(groupId, defId, isAutogroup);
+ }
+
+
+
+ @Override
+ public native void drawJsniChart() /*-{
+ console.log("Draw nvd3 charts for composite multiline graph");
+ var chartId =
global.@org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.monitoring.table.CompositeGroupD3GraphListView::getChartId()(),
+ chartHandle = "#mChart-"+chartId,
+ chartSelection = chartHandle + " svg",
+ yAxisUnits =
this.@org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.monitoring.table.CompositeGroupD3GraphListView::getYAxisUnits()(),
+ xAxisLabel =
this.@org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.monitoring.table.CompositeGroupD3GraphListView::getXAxisTitle()(),
+ xAxisTimeFormat =
this.@org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.monitoring.table.CompositeGroupMultiLineGraphListView::getXAxisTimeFormatHoursMinutes()();
+ json =
eval(this.@org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.monitoring.table.CompositeGroupD3GraphListView::getJsonMetrics()());
+
+ $wnd.nv.addGraph(function() {
+ var chart = $wnd.nv.models.lineChart();
+
+ chart.xAxis.axisLabel(xAxisLabel)
+ .tickFormat(function(d) { return
$wnd.d3.time.format(xAxisTimeFormat)(new Date(d)) });
+
+ chart.yAxis
+ .axisLabel(yAxisUnits)
+ .tickFormat($wnd.d3.format('.02f'));
+
+ $wnd.d3.select(chartSelection)
+ .datum(json)
+ .transition().duration(300)
+ .call(chart);
+
+ $wnd.nv.utils.windowResize(chart.update);
+
+ return chart;
+ });
+
+ }-*/;
+
+
+
+ public String getXAxisTimeFormatHoursMinutes() {
+ return MSG.chart_xaxis_time_format_hours_minutes();
+ }
+}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/DashboardLinkUtility.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/DashboardLinkUtility.java
new file mode 100644
index 0000000..8ca1ac5
--- /dev/null
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/DashboardLinkUtility.java
@@ -0,0 +1,258 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2013 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeSet;
+
+import com.google.gwt.http.client.Request;
+import com.google.gwt.http.client.RequestBuilder;
+import com.google.gwt.http.client.RequestCallback;
+import com.google.gwt.http.client.RequestException;
+import com.google.gwt.http.client.Response;
+import com.google.gwt.user.client.History;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.widgets.menu.Menu;
+import com.smartgwt.client.widgets.menu.MenuItem;
+import com.smartgwt.client.widgets.menu.events.ClickHandler;
+import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.criteria.DashboardCriteria;
+import org.rhq.core.domain.criteria.SubjectCriteria;
+import org.rhq.core.domain.dashboard.Dashboard;
+import org.rhq.core.domain.dashboard.DashboardPortlet;
+import org.rhq.core.domain.measurement.DataType;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.measurement.MeasurementSchedule;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.Messages;
+import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
+import
org.rhq.enterprise.gui.coregui.client.dashboard.portlets.inventory.resource.graph.ResourceD3GraphPortlet;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.Log;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import
org.rhq.enterprise.gui.coregui.client.util.preferences.MeasurementUserPreferences;
+import org.rhq.enterprise.gui.coregui.client.util.preferences.UserPreferences;
+
+/**
+ * Utility Class to build menus for linking to the Dashboard.
+ * @author Jay Shaughnessy
+ * @author Greg Hinkle
+ * @author Mike Thompson
+ */
+public class DashboardLinkUtility {
+ final static Messages MSG = CoreGUI.getMessages();
+
+ private DashboardLinkUtility() {
+ }
+
+ public static MenuItem buildMetricsMenu(final ResourceType resourceType, final
Resource resource, String label) {
+
+ MenuItem measurements = new MenuItem(label);
+ final Menu measurementsSubMenu = new Menu();
+
+ DashboardCriteria criteria = new DashboardCriteria();
+ GWTServiceLookup.getDashboardService().findDashboardsByCriteria(criteria,
+ new AsyncCallback<PageList<Dashboard>>() {
+
+ public void onFailure(Throwable caught) {
+
CoreGUI.getErrorHandler().handleError(MSG.view_tree_common_contextMenu_loadFailed_dashboard(),
+ caught);
+ }
+
+ public void onSuccess(PageList<Dashboard> result) {
+ //sort the display items alphabetically
+ TreeSet<String> ordered = new TreeSet<String>();
+ Map<String, MeasurementDefinition> definitionMap = new
HashMap<String, MeasurementDefinition>();
+ for (MeasurementDefinition m : resourceType.getMetricDefinitions())
{
+ ordered.add(m.getDisplayName());
+ definitionMap.put(m.getDisplayName(), m);
+ }
+
+ for (String displayName : ordered) {
+ final MeasurementDefinition def =
definitionMap.get(displayName);
+ //only add menu items for Measurement
+ if (def.getDataType().equals(DataType.MEASUREMENT)) {
+ MenuItem defItem = new MenuItem(def.getDisplayName());
+ measurementsSubMenu.addItem(defItem);
+ Menu defSubItem = new Menu();
+ defItem.setSubmenu(defSubItem);
+
+ for (final Dashboard d : result) {
+ MenuItem addToDBItem = new MenuItem(MSG
+
.view_tree_common_contextMenu_addChartToDashboard(d.getName()));
+ defSubItem.addItem(addToDBItem);
+
+ addToDBItem.addClickHandler(new ClickHandler() {
+
+ public void onClick(MenuItemClickEvent
menuItemClickEvent) {
+ DashboardPortlet p = new DashboardPortlet(MSG
+
.view_tree_common_contextMenu_resourceGraph(), ResourceD3GraphPortlet.KEY,
+ 250);
+ p.getConfiguration()
+ .put(
+ new
PropertySimple(ResourceD3GraphPortlet.CFG_RESOURCE_ID, resource
+ .getId()));
+ p.getConfiguration().put(
+ new
PropertySimple(ResourceD3GraphPortlet.CFG_DEFINITION_ID, def.getId()));
+
+ d.addPortlet(p);
+
+
GWTServiceLookup.getDashboardService().storeDashboard(d,
+ new AsyncCallback<Dashboard>() {
+
+ public void onFailure(Throwable caught)
{
+
CoreGUI.getErrorHandler().handleError(
+
MSG.view_tree_common_contextMenu_saveChartToDashboardFailure(),
+ caught);
+ }
+
+ public void onSuccess(Dashboard result)
{
+ CoreGUI
+ .getMessageCenter()
+ .notify(
+ new Message(
+
MSG.view_tree_common_contextMenu_saveChartToDashboardSuccessful(result
+ .getName()),
Message.Severity.Info));
+ }
+ });
+
+ }
+
+ });
+
+ }
+
+ //add new menu item for adding current graphable element to
view if on Monitor/Graphs tab
+ String currentViewPath = History.getToken();
+ if (currentViewPath.contains("Monitoring/Metrics"))
{
+ MenuItem addGraphItem = new
MenuItem(MSG.common_title_add_graph_to_view());
+ defSubItem.addItem(addGraphItem);
+
+ addGraphItem.addClickHandler(new ClickHandler() {
+ public void onClick(MenuItemClickEvent
menuItemClickEvent) {
+ //generate javascript to call out to.
+ //Ex.
menuLayers.hide();addMetric('${metric.resourceId},${metric.scheduleId}')
+ if (getScheduleDefinitionId(resource,
def.getName()) > -1) {
+ final String resourceGraphElements =
resource.getId() + ","
+ + getScheduleDefinitionId(resource,
def.getName());
+
+ //Once, the portal-war will be rewritten to
GWT and operations performed
+ //within the iframe + JSF will update the
user preferences, the following
+ //2 lines could be uncommented and the lines
below them refactorized
+ //MeasurementUserPreferences
measurementPreferences = new
MeasurementUserPreferences(UserSessionManager.getUserPreferences());
+ //String selectedView =
measurementPreferences.getSelectedView(String.valueOf(resource.getId()));
+
+ final int sid =
UserSessionManager.getSessionSubject().getId();
+ SubjectCriteria c = new SubjectCriteria();
+ c.addFilterId(sid);
+
+
GWTServiceLookup.getSubjectService().findSubjectsByCriteria(c,
+ new
AsyncCallback<PageList<Subject>>() {
+ public void
onSuccess(PageList<Subject> result) {
+ if (result.size() > 0) {
+ UserPreferences uPreferences
= new UserPreferences(result
+ .get(0));
+ MeasurementUserPreferences
mPreferences = new MeasurementUserPreferences(
+ uPreferences);
+ String selectedView =
mPreferences.getSelectedView(String
+
.valueOf(resource.getId()));
+
+
addNewMetric(String.valueOf(resource.getId()),
+ selectedView,
resourceGraphElements);
+ } else {
+
Log.warn("DashboardLinkUtility: Error obtaining subject with id:" + sid);
+ }
+ }
+
+ public void onFailure(Throwable
caught) {
+
Log.warn("DashboardLinkUtility: Error obtaining subject with id:" + sid,
caught);
+ }
+ });
+ }
+ }
+ });
+ }
+ }
+ }
+
+ }
+ });
+ measurements.setSubmenu(measurementsSubMenu);
+ return measurements;
+ }
+
+ /** Locate the specific schedule definition using the definition identifier.
+ */
+ private static int getScheduleDefinitionId(Resource resource, String definitionName)
{
+ int id = -1;
+ if (resource.getSchedules() != null) {
+ boolean located = false;
+ MeasurementSchedule[] schedules = new
MeasurementSchedule[resource.getSchedules().size()];
+ resource.getSchedules().toArray(schedules);
+ for (int i = 0; (!located && i < resource.getSchedules().size());
i++) {
+ MeasurementSchedule schedule = schedules[i];
+ MeasurementDefinition definition = schedule.getDefinition();
+ if ((definition != null) &&
definition.getName().equals(definitionName)) {
+ located = true;
+ id = schedule.getId();
+ }
+ }
+ }
+ return id;
+ }
+
+ private static void addNewMetric(String id, String selectedView, String
resourceGraphElements) {
+ //construct portal.war url to access
+ String baseUrl =
"/resource/common/monitor/visibility/IndicatorCharts.do";
+ baseUrl += "?id=" + id;
+ baseUrl += "&view=" + selectedView;
+ baseUrl += "&action=addChart&metric=" + resourceGraphElements;
+ final String url = baseUrl;
+ //initiate HTTP request
+ final RequestBuilder b = new RequestBuilder(RequestBuilder.GET, baseUrl);
+
+ try {
+ b.setCallback(new RequestCallback() {
+ public void onResponseReceived(final Request request, final Response
response) {
+ Log.trace("Successfully submitted request to add graph to
view:" + url);
+
+ //kick off a page reload.
+ String currentViewPath = History.getToken();
+ CoreGUI.goToView(currentViewPath, true);
+ }
+
+ @Override
+ public void onError(Request request, Throwable t) {
+ Log.trace("Error adding Metric:" + url, t);
+ }
+ });
+ b.send();
+ } catch (RequestException e) {
+ Log.warn("Error adding Metric:" + url, e);
+ }
+
+ }
+}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
index 2d33d66..ae51195 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
@@ -66,9 +66,8 @@ import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventory
import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventory.ResourceAgentView;
import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.CalltimeView;
import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.D3GraphListView;
-import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.avail.ResourceAvailabilityView;
import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.schedules.ResourceSchedulesView;
-import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.table.MeasurementTableView;
+import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.table.MetricsResourceView;
import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.traits.TraitsView;
import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.history.ResourceOperationHistoryListView;
import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.schedule.ResourceOperationScheduleListView;
@@ -129,10 +128,8 @@ public class ResourceDetailView extends
private SubTab summaryActivity;
private SubTab summaryTimeline;
- private SubTab monitorGraphs;
private SubTab monitorMetrics;
private SubTab monitorTraits;
- private SubTab monitorAvail;
private SubTab monitorSched;
private SubTab monitorCallTime;
private SubTab inventoryChildren;
@@ -196,16 +193,11 @@ public class ResourceDetailView extends
monitoringTab = new TwoLevelTab(new ViewName("Monitoring",
MSG.view_tabs_common_monitoring()),
IconEnum.SUSPECT_METRICS);
- monitorGraphs = new SubTab(monitoringTab, new ViewName("Graphs",
MSG.view_tabs_common_graphs()), null);
-
- monitorMetrics = new SubTab(monitoringTab, new ViewName("Metrics",
"Metrics"), null);
+ monitorMetrics = new SubTab(monitoringTab, new ViewName("Metrics",
MSG.view_tabs_common_metrics()), null);
monitorTraits = new SubTab(monitoringTab, new ViewName("Traits",
MSG.view_tabs_common_traits()), null);
- monitorAvail = new SubTab(monitoringTab, new ViewName("Availability",
MSG.view_tabs_common_availability()),
- null);
monitorSched = new SubTab(monitoringTab, new ViewName("Schedules",
MSG.view_tabs_common_schedules()), null);
monitorCallTime = new SubTab(monitoringTab, new ViewName("CallTime",
MSG.view_tabs_common_calltime()), null);
- monitoringTab.registerSubTabs(monitorGraphs, monitorMetrics, monitorTraits,
monitorAvail,
- monitorSched, monitorCallTime);
+ monitoringTab.registerSubTabs( monitorMetrics, monitorTraits, monitorSched,
monitorCallTime);
tabs.add(monitoringTab);
eventsTab = new TwoLevelTab(new ViewName("Events",
MSG.view_tabs_common_events()), IconEnum.EVENTS);
@@ -395,22 +387,14 @@ public class ResourceDetailView extends
boolean visibleToIE8 = !BrowserUtility.isBrowserPreIE9();
- viewFactory = (!visibleToIE8) ? null : new ViewFactory() {
- @Override
- public Canvas createView() {
- return createD3GraphListView();
- }
- };
- updateSubTab(this.monitoringTab, this.monitorGraphs, visible, visibleToIE8,
viewFactory);
-
// visible = same test as above
viewFactory = (!visible) ? null : new ViewFactory() {
@Override
public Canvas createView() {
- return new MeasurementTableView(resource.getId());
+ return new MetricsResourceView(resource);
}
};
- updateSubTab(this.monitoringTab, this.monitorMetrics, visible, true,
viewFactory);
+ updateSubTab(this.monitoringTab, this.monitorMetrics, visible, visibleToIE8,
viewFactory);
visible = hasMetricsOfType(this.resourceComposite, DataType.TRAIT);
viewFactory = (!visible) ? null : new ViewFactory() {
@@ -421,13 +405,6 @@ public class ResourceDetailView extends
};
updateSubTab(this.monitoringTab, this.monitorTraits, visible, true,
viewFactory);
- updateSubTab(this.monitoringTab, this.monitorAvail, true, true, new ViewFactory()
{
- @Override
- public Canvas createView() {
- return new ResourceAvailabilityView(resourceComposite);
- }
- });
-
updateSubTab(this.monitoringTab, this.monitorSched,
hasMetricsOfType(this.resourceComposite, null), true,
new ViewFactory() {
@Override
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
index 071f831..a3990bb 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
@@ -32,11 +32,6 @@ import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
-import com.google.gwt.http.client.Request;
-import com.google.gwt.http.client.RequestBuilder;
-import com.google.gwt.http.client.RequestCallback;
-import com.google.gwt.http.client.RequestException;
-import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DSCallback;
@@ -60,17 +55,8 @@ import com.smartgwt.client.widgets.tree.events.DataArrivedHandler;
import com.smartgwt.client.widgets.tree.events.NodeContextClickEvent;
import com.smartgwt.client.widgets.tree.events.NodeContextClickHandler;
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.core.domain.criteria.DashboardCriteria;
import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.criteria.ResourceGroupCriteria;
-import org.rhq.core.domain.criteria.SubjectCriteria;
-import org.rhq.core.domain.dashboard.Dashboard;
-import org.rhq.core.domain.dashboard.DashboardPortlet;
-import org.rhq.core.domain.measurement.DataType;
-import org.rhq.core.domain.measurement.MeasurementDefinition;
-import org.rhq.core.domain.measurement.MeasurementSchedule;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
@@ -82,11 +68,9 @@ import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
import org.rhq.enterprise.gui.coregui.client.LinkManager;
-import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
import org.rhq.enterprise.gui.coregui.client.ViewId;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
import org.rhq.enterprise.gui.coregui.client.components.tree.EnhancedTreeNode;
-import
org.rhq.enterprise.gui.coregui.client.dashboard.portlets.inventory.resource.graph.ResourceD3GraphPortlet;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGroupGWTServiceAsync;
@@ -101,8 +85,6 @@ import
org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTyp
import org.rhq.enterprise.gui.coregui.client.util.Log;
import org.rhq.enterprise.gui.coregui.client.util.enhanced.EnhancedVLayout;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
-import
org.rhq.enterprise.gui.coregui.client.util.preferences.MeasurementUserPreferences;
-import org.rhq.enterprise.gui.coregui.client.util.preferences.UserPreferences;
/**
* @author Jay Shaughnessy
@@ -562,7 +544,7 @@ public class ResourceTreeView extends EnhancedVLayout {
resourceContextMenu.addItem(operations);
// Metric graph addition menu
- resourceContextMenu.addItem(buildMetricsMenu(resourceType, resource));
+ resourceContextMenu.addItem(DashboardLinkUtility.buildMetricsMenu(resourceType,
resource, MSG.view_tree_common_contextMenu_measurements()));
// Create Child Menu and Manual Import Menu
final Set<ResourceType> creatableChildTypes =
getCreatableChildTypes(resourceType);
@@ -725,190 +707,6 @@ public class ResourceTreeView extends EnhancedVLayout {
tree.reloadChildren(refreshNode);
}
- private MenuItem buildMetricsMenu(final ResourceType type, final Resource resource)
{
- MenuItem measurements = new
MenuItem(MSG.view_tree_common_contextMenu_measurements());
- final Menu measurementsSubMenu = new Menu();
-
- DashboardCriteria criteria = new DashboardCriteria();
- GWTServiceLookup.getDashboardService().findDashboardsByCriteria(criteria,
- new AsyncCallback<PageList<Dashboard>>() {
-
- public void onFailure(Throwable caught) {
-
CoreGUI.getErrorHandler().handleError(MSG.view_tree_common_contextMenu_loadFailed_dashboard(),
- caught);
- }
-
- public void onSuccess(PageList<Dashboard> result) {
- //sort the display items alphabetically
- TreeSet<String> ordered = new TreeSet<String>();
- Map<String, MeasurementDefinition> definitionMap = new
HashMap<String, MeasurementDefinition>();
- for (MeasurementDefinition m : type.getMetricDefinitions()) {
- ordered.add(m.getDisplayName());
- definitionMap.put(m.getDisplayName(), m);
- }
-
- for (String displayName : ordered) {
- final MeasurementDefinition def =
definitionMap.get(displayName);
- //only add menu items for Measurement
- if (def.getDataType().equals(DataType.MEASUREMENT)) {
- MenuItem defItem = new MenuItem(def.getDisplayName());
- measurementsSubMenu.addItem(defItem);
- Menu defSubItem = new Menu();
- defItem.setSubmenu(defSubItem);
-
- for (final Dashboard d : result) {
- MenuItem addToDBItem = new MenuItem(MSG
-
.view_tree_common_contextMenu_addChartToDashboard(d.getName()));
- defSubItem.addItem(addToDBItem);
-
- addToDBItem.addClickHandler(new ClickHandler() {
-
- public void onClick(MenuItemClickEvent
menuItemClickEvent) {
- DashboardPortlet p = new DashboardPortlet(MSG
-
.view_tree_common_contextMenu_resourceGraph(), ResourceD3GraphPortlet.KEY,
- 250);
- p.getConfiguration().put(
- new
PropertySimple(ResourceD3GraphPortlet.CFG_RESOURCE_ID, resource.getId()));
- p.getConfiguration().put(
- new
PropertySimple(ResourceD3GraphPortlet.CFG_DEFINITION_ID, def.getId()));
-
- d.addPortlet(p);
-
-
GWTServiceLookup.getDashboardService().storeDashboard(d,
- new AsyncCallback<Dashboard>() {
-
- public void onFailure(Throwable caught)
{
-
CoreGUI.getErrorHandler().handleError(
-
MSG.view_tree_common_contextMenu_saveChartToDashboardFailure(),
- caught);
- }
-
- public void onSuccess(Dashboard result)
{
- CoreGUI
- .getMessageCenter()
- .notify(
- new Message(
-
MSG.view_tree_common_contextMenu_saveChartToDashboardSuccessful(result
- .getName()),
Message.Severity.Info));
- }
- });
-
- }
-
- });
-
-
- }//end dashboard iteration
-
- //add new menu item for adding current graphable element to
view if on Monitor/Graphs tab
- String currentViewPath = History.getToken();
- if
(currentViewPath.contains("Monitoring/NewGraphs")) {
- MenuItem addGraphItem = new
MenuItem(MSG.common_title_add_graph_to_view());
- defSubItem.addItem(addGraphItem);
-
- addGraphItem.addClickHandler(new ClickHandler() {
- public void onClick(MenuItemClickEvent
menuItemClickEvent) {
- //generate javascript to call out to.
- //Ex.
menuLayers.hide();addMetric('${metric.resourceId},${metric.scheduleId}')
- if (getScheduleDefinitionId(resource,
def.getName()) > -1) {
- final String resourceGraphElements =
resource.getId() + ","
- + getScheduleDefinitionId(resource,
def.getName());
-
- //Once, the portal-war will be rewritten to
GWT and operations performed
- //within the iframe + JSF will update the
user preferences, the following
- //2 lines could be uncommented and the lines
below them refactorized
- //MeasurementUserPreferences
measurementPreferences = new
MeasurementUserPreferences(UserSessionManager.getUserPreferences());
- //String selectedView =
measurementPreferences.getSelectedView(String.valueOf(resource.getId()));
-
- final int sid =
UserSessionManager.getSessionSubject().getId();
- SubjectCriteria c = new SubjectCriteria();
- c.addFilterId(sid);
-
-
GWTServiceLookup.getSubjectService().findSubjectsByCriteria(c,
- new
AsyncCallback<PageList<Subject>>() {
- public void
onSuccess(PageList<Subject> result) {
- if (result.size() > 0) {
- UserPreferences uPreferences
= new UserPreferences(result
- .get(0));
- MeasurementUserPreferences
mPreferences = new MeasurementUserPreferences(
- uPreferences);
- String selectedView =
mPreferences.getSelectedView(String
-
.valueOf(resource.getId()));
-
-
addNewMetric(String.valueOf(resource.getId()),
- selectedView,
resourceGraphElements);
- } else {
- Log.trace("Error
obtaining subject with id:" + sid);
- }
- }
-
- public void onFailure(Throwable
caught) {
- Log.trace("Error obtaining
subject with id:" + sid, caught);
- }
- });
- }
- }
- });
- } // end add the "add to view" menu item
- }//end trait exclusion
- }//end measurement def iteration
-
- }
- });
- measurements.setSubmenu(measurementsSubMenu);
- return measurements;
- }
-
- private void addNewMetric(String id, String selectedView, String
resourceGraphElements) {
- //construct portal.war url to access
- String baseUrl =
"/resource/common/monitor/visibility/IndicatorCharts.do";
- baseUrl += "?id=" + id;
- baseUrl += "&view=" + selectedView;
- baseUrl += "&action=addChart&metric=" + resourceGraphElements;
- final String url = baseUrl;
- //initiate HTTP request
- final RequestBuilder b = new RequestBuilder(RequestBuilder.GET, baseUrl);
-
- try {
- b.setCallback(new RequestCallback() {
- public void onResponseReceived(final Request request, final Response
response) {
- Log.trace("Successfully submitted request to add graph to
view:" + url);
-
- //kick off a page reload.
- String currentViewPath = History.getToken();
- CoreGUI.goToView(currentViewPath, true);
- }
-
- @Override
- public void onError(Request request, Throwable t) {
- Log.trace("Error adding Metric:" + url, t);
- }
- });
- b.send();
- } catch (RequestException e) {
- Log.trace("Error adding Metric:" + url, e);
- }
- }
-
- /** Locate the specific schedule definition using the definition identifier.
- */
- private int getScheduleDefinitionId(Resource resource, String definitionName) {
- int id = -1;
- if (resource.getSchedules() != null) {
- boolean located = false;
- MeasurementSchedule[] schedules = new
MeasurementSchedule[resource.getSchedules().size()];
- resource.getSchedules().toArray(schedules);
- for (int i = 0; (!located && i < resource.getSchedules().size());
i++) {
- MeasurementSchedule schedule = schedules[i];
- MeasurementDefinition definition = schedule.getDefinition();
- if ((definition != null) &&
definition.getName().equals(definitionName)) {
- located = true;
- id = schedule.getId();
- }
- }
- }
- return id;
- }
private void setRootResource(Resource rootResource) {
this.rootResource = rootResource;
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 65893ce..8b9f327 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
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2012 Red Hat, Inc.
+ * Copyright (C) 2005-2013 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -21,7 +21,6 @@ package
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitori
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
-import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
@@ -30,7 +29,6 @@ import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Overflow;
-import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.common.EntityContext;
@@ -41,16 +39,14 @@ import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.measurement.composite.MeasurementDataNumericHighLowComposite;
import org.rhq.core.domain.measurement.composite.MeasurementOOBComposite;
import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractD3GraphListView;
-import
org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.AvailabilityOverUnderGraphType;
import org.rhq.enterprise.gui.coregui.client.inventory.common.graph.MetricGraphData;
+import
org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.AvailabilityOverUnderGraphType;
import
org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.StackedBarMetricGraphImpl;
import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.avail.AvailabilityD3GraphView;
-import
org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
import org.rhq.enterprise.gui.coregui.client.util.Log;
import org.rhq.enterprise.gui.coregui.client.util.async.Command;
import org.rhq.enterprise.gui.coregui.client.util.async.CountDownLatch;
@@ -115,17 +111,17 @@ public class D3GraphListView extends AbstractD3GraphListView {
setOverflow(Overflow.HIDDEN);
}
-
@Override
protected void onDraw() {
super.onDraw();
- Log.debug("D3GraphListView.onDraw() for: " + resource.getName()+ "
id: "+ resource.getId());
+ Log.debug("D3GraphListView.onDraw() for: " + resource.getName() +
" id: " + resource.getId());
destroyMembers();
addMember(buttonBarDateTimeRangeEditor);
if (showAvailabilityGraph) {
- availabilityGraph = new
AvailabilityD3GraphView<AvailabilityOverUnderGraphType>(new
AvailabilityOverUnderGraphType(resource.getId()));
+ availabilityGraph = new
AvailabilityD3GraphView<AvailabilityOverUnderGraphType>(
+ new AvailabilityOverUnderGraphType(resource.getId()));
addMember(availabilityGraph);
}
@@ -163,8 +159,8 @@ public class D3GraphListView extends AbstractD3GraphListView {
@Override
public void onSuccess(List<Availability> availList) {
- Log.debug("\nSuccessfully queried availability in: "
- + (System.currentTimeMillis() - timerStart) + "
ms.");
+ Log.debug("\nSuccessfully queried availability in: " +
(System.currentTimeMillis() - timerStart)
+ + " ms.");
availabilityList = availList;
if (countDownLatch != null) {
countDownLatch.countDown();
@@ -180,193 +176,179 @@ public class D3GraphListView extends AbstractD3GraphListView {
private void queryAndBuildGraphs() {
final long startTimer = System.currentTimeMillis();
- if(null != availabilityGraph){
+ if (null != availabilityGraph) {
queryAvailability(EntityContext.forResource(resource.getId()),
buttonBarDateTimeRangeEditor.getStartTime(),
buttonBarDateTimeRangeEditor.getEndTime(), null);
}
-
ResourceTypeRepository.Cache.getInstance().getResourceTypes(resource.getResourceType().getId(),
- EnumSet.of(ResourceTypeRepository.MetadataType.measurements),
- new ResourceTypeRepository.TypeLoadedCallback() {
- public void onTypesLoaded(final ResourceType type) {
+ final ArrayList<MeasurementDefinition> measurementDefinitions = new
ArrayList<MeasurementDefinition>();
+ final ArrayList<MeasurementDefinition> summaryMeasurementDefinitions = new
ArrayList<MeasurementDefinition>();
- final ArrayList<MeasurementDefinition> measurementDefinitions =
new ArrayList<MeasurementDefinition>();
- final ArrayList<MeasurementDefinition>
summaryMeasurementDefinitions = new ArrayList<MeasurementDefinition>();
+ for (MeasurementDefinition def :
resource.getResourceType().getMetricDefinitions()) {
+ if (def.getDataType() == DataType.MEASUREMENT && def.getDisplayType()
== DisplayType.SUMMARY) {
+ summaryMeasurementDefinitions.add(def);
+ }
+ measurementDefinitions.add(def);
+ }
- for (MeasurementDefinition def : type.getMetricDefinitions()) {
- if (def.getDataType() == DataType.MEASUREMENT &&
def.getDisplayType() == DisplayType.SUMMARY) {
- summaryMeasurementDefinitions.add(def);
- }
- measurementDefinitions.add(def);
- }
+ Collections.sort(measurementDefinitions, new
Comparator<MeasurementDefinition>() {
+ @Override
+ public int compare(MeasurementDefinition o1, MeasurementDefinition o2) {
+ return new
Integer(o1.getDisplayOrder()).compareTo(o2.getDisplayOrder());
+ }
+ });
+ Collections.sort(summaryMeasurementDefinitions, new
Comparator<MeasurementDefinition>() {
+ @Override
+ public int compare(MeasurementDefinition o1, MeasurementDefinition o2) {
+ return new
Integer(o1.getDisplayOrder()).compareTo(o2.getDisplayOrder());
+ }
+ });
+
+ int[] measDefIdArray = new int[measurementDefinitions.size()];
+ for (int i = 0; i < measDefIdArray.length; i++) {
+ measDefIdArray[i] = measurementDefinitions.get(i).getId();
+ }
- Collections.sort(measurementDefinitions, new
Comparator<MeasurementDefinition>() {
- @Override
- public int compare(MeasurementDefinition o1,
MeasurementDefinition o2) {
- return new
Integer(o1.getDisplayOrder()).compareTo(o2.getDisplayOrder());
- }
- });
- Collections.sort(summaryMeasurementDefinitions, new
Comparator<MeasurementDefinition>() {
- @Override
- public int compare(MeasurementDefinition o1,
MeasurementDefinition o2) {
- return new
Integer(o1.getDisplayOrder()).compareTo(o2.getDisplayOrder());
- }
- });
-
- int[] measDefIdArray = new int[measurementDefinitions.size()];
- for (int i = 0; i < measDefIdArray.length; i++) {
- measDefIdArray[i] = measurementDefinitions.get(i).getId();
+ // setting up a deferred Command to execute after all resource queries have
completed (successfully or unsuccessfully)
+ // we know there are exactly 2 resources
+ final CountDownLatch countDownLatch = CountDownLatch.create(NUM_ASYNC_CALLS, new
Command() {
+ @Override
+ /**
+ * Satisfied only after ALL of the metric queries AND availability have
completed
+ */
+ public void execute() {
+ Log.debug("Total Time for async metrics/avail query: " +
(System.currentTimeMillis() - startTimer));
+ if (null == metricsDataList || metricsDataList.isEmpty()) {
+
loadingLabel.setContents(MSG.view_resource_monitor_graphs_noneAvailable());
+ } else {
+ loadingLabel.hide();
+ if (useSummaryData) {
+ buildSummaryGraphs(metricsDataList,
summaryMeasurementDefinitions, measurementDefinitions);
+ } else {
+ determineGraphsToBuild(metricsDataList, measurementDefinitions,
definitionIds);
}
-
- // setting up a deferred Command to execute after all resource
queries have completed (successfully or unsuccessfully)
- // we know there are exactly 2 resources
- final CountDownLatch countDownLatch =
CountDownLatch.create(NUM_ASYNC_CALLS, new Command() {
- @Override
- /**
- * Satisfied only after ALL of the metric queries AND
availability have completed
- */
- public void execute() {
- Log.debug("Total Time for async metrics/avail query:
"
- + (System.currentTimeMillis() - startTimer));
- if (null == metricsDataList || metricsDataList.isEmpty()) {
-
loadingLabel.setContents(MSG.view_resource_monitor_graphs_noneAvailable());
- } else {
- loadingLabel.hide();
- if (useSummaryData) {
- buildSummaryGraphs(metricsDataList,
summaryMeasurementDefinitions,
- measurementDefinitions);
- } else {
- determineGraphsToBuild(metricsDataList,
measurementDefinitions, definitionIds);
- }
- // There is a weird timing case when availabilityGraph
can be null
- if (null != availabilityGraph) {
- // we only need the first metricData since we are
only taking the
- // availability data set in there for the dropdowns
already
-
availabilityGraph.setAvailabilityList(availabilityList);
- new Timer(){
- @Override
- public void run() {
- availabilityGraph.drawJsniChart();
- }
- }.schedule(150);
- }
+ // There is a weird timing case when availabilityGraph can be null
+ if (null != availabilityGraph) {
+ // we only need the first metricData since we are only taking
the
+ // availability data set in there for the dropdowns already
+ availabilityGraph.setAvailabilityList(availabilityList);
+ new Timer() {
+ @Override
+ public void run() {
+ availabilityGraph.drawJsniChart();
}
+ }.schedule(150);
+ }
+ }
- }
- });
+ }
+ });
- queryMetricData(measDefIdArray, countDownLatch);
- queryOOBMetrics(resource, countDownLatch);
- // now the countDown latch will run sometime asynchronously
+ queryMetricData(measDefIdArray, countDownLatch);
+ queryOOBMetrics(resource, countDownLatch);
+ // now the countDown latch will run sometime asynchronously
+ }
+ private void queryMetricData(final int[] measDefIdArray, final CountDownLatch
countDownLatch) {
+
GWTServiceLookup.getMeasurementDataService().findDataForResource(resource.getId(),
measDefIdArray,
+ buttonBarDateTimeRangeEditor.getStartTime(),
buttonBarDateTimeRangeEditor.getEndTime(), 60,
+ new
AsyncCallback<List<List<MeasurementDataNumericHighLowComposite>>>() {
+ @Override
+ public void onFailure(Throwable caught) {
+
CoreGUI.getErrorHandler().handleError(MSG.view_resource_monitor_graphs_loadFailed(),
caught);
+
loadingLabel.setContents(MSG.view_resource_monitor_graphs_loadFailed());
+ countDownLatch.countDown();
}
- private void queryMetricData(final int[] measDefIdArray, final
CountDownLatch countDownLatch) {
-
GWTServiceLookup.getMeasurementDataService().findDataForResource(resource.getId(),
measDefIdArray,
- buttonBarDateTimeRangeEditor.getStartTime(),
buttonBarDateTimeRangeEditor.getEndTime(), 60,
- new
AsyncCallback<List<List<MeasurementDataNumericHighLowComposite>>>() {
- @Override
- public void onFailure(Throwable caught) {
-
CoreGUI.getErrorHandler().handleError(MSG.view_resource_monitor_graphs_loadFailed(),
- caught);
-
loadingLabel.setContents(MSG.view_resource_monitor_graphs_loadFailed());
- countDownLatch.countDown();
- }
-
- @Override
- public void
onSuccess(List<List<MeasurementDataNumericHighLowComposite>> metrics) {
- metricsDataList = metrics;
- Log.debug("Regular Metric graph data queried in:
"
- + (System.currentTimeMillis() - startTimer + "
ms."));
- countDownLatch.countDown();
+ @Override
+ public void
onSuccess(List<List<MeasurementDataNumericHighLowComposite>> metrics) {
+ metricsDataList = metrics;
+ countDownLatch.countDown();
- }
- });
}
+ });
+ }
- private void queryOOBMetrics(final Resource resource, final
CountDownLatch countDownLatch) {
+ private void queryOOBMetrics(final Resource resource, final CountDownLatch
countDownLatch) {
- final long startTime = System.currentTimeMillis();
+ final long startTime = System.currentTimeMillis();
-
GWTServiceLookup.getMeasurementDataService().getHighestNOOBsForResource(resource.getId(),
60,
+
GWTServiceLookup.getMeasurementDataService().getHighestNOOBsForResource(resource.getId(),
60,
- new AsyncCallback<PageList<MeasurementOOBComposite>>() {
- @Override
- public void onSuccess(PageList<MeasurementOOBComposite>
measurementOOBComposites) {
+ new AsyncCallback<PageList<MeasurementOOBComposite>>() {
+ @Override
+ public void onSuccess(PageList<MeasurementOOBComposite>
measurementOOBComposites) {
- measurementOOBCompositeList = measurementOOBComposites;
- Log.debug("\nSuccessfully queried
"+measurementOOBCompositeList.size() +" OOB records in: " +
(System.currentTimeMillis() - startTime)
- + " ms.");
- countDownLatch.countDown();
- }
+ measurementOOBCompositeList = measurementOOBComposites;
+ Log.debug("\nSuccessfully queried " +
measurementOOBCompositeList.size() + " OOB records in: "
+ + (System.currentTimeMillis() - startTime) + " ms.");
+ countDownLatch.countDown();
+ }
- @Override
- public void onFailure(Throwable caught) {
- Log.debug("Error retrieving out of bound metrics for
resource [" + resource.getId() + "]:"
- + caught.getMessage());
- countDownLatch.countDown();
- }
- });
+ @Override
+ public void onFailure(Throwable caught) {
+ Log.debug("Error retrieving out of bound metrics for resource
[" + resource.getId() + "]:"
+ + caught.getMessage());
+ countDownLatch.countDown();
+ }
+ });
- }
+ }
- /**
- * Spin through the measurement definitions (in order) checking to see if
they are in the
- * summary measurement definition set and if so build a graph.
- * @param measurementData
- * @param summaryMeasurementDefinitions
- * @param measurementDefinitions
- */
- private void
buildSummaryGraphs(List<List<MeasurementDataNumericHighLowComposite>>
measurementData,
- List<MeasurementDefinition> summaryMeasurementDefinitions,
- List<MeasurementDefinition> measurementDefinitions) {
- Set<Integer> summaryIds = new TreeSet<Integer>();
- for (MeasurementDefinition summaryMeasurementDefinition :
summaryMeasurementDefinitions) {
- summaryIds.add(summaryMeasurementDefinition.getId());
- }
+ /**
+ * Spin through the measurement definitions (in order) checking to see if they are in
the
+ * summary measurement definition set and if so build a graph.
+ * @param measurementData
+ * @param summaryMeasurementDefinitions
+ * @param measurementDefinitions
+ */
+ private void
buildSummaryGraphs(List<List<MeasurementDataNumericHighLowComposite>>
measurementData,
+ List<MeasurementDefinition> summaryMeasurementDefinitions,
List<MeasurementDefinition> measurementDefinitions) {
+ Set<Integer> summaryIds = new TreeSet<Integer>();
+ for (MeasurementDefinition summaryMeasurementDefinition :
summaryMeasurementDefinitions) {
+ summaryIds.add(summaryMeasurementDefinition.getId());
+ }
- int i = 0;
- for (MeasurementDefinition measurementDefinition :
measurementDefinitions) {
- if (summaryIds.contains(measurementDefinition.getId())) {
- buildSingleGraph(measurementOOBCompositeList,
measurementDefinition,
- measurementData.get(i), MULTI_CHART_HEIGHT);
- }
- i++;
- }
+ int i = 0;
+ for (MeasurementDefinition measurementDefinition : measurementDefinitions) {
+ if (summaryIds.contains(measurementDefinition.getId())) {
+ buildSingleGraph(measurementOOBCompositeList, measurementDefinition,
measurementData.get(i),
+ MULTI_CHART_HEIGHT);
+ }
+ i++;
+ }
- }
+ }
- private void
determineGraphsToBuild(List<List<MeasurementDataNumericHighLowComposite>>
measurementData,
- List<MeasurementDefinition> measurementDefinitions,
Set<Integer> definitionIds) {
- int i = 0;
- for (List<MeasurementDataNumericHighLowComposite> metric :
measurementData) {
-
- for (Integer selectedDefinitionId : definitionIds) {
- final MeasurementDefinition measurementDefinition =
measurementDefinitions.get(i);
- final int measurementId = measurementDefinition.getId();
-
- if (null != selectedDefinitionId) {
- // single graph case
- if (measurementId == selectedDefinitionId) {
- buildSingleGraph(measurementOOBCompositeList,
measurementDefinition, metric, SINGLE_CHART_HEIGHT);
- }
- } else {
- // multiple graph case
- buildSingleGraph(measurementOOBCompositeList,
measurementDefinition, metric, MULTI_CHART_HEIGHT);
- }
- }
- i++;
+ private void
determineGraphsToBuild(List<List<MeasurementDataNumericHighLowComposite>>
measurementData,
+ List<MeasurementDefinition> measurementDefinitions, Set<Integer>
definitionIds) {
+ int i = 0;
+ for (List<MeasurementDataNumericHighLowComposite> metric : measurementData)
{
+
+ for (Integer selectedDefinitionId : definitionIds) {
+ final MeasurementDefinition measurementDefinition =
measurementDefinitions.get(i);
+ final int measurementId = measurementDefinition.getId();
+
+ if (null != selectedDefinitionId) {
+ // single graph case
+ if (measurementId == selectedDefinitionId) {
+ buildSingleGraph(measurementOOBCompositeList,
measurementDefinition, metric,
+ SINGLE_CHART_HEIGHT);
}
+ } else {
+ // multiple graph case
+ buildSingleGraph(measurementOOBCompositeList, measurementDefinition,
metric, MULTI_CHART_HEIGHT);
}
- });
-
+ }
+ i++;
+ }
}
private void buildSingleGraph(PageList<MeasurementOOBComposite>
measurementOOBCompositeList,
MeasurementDefinition measurementDefinition,
List<MeasurementDataNumericHighLowComposite> data, int height) {
MetricGraphData metricGraphData =
MetricGraphData.createForResource(resource.getId(), resource.getName(),
- measurementDefinition, data, measurementOOBCompositeList );
+ measurementDefinition, data, measurementOOBCompositeList);
StackedBarMetricGraphImpl graph = GWT.create(StackedBarMetricGraphImpl.class);
graph.setMetricGraphData(metricGraphData);
graph.setGraphListView(this);
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/MetricD3Graph.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/MetricD3Graph.java
index 3b4ec1f..65807f9 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/MetricD3Graph.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/MetricD3Graph.java
@@ -22,6 +22,7 @@ import com.google.gwt.user.client.Timer;
import com.smartgwt.client.widgets.HTMLFlow;
import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractD3GraphListView;
+import org.rhq.enterprise.gui.coregui.client.inventory.common.graph.RedrawGraphs;
import
org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.StackedBarMetricGraphImpl;
import org.rhq.enterprise.gui.coregui.client.util.Log;
import org.rhq.enterprise.gui.coregui.client.util.enhanced.EnhancedVLayout;
@@ -30,7 +31,7 @@ import
org.rhq.enterprise.gui.coregui.client.util.enhanced.EnhancedVLayout;
* A D3 graph implementation for graphing Resource metrics.
* Just the graph only. No avail graph no buttons just he graph.
*/
-public class MetricD3Graph<T extends AbstractD3GraphListView> extends
EnhancedVLayout {
+public class MetricD3Graph<T extends AbstractD3GraphListView> extends
EnhancedVLayout implements RedrawGraphs{
protected StackedBarMetricGraphImpl graph;
private HTMLFlow graphDiv = null;
@@ -59,18 +60,18 @@ public class MetricD3Graph<T extends AbstractD3GraphListView>
extends EnhancedVL
*/
private static String getSvgDefs() {
return " <defs>"
- + " <linearGradient id=\"headerGrad\"
x1=\"0%\" y1=\"0%\" x2=\"0%\"
y2=\"100%\">"
- + " <stop offset=\"0%\"
style=\"stop-color:#E6E6E6;stop-opacity:1\"/>"
- + " <stop offset=\"100%\"
style=\"stop-color:#F0F0F0;stop-opacity:1\"/>"
- + " </linearGradient>"
- + " <pattern id=\"noDataStripes\"
patternUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\""
- + " width=\"6\"
height=\"3\">"
- + " <path d=\"M 0 0 6 0\"
style=\"stroke:#CCCCCC; fill:none;\"/>"
- + " </pattern>"
- + " <pattern id=\"unknownStripes\"
patternUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\""
- + " width=\"6\"
height=\"3\">"
- + " <path d=\"M 0 0 6 0\"
style=\"stroke:#2E9EC2; fill:none;\"/>"
- + " </pattern>"
+ + " <linearGradient id=\"headerGrad\" x1=\"0%\"
y1=\"0%\" x2=\"0%\" y2=\"100%\">"
+ + " <stop offset=\"0%\"
style=\"stop-color:#E6E6E6;stop-opacity:1\"/>"
+ + " <stop offset=\"100%\"
style=\"stop-color:#F0F0F0;stop-opacity:1\"/>"
+ + " </linearGradient>"
+ + " <pattern id=\"noDataStripes\"
patternUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\""
+ + " width=\"6\" height=\"3\">"
+ + " <path d=\"M 0 0 6 0\" style=\"stroke:#CCCCCC;
fill:none;\"/>"
+ + " </pattern>"
+ + " <pattern id=\"unknownStripes\"
patternUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\""
+ + " width=\"6\" height=\"3\">"
+ + " <path d=\"M 0 0 6 0\" style=\"stroke:#2E9EC2;
fill:none;\"/>"
+ + " </pattern>"
+ "<pattern id=\"diagonalHatchFill\"
patternUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\"
width=\"105\" height=\"105\">"
+ "<g style=\"fill:none; stroke:black;
stroke-width:1\">"
+ "<path d=\"M0 90 l15,15\"/>"
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/avail/ResourceAvailabilityView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/avail/ResourceAvailabilityView.java
deleted file mode 100644
index 6719070..0000000
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/avail/ResourceAvailabilityView.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright 2012, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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 version 2 of the License.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.avail;
-
-import java.util.ArrayList;
-import java.util.Date;
-
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.smartgwt.client.data.DSRequest;
-import com.smartgwt.client.data.DSResponse;
-import com.smartgwt.client.data.Record;
-import com.smartgwt.client.data.SortSpecifier;
-import com.smartgwt.client.rpc.RPCResponse;
-import com.smartgwt.client.types.Alignment;
-import com.smartgwt.client.types.ListGridFieldType;
-import com.smartgwt.client.types.SortDirection;
-import com.smartgwt.client.widgets.form.DynamicForm;
-import com.smartgwt.client.widgets.form.fields.FormItem;
-import com.smartgwt.client.widgets.form.fields.StaticTextItem;
-import com.smartgwt.client.widgets.grid.ListGridField;
-import com.smartgwt.client.widgets.grid.ListGridRecord;
-import com.smartgwt.client.widgets.layout.Layout;
-
-import org.rhq.core.domain.criteria.AvailabilityCriteria;
-import org.rhq.core.domain.measurement.Availability;
-import org.rhq.core.domain.measurement.MeasurementUnits;
-import org.rhq.core.domain.resource.composite.ResourceAvailabilitySummary;
-import org.rhq.core.domain.resource.composite.ResourceComposite;
-import org.rhq.core.domain.util.PageControl;
-import org.rhq.core.domain.util.PageList;
-import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.ImageManager;
-import org.rhq.enterprise.gui.coregui.client.components.table.Table;
-import org.rhq.enterprise.gui.coregui.client.components.table.TimestampCellFormatter;
-import org.rhq.enterprise.gui.coregui.client.gwt.AvailabilityGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.util.MeasurementConverterClient;
-import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
-import org.rhq.enterprise.gui.coregui.client.util.enhanced.EnhancedVLayout;
-
-/**
- * This shows the availability history for a resource.
- *
- * @author Jay Shaughnessy
- * @author John Mazzitelli
- */
-public class ResourceAvailabilityView extends EnhancedVLayout {
-
- private ResourceComposite resourceComposite;
- private StaticTextItem currentField;
- private StaticTextItem availField;
- private StaticTextItem availTimeField;
- private StaticTextItem downField;
- private StaticTextItem downTimeField;
- private StaticTextItem disabledField;
- private StaticTextItem disabledTimeField;
- private StaticTextItem failureCountField;
- private StaticTextItem disabledCountField;
- private StaticTextItem mtbfField;
- private StaticTextItem mttrField;
- private StaticTextItem unknownField;
- private StaticTextItem currentTimeField;
-
- public ResourceAvailabilityView(ResourceComposite resourceComposite) {
- super();
-
- this.resourceComposite = resourceComposite;
-
- setWidth100();
- setHeight100();
- }
-
- @Override
- protected void onInit() {
- super.onInit();
-
- addMember(createSummaryForm());
- addMember(createListView());
- }
-
- private DynamicForm createSummaryForm() {
- DynamicForm form = new DynamicForm();
- form.setWidth100();
- form.setAutoHeight();
- form.setMargin(10);
- form.setNumCols(4);
-
- // row 1
- currentField = new StaticTextItem("current",
MSG.view_resource_monitor_availability_currentStatus());
- currentField.setWrapTitle(false);
- currentField.setColSpan(4);
-
- // row 2
- availField = new StaticTextItem("avail",
MSG.view_resource_monitor_availability_availability());
- availField.setWrapTitle(false);
- prepareTooltip(availField,
MSG.view_resource_monitor_availability_availability_tooltip());
-
- availTimeField = new StaticTextItem("availTime",
MSG.view_resource_monitor_availability_uptime());
- availTimeField.setWrapTitle(false);
- prepareTooltip(availTimeField,
MSG.view_resource_monitor_availability_uptime_tooltip());
-
- // row 3
- downField = new StaticTextItem("down",
MSG.view_resource_monitor_availability_down());
- downField.setWrapTitle(false);
- prepareTooltip(downField,
MSG.view_resource_monitor_availability_down_tooltip());
-
- downTimeField = new StaticTextItem("downTime",
MSG.view_resource_monitor_availability_downtime());
- downTimeField.setWrapTitle(false);
- prepareTooltip(downTimeField,
MSG.view_resource_monitor_availability_downtime_tooltip());
-
- // row 4
- disabledField = new StaticTextItem("disabled",
MSG.view_resource_monitor_availability_disabled());
- disabledField.setWrapTitle(false);
- prepareTooltip(disabledField,
MSG.view_resource_monitor_availability_disabled_tooltip());
-
- disabledTimeField = new StaticTextItem("disabledTime",
MSG.view_resource_monitor_availability_disabledTime());
- disabledTimeField.setWrapTitle(false);
- prepareTooltip(disabledTimeField,
MSG.view_resource_monitor_availability_disabledTime_tooltip());
-
- // row 5
- failureCountField = new StaticTextItem("failureCount",
MSG.view_resource_monitor_availability_numFailures());
- failureCountField.setWrapTitle(false);
- prepareTooltip(failureCountField,
MSG.view_resource_monitor_availability_numFailures_tooltip());
-
- disabledCountField = new StaticTextItem("disabledCount",
MSG.view_resource_monitor_availability_numDisabled());
- disabledCountField.setWrapTitle(false);
- prepareTooltip(disabledCountField,
MSG.view_resource_monitor_availability_numDisabled_tooltip());
-
- // row 6
- mtbfField = new StaticTextItem("mtbf",
MSG.view_resource_monitor_availability_mtbf());
- mtbfField.setWrapTitle(false);
- prepareTooltip(mtbfField,
MSG.view_resource_monitor_availability_mtbf_tooltip());
-
- mttrField = new StaticTextItem("mttr",
MSG.view_resource_monitor_availability_mttr());
- mttrField.setWrapTitle(false);
- prepareTooltip(mttrField,
MSG.view_resource_monitor_availability_mttr_tooltip());
-
- // row 7
- unknownField = new StaticTextItem("unknown");
- unknownField.setWrapTitle(false);
- unknownField.setColSpan(4);
- unknownField.setShowTitle(false);
-
- // row 8
- currentTimeField = new StaticTextItem("currentTime");
- currentTimeField.setWrapTitle(false);
- currentTimeField.setColSpan(4);
- currentTimeField.setShowTitle(false);
-
- form.setItems(currentField, availField, availTimeField, downField, downTimeField,
disabledField,
- disabledTimeField, failureCountField, disabledCountField, mtbfField,
mttrField, unknownField,
- currentTimeField);
-
- reloadSummaryData();
-
- return form;
- }
-
- private void reloadSummaryData() {
-
GWTServiceLookup.getResourceService().getResourceAvailabilitySummary(resourceComposite.getResource().getId(),
- new AsyncCallback<ResourceAvailabilitySummary>() {
-
- @Override
- public void onSuccess(ResourceAvailabilitySummary result) {
-
-
currentField.setValue(MSG.view_resource_monitor_availability_currentStatus_value(result
- .getCurrent().getName(),
TimestampCellFormatter.format(result.getLastChange().getTime())));
-
availField.setValue(MeasurementConverterClient.format(result.getUpPercentage(),
- MeasurementUnits.PERCENTAGE, true));
- availTimeField.setValue(MeasurementConverterClient.format((double)
result.getUpTime(),
- MeasurementUnits.MILLISECONDS, true));
-
downField.setValue(MeasurementConverterClient.format(result.getDownPercentage(),
- MeasurementUnits.PERCENTAGE, true));
- downTimeField.setValue(MeasurementConverterClient.format((double)
result.getDownTime(),
- MeasurementUnits.MILLISECONDS, true));
-
disabledField.setValue(MeasurementConverterClient.format(result.getDisabledPercentage(),
- MeasurementUnits.PERCENTAGE, true));
- disabledTimeField.setValue(MeasurementConverterClient.format((double)
result.getDisabledTime(),
- MeasurementUnits.MILLISECONDS, true));
- failureCountField.setValue(result.getFailures());
- disabledCountField.setValue(result.getDisabled());
- mtbfField.setValue(MeasurementConverterClient.format((double)
result.getMTBF(),
- MeasurementUnits.MILLISECONDS, true));
- mttrField.setValue(MeasurementConverterClient.format((double)
result.getMTTR(),
- MeasurementUnits.MILLISECONDS, true));
-
- if (result.getUnknownTime() > 0L) {
-
unknownField.setValue(MSG.view_resource_monitor_availability_unknown(MeasurementConverterClient
- .format((double) result.getUnknownTime(),
MeasurementUnits.MILLISECONDS, true)));
- } else {
- unknownField.setValue("");
- }
-
-
currentTimeField.setValue(MSG.view_resource_monitor_availability_currentAsOf(TimestampCellFormatter
- .format(result.getCurrentTime())));
- }
-
- @Override
- public void onFailure(Throwable caught) {
- currentField.setValue(MSG.common_label_error());
- CoreGUI.getErrorHandler()
-
.handleError(MSG.view_resource_monitor_availability_summaryError(), caught);
- }
- });
- }
-
- private void prepareTooltip(FormItem item, String tooltip) {
- item.setHoverWidth(400);
- item.setPrompt(tooltip);
- }
-
- private Table<ListView.DS> createListView() {
- ListView listView = new ListView(resourceComposite.getResource().getId());
- return listView;
- }
-
- private class ListView extends Table<ListView.DS> {
-
- private DS dataSource;
- private int resourceId;
-
- public ListView(int resourceId) {
- super(null, new SortSpecifier[] { new SortSpecifier("startTime",
SortDirection.DESCENDING) });
-
- this.resourceId = resourceId;
-
- setDataSource(getDataSource());
- }
-
- @Override
- public DS getDataSource() {
- if (null == this.dataSource) {
- this.dataSource = new DS(resourceId);
- }
- return this.dataSource;
- }
-
- @Override
- public void refresh() {
- super.refresh();
- reloadSummaryData();
- }
-
- @Override
- protected void configureTableContents(Layout contents) {
- super.configureTableContents(contents);
- setAutoHeight();
- }
-
- @Override
- protected void configureTable() {
- ArrayList<ListGridField> dataSourceFields =
getDataSource().getListGridFields();
- getListGrid().setFields(dataSourceFields.toArray(new
ListGridField[dataSourceFields.size()]));
-
- super.configureTable();
- }
-
- private class DS extends RPCDataSource<Availability, AvailabilityCriteria>
{
-
- public static final String ATTR_ID = "id";
- public static final String ATTR_AVAILABILITY = "availabilityType";
- public static final String ATTR_START_TIME = "startTime";
- public static final String ATTR_END_TIME = "endTime";
-
- public static final String ATTR_DURATION = "duration";
-
- private AvailabilityGWTServiceAsync availService =
GWTServiceLookup.getAvailabilityService();
- private int resourceId;
-
- public DS(int resourceId) {
- super();
- this.resourceId = resourceId;
- addDataSourceFields();
- }
-
- /**
- * The view that contains the list grid which will display this
datasource's data will call this
- * method to get the field information which is used to control the display
of the data.
- *
- * @return list grid fields used to display the datasource data
- */
- public ArrayList<ListGridField> getListGridFields() {
- ArrayList<ListGridField> fields = new
ArrayList<ListGridField>(6);
-
- ListGridField startTimeField = new ListGridField(ATTR_START_TIME,
MSG.common_title_start());
- startTimeField.setCellFormatter(new TimestampCellFormatter());
- startTimeField.setShowHover(true);
-
startTimeField.setHoverCustomizer(TimestampCellFormatter.getHoverCustomizer(ATTR_START_TIME));
- startTimeField.setCanSortClientOnly(true);
- fields.add(startTimeField);
-
- ListGridField endTimeField = new ListGridField(ATTR_END_TIME,
MSG.common_title_end());
- endTimeField.setCellFormatter(new TimestampCellFormatter());
- endTimeField.setShowHover(true);
-
endTimeField.setHoverCustomizer(TimestampCellFormatter.getHoverCustomizer(ATTR_END_TIME));
- endTimeField.setCanSortClientOnly(true);
- fields.add(endTimeField);
-
- ListGridField durationField = new ListGridField(ATTR_DURATION,
MSG.common_title_duration());
- durationField.setAlign(Alignment.RIGHT);
- fields.add(durationField);
-
- ListGridField availabilityField = new ListGridField(ATTR_AVAILABILITY,
MSG.common_title_availability());
- availabilityField.setType(ListGridFieldType.IMAGE);
- availabilityField.setAlign(Alignment.CENTER);
- fields.add(availabilityField);
-
- return fields;
- }
-
- @Override
- protected AvailabilityCriteria getFetchCriteria(DSRequest request) {
- AvailabilityCriteria c = new AvailabilityCriteria();
- c.addFilterResourceId(resourceId);
- c.addFilterInitialAvailability(false);
-
- // This code is unlikely to be necessary as the encompassing view should
be using an initial
- // sort specifier. But just in case, make sure we set the initial sort.
Note that we have to
- // manipulate the PageControl directly as per the restrictions on
getFetchCriteria() (see jdoc).
- PageControl pageControl = getPageControl(request);
- if (pageControl.getOrderingFields().isEmpty()) {
- pageControl.initDefaultOrderingField("startTime",
PageOrdering.DESC);
- }
-
- return c;
- }
-
- @Override
- protected void executeFetch(final DSRequest request, final DSResponse
response,
- AvailabilityCriteria criteria) {
-
- this.availService.findAvailabilityByCriteria(criteria, new
AsyncCallback<PageList<Availability>>() {
- public void onFailure(Throwable caught) {
- // TODO fix message
- CoreGUI.getErrorHandler().handleError(MSG.common_label_error(),
caught);
- response.setStatus(RPCResponse.STATUS_FAILURE);
- processResponse(request.getRequestId(), response);
- }
-
- public void onSuccess(final PageList<Availability> result) {
- response.setData(buildRecords(result));
- response.setTotalRows(result.size());
- processResponse(request.getRequestId(), response);
- }
- });
- }
-
- @Override
- public Availability copyValues(Record from) {
- return null;
- }
-
- @Override
- public ListGridRecord copyValues(Availability from) {
- ListGridRecord record = new ListGridRecord();
-
- record.setAttribute(ATTR_ID, from.getId());
- record.setAttribute(ATTR_AVAILABILITY,
-
ImageManager.getAvailabilityIconFromAvailType(from.getAvailabilityType()));
- record.setAttribute(ATTR_START_TIME, new Date(from.getStartTime()));
- if (null != from.getEndTime()) {
- record.setAttribute(ATTR_END_TIME, new Date(from.getEndTime()));
- long duration = from.getEndTime() - from.getStartTime();
- record.setAttribute(ATTR_DURATION,
- MeasurementConverterClient.format((double) duration,
MeasurementUnits.MILLISECONDS, true));
-
- } else {
- record.setAttribute(ATTR_END_TIME, MSG.common_label_none2());
- long duration = System.currentTimeMillis() - from.getStartTime();
- record.setAttribute(ATTR_DURATION,
- MeasurementConverterClient.format((double) duration,
MeasurementUnits.MILLISECONDS, true));
-
- }
-
- return record;
- }
- }
- }
-
-}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/AddToDashboardComponent.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/AddToDashboardComponent.java
new file mode 100644
index 0000000..ce4f8ef
--- /dev/null
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/AddToDashboardComponent.java
@@ -0,0 +1,185 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2013 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.table;
+
+import java.util.LinkedHashMap;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.widgets.IButton;
+import com.smartgwt.client.widgets.events.ClickEvent;
+import com.smartgwt.client.widgets.form.fields.SelectItem;
+import com.smartgwt.client.widgets.form.fields.events.ChangeEvent;
+import com.smartgwt.client.widgets.form.fields.events.ChangeHandler;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.toolbar.ToolStrip;
+
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.criteria.DashboardCriteria;
+import org.rhq.core.domain.dashboard.Dashboard;
+import org.rhq.core.domain.dashboard.DashboardPortlet;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import
org.rhq.enterprise.gui.coregui.client.dashboard.portlets.inventory.resource.graph.ResourceD3GraphPortlet;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.Log;
+import org.rhq.enterprise.gui.coregui.client.util.enhanced.Enhanced;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+
+/**
+ * @author Mike Thompson
+ */
+public class AddToDashboardComponent extends ToolStrip implements Enhanced {
+ final private Resource resource;
+ private SelectItem dashboardSelectItem;
+ private Dashboard selectedDashboard;
+ private IButton addToDashboardButton;
+ private LinkedHashMap<String, String> dashboardMenuMap;
+ private LinkedHashMap<Integer, Dashboard> dashboardMap;
+ private MetricsTableView.MetricsTableListGrid metricsListGrid;
+
+ public AddToDashboardComponent(Resource resource) {
+ this.resource = resource;
+ setPadding(5);
+ setMembersMargin(15);
+ setWidth(300);
+ dashboardMenuMap = new LinkedHashMap<String, String>();
+ dashboardMap = new LinkedHashMap<Integer, Dashboard>();
+ createToolstrip();
+ }
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+ removeMembers(getMembers());
+ createToolstrip();
+ }
+
+ private void createToolstrip() {
+ addSpacer(15);
+ dashboardSelectItem = new SelectItem();
+ addToDashboardButton = new IButton(MSG.view_metric_addToDashboard());
+ addToDashboardButton.disable();
+
+ dashboardSelectItem = new SelectItem();
+ dashboardSelectItem.setTitle("Dashboards");
+ dashboardSelectItem.setWidth(300);
+ dashboardSelectItem.setPickListWidth(210);
+ populateDashboardMenu();
+ addFormItem(dashboardSelectItem);
+ addMember(addToDashboardButton);
+
+ dashboardSelectItem.addChangeHandler(new ChangeHandler() {
+ @Override
+ public void onChange(ChangeEvent changeEvent) {
+ Integer selectedDashboardId = Integer.valueOf((String)
changeEvent.getValue());
+ selectedDashboard = dashboardMap.get(selectedDashboardId);
+ }
+ });
+ addToDashboardButton.addClickHandler(new
com.smartgwt.client.widgets.events.ClickHandler() {
+ @Override
+ public void onClick(ClickEvent clickEvent) {
+ ListGridRecord[] selectedRecords = metricsListGrid.getSelectedRecords();
+ for (ListGridRecord selectedRecord : selectedRecords) {
+ for (MeasurementDefinition measurementDefinition :
resource.getResourceType()
+ .getMetricDefinitions()) {
+ if (measurementDefinition.getId() == selectedRecord
+
.getAttributeAsInt(MetricsViewDataSource.FIELD_METRIC_DEF_ID)) {
+ Log.debug("Add to Dashboard -- Storing: " +
measurementDefinition.getDisplayName()
+ + " in " + selectedDashboard.getName());
+ storeDashboardMetric(selectedDashboard, resource,
measurementDefinition);
+ break;
+ }
+ }
+ }
+ }
+ });
+ }
+
+ public void disableAddToDashboardButton(){
+ addToDashboardButton.disable();
+ }
+
+ public void enableAddToDashboardButton(){
+ addToDashboardButton.enable();
+ }
+
+
+ public void populateDashboardMenu() {
+ dashboardMenuMap.clear();
+ dashboardMap.clear();
+
+ DashboardCriteria criteria = new DashboardCriteria();
+ GWTServiceLookup.getDashboardService().findDashboardsByCriteria(criteria,
+ new AsyncCallback<PageList<Dashboard>>() {
+
+ public void onFailure(Throwable caught) {
+
CoreGUI.getErrorHandler().handleError(MSG.view_tree_common_contextMenu_loadFailed_dashboard(),
+ caught);
+ }
+
+ public void onSuccess(PageList<Dashboard> dashboards) {
+ for (final Dashboard dashboard : dashboards) {
+ dashboardMenuMap.put(String.valueOf(dashboard.getId()),
+
MSG.view_tree_common_contextMenu_addChartToDashboard(dashboard.getName()));
+ dashboardMap.put(dashboard.getId(), dashboard);
+ }
+ selectedDashboard = dashboards.get(0);
+ dashboardSelectItem.setValueMap(dashboardMenuMap);
+ dashboardSelectItem.setValue(selectedDashboard.getId());
+ }
+ });
+ }
+
+ /**
+ * The metrics list grid is not available on object creation so we must attach later
after it has been initialized.
+ * @param metricsListGrid
+ */
+ public void setMetricsListGrid(MetricsTableView.MetricsTableListGrid metricsListGrid)
{
+ this.metricsListGrid = metricsListGrid;
+ }
+
+
+ private void storeDashboardMetric(Dashboard dashboard, Resource resource,
MeasurementDefinition definition) {
+ DashboardPortlet dashboardPortlet = new
DashboardPortlet(MSG.view_tree_common_contextMenu_resourceGraph(),
+ ResourceD3GraphPortlet.KEY, 250);
+ dashboardPortlet.getConfiguration().put(
+ new PropertySimple(ResourceD3GraphPortlet.CFG_RESOURCE_ID,
resource.getId()));
+ dashboardPortlet.getConfiguration().put(
+ new PropertySimple(ResourceD3GraphPortlet.CFG_DEFINITION_ID,
definition.getId()));
+
+ dashboard.addPortlet(dashboardPortlet);
+
+ GWTServiceLookup.getDashboardService().storeDashboard(dashboard, new
AsyncCallback<Dashboard>() {
+
+ public void onFailure(Throwable caught) {
+
CoreGUI.getErrorHandler().handleError(MSG.view_tree_common_contextMenu_saveChartToDashboardFailure(),
+ caught);
+ }
+
+ public void onSuccess(Dashboard result) {
+ CoreGUI.getMessageCenter().notify(
+ new
Message(MSG.view_tree_common_contextMenu_saveChartToDashboardSuccessful(result.getName()),
+ Message.Severity.Info));
+ }
+ });
+ }
+
+}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MeasurementTableView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MeasurementTableView.java
deleted file mode 100644
index 7022648..0000000
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MeasurementTableView.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2011 Red Hat, Inc.
- * All rights reserved.
- *
- * 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 version 2 of the License.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.table;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.TreeSet;
-
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.smartgwt.client.types.SelectionStyle;
-import com.smartgwt.client.widgets.Window;
-import com.smartgwt.client.widgets.events.CloseClickEvent;
-import com.smartgwt.client.widgets.events.CloseClickHandler;
-import com.smartgwt.client.widgets.grid.ListGrid;
-import com.smartgwt.client.widgets.grid.ListGridField;
-import com.smartgwt.client.widgets.grid.ListGridRecord;
-
-import org.rhq.core.domain.criteria.ResourceCriteria;
-import org.rhq.core.domain.measurement.MeasurementData;
-import org.rhq.core.domain.measurement.MeasurementUnits;
-import org.rhq.core.domain.resource.composite.ResourceComposite;
-import org.rhq.core.domain.util.PageList;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import
org.rhq.enterprise.gui.coregui.client.components.measurement.UserPreferencesMeasurementRangeEditor;
-import org.rhq.enterprise.gui.coregui.client.components.table.Table;
-import org.rhq.enterprise.gui.coregui.client.components.table.TableAction;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.inventory.InventoryView;
-import
org.rhq.enterprise.gui.coregui.client.inventory.common.detail.summary.AbstractActivityView.ChartViewWindow;
-import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.D3GraphListView;
-import org.rhq.enterprise.gui.coregui.client.util.MeasurementConverterClient;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message;
-
-/**
- * Views a resource's measurements in a tabular view.
- *
- * @author John Mazzitelli
- */
-public class MeasurementTableView extends Table<MetricsTableDataSource> {
-
- private final int resourceId;
-
- public MeasurementTableView(int resourceId) {
- super();
- this.resourceId = resourceId;
- setDataSource(new MetricsTableDataSource(resourceId));
- }
-
- protected void configureTable() {
- ArrayList<ListGridField> fields = getDataSource().getListGridFields();
- setListGridFields(fields.toArray(new ListGridField[0]));
- addExtraWidget(new UserPreferencesMeasurementRangeEditor(), true);
- addTableAction(MSG.view_measureTable_getLive(), new TableAction() {
- @Override
- public boolean isEnabled(ListGridRecord[] selection) {
- return selection != null && selection.length > 0;
- }
-
- @Override
- public void executeAction(ListGridRecord[] selection, Object actionValue) {
- if (selection == null || selection.length == 0) {
- return;
- }
- // keyed on metric name - string[0] is the metric label, [1] is the
units
- final HashMap<String, String[]> scheduleNamesAndUnits = new
HashMap<String, String[]>();
- int[] definitionIds = new int[selection.length];
- int i = 0;
- for (ListGridRecord record : selection) {
- Integer defId =
record.getAttributeAsInt(MetricsTableDataSource.FIELD_METRIC_DEF_ID);
- definitionIds[i++] = defId.intValue();
-
- String name =
record.getAttribute(MetricsTableDataSource.FIELD_METRIC_NAME);
- String label =
record.getAttribute(MetricsTableDataSource.FIELD_METRIC_LABEL);
- String units =
record.getAttribute(MetricsTableDataSource.FIELD_METRIC_UNITS);
- if (units == null || units.length() < 1) {
- units = MeasurementUnits.NONE.name();
- }
-
- scheduleNamesAndUnits.put(name, new String[] { label, units });
- }
-
- // actually go out and ask the agents for the data
-
GWTServiceLookup.getMeasurementDataService(60000).findLiveData(resourceId, definitionIds,
- new AsyncCallback<Set<MeasurementData>>() {
- @Override
- public void onSuccess(Set<MeasurementData> result) {
- if (result == null) {
- result = new HashSet<MeasurementData>(0);
- }
- ArrayList<ListGridRecord> records = new
ArrayList<ListGridRecord>(result.size());
- for (MeasurementData data : result) {
- String[] nameAndUnits =
scheduleNamesAndUnits.get(data.getName());
- if (nameAndUnits != null) {
- double doubleValue;
- if (data.getValue() instanceof Number) {
- doubleValue = ((Number)
data.getValue()).doubleValue();
- } else {
- doubleValue =
Double.parseDouble(data.getValue().toString());
- }
- String value =
MeasurementConverterClient.formatToSignificantPrecision(
- new double[] { doubleValue },
MeasurementUnits.valueOf(nameAndUnits[1]), true)[0];
-
- ListGridRecord record = new ListGridRecord();
- record.setAttribute("name",
nameAndUnits[0]);
- record.setAttribute("value", value);
- records.add(record);
- }
- }
- Collections.sort(records, new
Comparator<ListGridRecord>() {
- public int compare(ListGridRecord o1, ListGridRecord
o2) {
- return
o1.getAttribute("name").compareTo(o2.getAttribute("name"));
- }
- });
- showLiveData(records);
- }
-
- @Override
- public void onFailure(Throwable caught) {
-
CoreGUI.getErrorHandler().handleError(MSG.view_measureTable_getLive_failure(), caught);
- }
- });
- }
- });
-
-
- addTableAction(MSG.view_measureTable_chartMetricValues(), new TableAction() {
- @Override
- public boolean isEnabled(ListGridRecord[] selection) {
- return selection != null && selection.length > 0;
- }
-
- @Override
- public void executeAction(ListGridRecord[] selection, Object actionValue) {
- if (selection == null || selection.length == 0) {
- return;
- }
- final TreeSet<Integer> definitionIds = new
TreeSet<Integer>();
- for (ListGridRecord record : selection) {
- Integer defId =
record.getAttributeAsInt(MetricsTableDataSource.FIELD_METRIC_DEF_ID);
- definitionIds.add(defId);
- }
-
- ResourceCriteria criteria = new ResourceCriteria();
- criteria.addFilterId(resourceId);
- criteria.fetchSchedules(true);
-
GWTServiceLookup.getResourceService().findResourceCompositesByCriteria(criteria,
- new AsyncCallback<PageList<ResourceComposite>>() {
-
- @Override
- public void onFailure(Throwable caught) {
- CoreGUI.getMessageCenter().notify(
- new
Message(MSG.view_inventory_resource_loadFailed(String.valueOf(resourceId)),
- Message.Severity.Warning));
-
- CoreGUI.goToView(InventoryView.VIEW_ID.getName());
- }
-
- @Override
- public void onSuccess(PageList<ResourceComposite>
result) {
- if (result.isEmpty()) {
- onFailure(new
Exception(MSG.view_inventory_resource_loadFailed(String
- .valueOf(resourceId))));
- } else {
- final ResourceComposite resourceComposite =
result.get(0);
-
- ChartViewWindow window = new
ChartViewWindow("");
- final D3GraphListView graphListView =
D3GraphListView.createMultipleGraphs(
- resourceComposite.getResource(),
definitionIds, true);
-
- window.addItem(graphListView);
- window.show();
- refreshTableInfo();
-
- }
- }
- });
-
- }
- });
- }
-
- private void showLiveData(ArrayList<ListGridRecord> records) {
- final Window liveDataWindow = new Window();
- liveDataWindow.setTitle(MSG.view_measureTable_live_title());
- liveDataWindow.setShowModalMask(true);
- liveDataWindow.setShowMinimizeButton(false);
- liveDataWindow.setShowMaximizeButton(true);
- liveDataWindow.setShowCloseButton(true);
- liveDataWindow.setShowResizer(true);
- liveDataWindow.setCanDragResize(true);
- liveDataWindow.setDismissOnEscape(true);
- liveDataWindow.setIsModal(true);
- liveDataWindow.setWidth(700);
- liveDataWindow.setHeight(425);
- liveDataWindow.setAutoCenter(true);
- liveDataWindow.centerInPage();
- liveDataWindow.addCloseClickHandler(new CloseClickHandler() {
- @Override
- public void onCloseClick(CloseClickEvent event) {
- liveDataWindow.destroy();
- refreshTableInfo();
- }
- });
-
- ListGrid liveDataGrid = new ListGrid();
- liveDataGrid.setShowAllRecords(true);
- liveDataGrid.setData(records.toArray(new ListGridRecord[records.size()]));
- liveDataGrid.setSelectionType(SelectionStyle.NONE);
- ListGridField name = new ListGridField("name",
MSG.common_title_metric());
- ListGridField value = new ListGridField("value",
MSG.common_title_value());
- liveDataGrid.setFields(name, value);
-
- liveDataWindow.addItem(liveDataGrid);
- liveDataWindow.show();
- }
-}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsResourceView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsResourceView.java
new file mode 100644
index 0000000..bcea825
--- /dev/null
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsResourceView.java
@@ -0,0 +1,167 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2013 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.table;
+
+import java.util.List;
+
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.types.Overflow;
+import com.smartgwt.client.types.VerticalAlignment;
+import com.smartgwt.client.widgets.Img;
+import com.smartgwt.client.widgets.events.ClickEvent;
+import com.smartgwt.client.widgets.events.ClickHandler;
+
+import org.rhq.core.domain.common.EntityContext;
+import org.rhq.core.domain.measurement.Availability;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.IconEnum;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractD3GraphListView;
+import
org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.AvailabilityOverUnderGraphType;
+import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.avail.AvailabilityD3GraphView;
+import org.rhq.enterprise.gui.coregui.client.util.BrowserUtility;
+import org.rhq.enterprise.gui.coregui.client.util.Log;
+import org.rhq.enterprise.gui.coregui.client.util.async.CountDownLatch;
+import org.rhq.enterprise.gui.coregui.client.util.enhanced.EnhancedHLayout;
+
+/**
+ * The consolidated metrics view showing metric graphs and availability data both in
graphical and tabular form.
+ *
+ * @author Mike Thompson
+ */
+public class MetricsResourceView extends AbstractD3GraphListView {
+
+ private static final String COLLAPSED_TOOLTIP =
MSG.chart_metrics_collapse_tooltip();
+ private static final String EXPANDED_TOOLTIP = MSG.chart_metrics_expand_tooltip();
+
+ private final Resource resource;
+ private Img expandCollapseArrow;
+ private final MetricsTableView metricsTableView;
+ private final ResourceMetricAvailabilityView availabilityDetails;
+
+ public MetricsResourceView(Resource resource) {
+ super();
+ setOverflow(Overflow.AUTO);
+ setWidth100();
+ setHeight100();
+ this.resource = resource;
+ metricsTableView = new MetricsTableView(resource, this);
+ availabilityDetails = new ResourceMetricAvailabilityView(resource);
+ }
+
+
+ public void redrawGraphs() {
+ this.onDraw();
+ }
+
+ public void refreshGraphs(){
+ new Timer() {
+ @Override
+ public void run() {
+ availabilityGraph.drawJsniChart();
+ BrowserUtility.graphSparkLines();
+ }
+ }.schedule(150);
+ }
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+ Log.debug("MetricResourceView.onDraw() for: " + resource.getName() +
" id: " + resource.getId());
+ destroyMembers();
+
+
+ addMember(buttonBarDateTimeRangeEditor);
+
+ availabilityGraph = new
AvailabilityD3GraphView<AvailabilityOverUnderGraphType>(
+ new AvailabilityOverUnderGraphType(resource.getId()));
+
+ EnhancedHLayout expandCollapseHLayout = new EnhancedHLayout();
+
+ //add expand/collapse icon
+ expandCollapseArrow = new Img(IconEnum.COLLAPSED_ICON.getIcon16x16Path(), 16,
16);
+ expandCollapseArrow.setTooltip(COLLAPSED_TOOLTIP);
+ expandCollapseArrow.setLayoutAlign(VerticalAlignment.BOTTOM);
+ expandCollapseArrow.addClickHandler(new ClickHandler() {
+ private boolean collapsed = true;
+
+ @Override
+ public void onClick(ClickEvent event) {
+ collapsed = !collapsed;
+ if (collapsed) {
+
expandCollapseArrow.setSrc(IconEnum.COLLAPSED_ICON.getIcon16x16Path());
+ expandCollapseArrow.setTooltip(COLLAPSED_TOOLTIP);
+ availabilityDetails.hide();
+ } else {
+
expandCollapseArrow.setSrc(IconEnum.EXPANDED_ICON.getIcon16x16Path());
+ expandCollapseArrow.setTooltip(EXPANDED_TOOLTIP);
+ availabilityDetails.show();
+
+ }
+ refreshGraphs();
+ }
+ });
+
+
+ expandCollapseHLayout.addMember(expandCollapseArrow);
+ expandCollapseHLayout.addMember(availabilityGraph);
+ addMember(expandCollapseHLayout);
+
+ availabilityDetails.hide();
+ addMember(availabilityDetails);
+
+ metricsTableView.setHeight100();
+ addMember(metricsTableView);
+
+
+ queryAvailability(EntityContext.forResource(resource.getId()),
buttonBarDateTimeRangeEditor.getStartTime(),
+ buttonBarDateTimeRangeEditor.getEndTime(), null);
+ }
+
+ @Override
+ protected void queryAvailability(final EntityContext context, Long startTime, Long
endTime, CountDownLatch notUsed ) {
+
+ final long timerStart = System.currentTimeMillis();
+
+ // now return the availability
+
GWTServiceLookup.getAvailabilityService().getAvailabilitiesForResource(context.getResourceId(),
startTime,
+ endTime, new AsyncCallback<List<Availability>>() {
+ @Override
+ public void onFailure(Throwable caught) {
+
CoreGUI.getErrorHandler().handleError(MSG.view_resource_monitor_availability_loadFailed(),
caught);
+ }
+
+ @Override
+ public void onSuccess(List<Availability> availList) {
+ Log.debug("\nSuccessfully queried availability in: " +
(System.currentTimeMillis() - timerStart)
+ + " ms.");
+ availabilityGraph.setAvailabilityList(availList);
+ new Timer() {
+ @Override
+ public void run() {
+ availabilityGraph.drawJsniChart();
+ }
+ }.schedule(150);
+ }
+ });
+ }
+
+}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsTableDataSource.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsTableDataSource.java
index 318166d..57e62ab 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsTableDataSource.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsTableDataSource.java
@@ -1,7 +1,13 @@
package
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.table;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
@@ -11,18 +17,28 @@ import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.criteria.Criteria;
+import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.measurement.DataType;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.measurement.MeasurementSchedule;
+import org.rhq.core.domain.measurement.composite.MeasurementDataNumericHighLowComposite;
import org.rhq.core.domain.measurement.ui.MetricDisplaySummary;
import org.rhq.core.domain.measurement.ui.MetricDisplayValue;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.resource.composite.ResourceComposite;
+import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import
org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
import org.rhq.enterprise.gui.coregui.client.util.BrowserUtility;
+import org.rhq.enterprise.gui.coregui.client.util.Log;
import org.rhq.enterprise.gui.coregui.client.util.MeasurementUtility;
import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+import org.rhq.enterprise.gui.coregui.client.util.async.Command;
+import org.rhq.enterprise.gui.coregui.client.util.async.CountDownLatch;
import
org.rhq.enterprise.gui.coregui.client.util.preferences.MeasurementUserPreferences;
-import org.rhq.enterprise.gui.coregui.client.util.preferences.UserPreferences;
/**
* A simple data source to read in metric data summaries for a resource.
@@ -31,9 +47,13 @@ import
org.rhq.enterprise.gui.coregui.client.util.preferences.UserPreferences;
* we just load them all in at once.
*
* @author John Mazzitelli
+ * @author Mike Thompson
+ * @todo: get rid of this once we have tested the new screen out
*/
+@Deprecated
public class MetricsTableDataSource extends RPCDataSource<MetricDisplaySummary,
Criteria> {
+ public static final String FIELD_SPARKLINE = "sparkline";
public static final String FIELD_METRIC_LABEL = "label";
public static final String FIELD_ALERT_COUNT = "alertCount";
public static final String FIELD_MIN_VALUE = "min";
@@ -44,11 +64,15 @@ public class MetricsTableDataSource extends
RPCDataSource<MetricDisplaySummary,
public static final String FIELD_METRIC_SCHED_ID = "schedId";
public static final String FIELD_METRIC_UNITS = "units";
public static final String FIELD_METRIC_NAME = "name";
-
+ public static final String FIELD_RESOURCE_ID = "resourceId";
private int resourceId;
+ private List<MetricDisplaySummary> metricDisplaySummaries;
+ private List<List<MeasurementDataNumericHighLowComposite>>
metricsDataList;
+ private MeasurementUserPreferences measurementUserPrefs;
public MetricsTableDataSource(int resourceId) {
this.resourceId = resourceId;
+ measurementUserPrefs = new
MeasurementUserPreferences(UserSessionManager.getUserPreferences());
}
/**
@@ -58,7 +82,25 @@ public class MetricsTableDataSource extends
RPCDataSource<MetricDisplaySummary,
* @return list grid fields used to display the datasource data
*/
public ArrayList<ListGridField> getListGridFields() {
- ArrayList<ListGridField> fields = new ArrayList<ListGridField>(6);
+ ArrayList<ListGridField> fields = new ArrayList<ListGridField>(7);
+
+ ListGridField sparklineField = new ListGridField(FIELD_SPARKLINE,
"chart");
+ sparklineField.setCellFormatter(new CellFormatter() {
+ @Override
+ public String format(Object value, ListGridRecord record, int rowNum, int
colNum) {
+ if (value == null) {
+ return "";
+ }
+ String contents = "<span id='sparkline_" + resourceId +
"-"
+ + record.getAttributeAsInt(FIELD_METRIC_DEF_ID) + "'
class='dynamicsparkline' width='70' "
+ + "values='" + record.getAttribute(FIELD_SPARKLINE) +
"'></span>";
+ return contents;
+
+ }
+ });
+
+ sparklineField.setWidth(80);
+ fields.add(sparklineField);
ListGridField nameField = new ListGridField(FIELD_METRIC_LABEL,
MSG.common_title_name());
nameField.setWidth("30%");
@@ -101,6 +143,7 @@ public class MetricsTableDataSource extends
RPCDataSource<MetricDisplaySummary,
MeasurementUtility.formatSimpleMetrics(from);
ListGridRecord record = new ListGridRecord();
+ record.setAttribute(FIELD_SPARKLINE, getCsvMetricsForSparkline());
record.setAttribute(FIELD_METRIC_LABEL, from.getLabel());
record.setAttribute(FIELD_ALERT_COUNT, String.valueOf(from.getAlertCount()));
record.setAttribute(FIELD_MIN_VALUE, getMetricStringValue(from.getMinMetric()));
@@ -111,9 +154,32 @@ public class MetricsTableDataSource extends
RPCDataSource<MetricDisplaySummary,
record.setAttribute(FIELD_METRIC_SCHED_ID, from.getScheduleId());
record.setAttribute(FIELD_METRIC_UNITS, from.getUnits());
record.setAttribute(FIELD_METRIC_NAME, from.getMetricName());
+ record.setAttribute(FIELD_RESOURCE_ID, resourceId);
return record;
}
+ private String getCsvMetricsForSparkline() {
+ StringBuilder sb = new StringBuilder();
+ Log.debug("getCsvMetricsForSparkline.metricsDataList: " +
metricsDataList.size());
+ for (List<MeasurementDataNumericHighLowComposite> measurementData :
metricsDataList) {
+ for (int i = 0; i < measurementData.size(); i++) {
+ // take the last 20 values
+ if (i >= measurementData.size() - 20) {
+ if (!Double.isNaN(measurementData.get(i).getValue())) {
+ sb.append((int) measurementData.get(i).getValue());
+ sb.append(",");
+ }
+ }
+ }
+ if (sb.toString().endsWith(",")) {
+ sb.setLength(sb.length() - 1);
+ }
+ }
+ Log.debug("getCsvMetricsForSparkline: " + sb.toString());
+
+ return sb.toString();
+ }
+
protected String getMetricStringValue(MetricDisplayValue value) {
return (value != null) ? value.toString() : "";
}
@@ -127,34 +193,54 @@ public class MetricsTableDataSource extends
RPCDataSource<MetricDisplaySummary,
@Override
protected void executeFetch(final DSRequest request, final DSResponse response, final
Criteria unused) {
- // see MetricsTableUIBean for the old JSF class to see where this came from
-
GWTServiceLookup.getMeasurementScheduleService().findSchedulesForResourceAndType(resourceId,
DataType.MEASUREMENT, null, true, new
AsyncCallback<ArrayList<MeasurementSchedule>>() {
@Override
- public void onSuccess(ArrayList<MeasurementSchedule> result) {
- int[] schedIds = new int[result.size()];
+ public void onSuccess(ArrayList<MeasurementSchedule>
measurementSchedules) {
+ int[] scheduleIds = new int[measurementSchedules.size()];
int i = 0;
- for (MeasurementSchedule measurementSchedule : result) {
- schedIds[i++] = measurementSchedule.getId();
+ for (MeasurementSchedule measurementSchedule : measurementSchedules)
{
+ scheduleIds[i++] = measurementSchedule.getId();
}
- UserPreferences prefs = UserSessionManager.getUserPreferences();
- MeasurementUserPreferences mprefs = new
MeasurementUserPreferences(prefs);
- ArrayList<Long> range =
mprefs.getMetricRangePreferences().getBeginEndTimes();
+ final CountDownLatch countDownLatch = CountDownLatch.create(2, new
Command() {
+
+ @Override
+ public void execute() {
+ response.setData(buildRecords(metricDisplaySummaries));
+ processResponse(request.getRequestId(), response);
+
+ new Timer() {
+
+ @Override
+ public void run() {
+ BrowserUtility.graphSparkLines();
+ }
+ }.schedule(150);
+ Log.debug("*** Finished CountdownLatch for metrics
loaded: " + metricsDataList.size());
+ }
+ });
+
+ retrieveResourceMetrics(resourceId, countDownLatch);
+
GWTServiceLookup.getMeasurementChartsService().getMetricDisplaySummariesForResource(resourceId,
- schedIds, range.get(0), range.get(1), new
AsyncCallback<ArrayList<MetricDisplaySummary>>() {
- @Override
- public void onSuccess(ArrayList<MetricDisplaySummary>
result) {
- response.setData(buildRecords(result));
- processResponse(request.getRequestId(), response);
- }
+ scheduleIds,
measurementUserPrefs.getMetricRangePreferences().begin,
+ measurementUserPrefs.getMetricRangePreferences().end,
+ new
AsyncCallback<ArrayList<MetricDisplaySummary>>() {
+ @Override
+ public void
onSuccess(ArrayList<MetricDisplaySummary> metricDisplaySummaries) {
+ setMetricDisplaySummaries(metricDisplaySummaries);
+ countDownLatch.countDown();
+ }
- @Override
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError("Cannot load
metrics", caught);
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Cannot
load metrics", caught);
+ countDownLatch.countDown();
+ }
}
- });
+
+ );
}
@Override
@@ -163,4 +249,87 @@ public class MetricsTableDataSource extends
RPCDataSource<MetricDisplaySummary,
}
});
}
+
+ void setMetricDisplaySummaries(List<MetricDisplaySummary>
metricDisplaySummaries) {
+ this.metricDisplaySummaries = metricDisplaySummaries;
+ }
+
+ public void retrieveResourceMetrics(final Integer resourceId, final CountDownLatch
countDownLatch) {
+
+ ResourceCriteria criteria = new ResourceCriteria();
+ criteria.addFilterId(resourceId);
+
+ //locate the resource
+ GWTServiceLookup.getResourceService().findResourceCompositesByCriteria(criteria,
+ new AsyncCallback<PageList<ResourceComposite>>() {
+ @Override
+ public void onFailure(Throwable caught) {
+ Log.debug("Error retrieving resource resource composite for
resource [" + resourceId + "]:"
+ + caught.getMessage());
+ }
+
+ @Override
+ public void onSuccess(PageList<ResourceComposite>
resourceCompositePageList) {
+ if (!resourceCompositePageList.isEmpty()) {
+ final ResourceComposite resourceComposite =
resourceCompositePageList.get(0);
+ final Resource resource = resourceComposite.getResource();
+ // Load the fully fetched ResourceType.
+ ResourceType resourceType = resource.getResourceType();
+
ResourceTypeRepository.Cache.getInstance().getResourceTypes(resourceType.getId(),
+
EnumSet.of(ResourceTypeRepository.MetadataType.measurements),
+ new ResourceTypeRepository.TypeLoadedCallback() {
+ public void onTypesLoaded(ResourceType type) {
+ resource.setResourceType(type);
+ //metric definitions
+ Set<MeasurementDefinition> definitions =
type.getMetricDefinitions();
+
+ //build id mapping for measurementDefinition
instances Ex. Free Memory -> MeasurementDefinition[100071]
+ final HashMap<String, MeasurementDefinition>
measurementDefMap = new HashMap<String, MeasurementDefinition>();
+ for (MeasurementDefinition definition : definitions)
{
+
measurementDefMap.put(definition.getDisplayName(), definition);
+ }
+ //bundle definition ids for asynch call.
+ int[] definitionArrayIds = new
int[definitions.size()];
+ final String[] displayOrder = new
String[definitions.size()];
+ measurementDefMap.keySet().toArray(displayOrder);
+ //sort the charting data ex. Free Memory, Free Swap
Space,..System Load
+ Arrays.sort(displayOrder);
+
+ //organize definitionArrayIds for ordered request on
server.
+ int index = 0;
+ for (String definitionToDisplay : displayOrder) {
+ definitionArrayIds[index++] =
measurementDefMap.get(definitionToDisplay)
+ .getId();
+ }
+
+
GWTServiceLookup.getMeasurementDataService().findDataForResource(resourceId,
+ definitionArrayIds,
measurementUserPrefs.getMetricRangePreferences().begin,
+
measurementUserPrefs.getMetricRangePreferences().end, 60,
+ new
AsyncCallback<List<List<MeasurementDataNumericHighLowComposite>>>() {
+ @Override
+ public void onFailure(Throwable caught) {
+ Log.warn("Error retrieving recent
metrics charting data for resource ["
+ + resourceId + "]:" +
caught.getMessage());
+ }
+
+ @Override
+ public void onSuccess(
+
List<List<MeasurementDataNumericHighLowComposite>> measurementDataList) {
+
+ if (!measurementDataList.isEmpty()) {
+ metricsDataList =
measurementDataList;
+ Log.debug("*** Setting
metricsDataList.size: "
+ + metricsDataList.size());
+ countDownLatch.countDown();
+ }
+ }
+ });
+
+ }
+ });
+ }
+ }
+ });
+
+ }
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsTableView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsTableView.java
new file mode 100644
index 0000000..09a7bc3
--- /dev/null
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsTableView.java
@@ -0,0 +1,385 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2013 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.table;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.types.ExpansionMode;
+import com.smartgwt.client.types.SelectionStyle;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.HTMLFlow;
+import com.smartgwt.client.widgets.Window;
+import com.smartgwt.client.widgets.events.CloseClickEvent;
+import com.smartgwt.client.widgets.events.CloseClickHandler;
+import com.smartgwt.client.widgets.grid.ListGrid;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.grid.events.DataArrivedEvent;
+import com.smartgwt.client.widgets.grid.events.DataArrivedHandler;
+import com.smartgwt.client.widgets.grid.events.RecordCollapseEvent;
+import com.smartgwt.client.widgets.grid.events.RecordCollapseHandler;
+import com.smartgwt.client.widgets.grid.events.RecordExpandEvent;
+import com.smartgwt.client.widgets.grid.events.RecordExpandHandler;
+import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler;
+import com.smartgwt.client.widgets.grid.events.SelectionEvent;
+import com.smartgwt.client.widgets.grid.events.SortChangedHandler;
+import com.smartgwt.client.widgets.grid.events.SortEvent;
+import com.smartgwt.client.widgets.layout.VLayout;
+
+import org.rhq.core.domain.measurement.MeasurementData;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.measurement.MeasurementUnits;
+import org.rhq.core.domain.measurement.composite.MeasurementDataNumericHighLowComposite;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
+import org.rhq.enterprise.gui.coregui.client.components.table.Table;
+import org.rhq.enterprise.gui.coregui.client.components.table.TableAction;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractD3GraphListView;
+import org.rhq.enterprise.gui.coregui.client.inventory.common.graph.MetricGraphData;
+import org.rhq.enterprise.gui.coregui.client.inventory.common.graph.RedrawGraphs;
+import
org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.StackedBarMetricGraphImpl;
+import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.MetricD3Graph;
+import org.rhq.enterprise.gui.coregui.client.util.BrowserUtility;
+import org.rhq.enterprise.gui.coregui.client.util.Log;
+import org.rhq.enterprise.gui.coregui.client.util.MeasurementConverterClient;
+import
org.rhq.enterprise.gui.coregui.client.util.preferences.MeasurementUserPreferences;
+
+/**
+ * Views a resource's metrics in a tabular view with sparkline graph and optional
detailed d3 graph.
+ *
+ * @author John Mazzitelli
+ * @author Mike Thompson
+ */
+public class MetricsTableView extends Table<MetricsViewDataSource> implements
RedrawGraphs {
+
+ private final Resource resource;
+ private final AbstractD3GraphListView abstractD3GraphListView;
+
+ private final MeasurementUserPreferences measurementUserPrefs;
+ private final AddToDashboardComponent addToDashboardComponent;
+ private MetricsTableListGrid metricsTableListGrid;
+
+ Set<Integer> expandedRows = new HashSet<Integer>();
+
+ public MetricsTableView(Resource resource, AbstractD3GraphListView
abstractD3GraphListView) {
+ super();
+ this.resource = resource;
+ this.abstractD3GraphListView = abstractD3GraphListView;
+ measurementUserPrefs = new
MeasurementUserPreferences(UserSessionManager.getUserPreferences());
+ setDataSource(new MetricsViewDataSource(resource));
+ addToDashboardComponent = new AddToDashboardComponent(resource);
+ }
+
+ /**
+ * Creates this Table's list grid (called by onInit()). Subclasses can override
this if they require a custom
+ * subclass of ListGrid.
+ *
+ * @return this Table's list grid (must be an instance of ListGrid)
+ */
+ @Override
+ protected ListGrid createListGrid() {
+ metricsTableListGrid = new MetricsTableListGrid(this, resource);
+ addToDashboardComponent.setMetricsListGrid(metricsTableListGrid);
+ return metricsTableListGrid;
+ }
+
+ protected void configureTable() {
+ ArrayList<ListGridField> fields = getDataSource().getListGridFields();
+ setListGridFields(fields.toArray(new ListGridField[0]));
+
+ addTableAction(MSG.view_measureTable_getLive(), new
ShowLiveDataTableAction(this));
+ addExtraWidget(addToDashboardComponent, false);
+ addToDashboardComponent.disableAddToDashboardButton();
+ metricsTableListGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
+ @Override
+ public void onSelectionChanged(SelectionEvent selectionEvent) {
+ if(metricsTableListGrid.getSelectedRecords().length > 0){
+ addToDashboardComponent.enableAddToDashboardButton();
+ }else {
+ addToDashboardComponent.disableAddToDashboardButton();
+ }
+ }
+ });
+ }
+
+ private static class ShowLiveDataTableAction implements TableAction {
+ private MetricsTableView metricsTableView;
+
+ public ShowLiveDataTableAction(MetricsTableView metricsTableView) {
+ this.metricsTableView = metricsTableView;
+ }
+
+ @Override
+ public boolean isEnabled(ListGridRecord[] selection) {
+ return selection != null && selection.length > 0;
+ }
+
+ @Override
+ public void executeAction(ListGridRecord[] selection, Object actionValue) {
+ if (selection == null || selection.length == 0) {
+ return;
+ }
+ // keyed on metric name - string[0] is the metric label, [1] is the units
+ final HashMap<String, String[]> scheduleNamesAndUnits = new
HashMap<String, String[]>();
+ int[] definitionIds = new int[selection.length];
+ int i = 0;
+ for (ListGridRecord record : selection) {
+ Integer defId =
record.getAttributeAsInt(MetricsViewDataSource.FIELD_METRIC_DEF_ID);
+ definitionIds[i++] = defId;
+
+ String name =
record.getAttribute(MetricsViewDataSource.FIELD_METRIC_NAME);
+ String label =
record.getAttribute(MetricsViewDataSource.FIELD_METRIC_LABEL);
+ String units =
record.getAttribute(MetricsViewDataSource.FIELD_METRIC_UNITS);
+ if (units == null || units.length() < 1) {
+ units = MeasurementUnits.NONE.name();
+ }
+
+ scheduleNamesAndUnits.put(name, new String[] { label, units });
+ }
+
+ // actually go out and ask the agents for the data
+
GWTServiceLookup.getMeasurementDataService(60000).findLiveData(metricsTableView.resource.getId(),
+ definitionIds, new AsyncCallback<Set<MeasurementData>>() {
+ @Override
+ public void onSuccess(Set<MeasurementData> result) {
+ if (result == null) {
+ result = new HashSet<MeasurementData>(0);
+ }
+ ArrayList<ListGridRecord> records = new
ArrayList<ListGridRecord>(result.size());
+ for (MeasurementData data : result) {
+ String[] nameAndUnits =
scheduleNamesAndUnits.get(data.getName());
+ if (nameAndUnits != null) {
+ double doubleValue;
+ if (data.getValue() instanceof Number) {
+ doubleValue = ((Number)
data.getValue()).doubleValue();
+ } else {
+ doubleValue =
Double.parseDouble(data.getValue().toString());
+ }
+ String value =
MeasurementConverterClient.formatToSignificantPrecision(
+ new double[] { doubleValue },
MeasurementUnits.valueOf(nameAndUnits[1]), true)[0];
+
+ ListGridRecord record = new ListGridRecord();
+ record.setAttribute("name", nameAndUnits[0]);
+ record.setAttribute("value", value);
+ records.add(record);
+ }
+ }
+ Collections.sort(records, new Comparator<ListGridRecord>()
{
+ public int compare(ListGridRecord o1, ListGridRecord o2) {
+ return
o1.getAttribute("name").compareTo(o2.getAttribute("name"));
+ }
+ });
+ showLiveData(records);
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+
CoreGUI.getErrorHandler().handleError(MSG.view_measureTable_getLive_failure(), caught);
+ }
+ });
+ }
+
+ private void showLiveData(ArrayList<ListGridRecord> records) {
+ final Window liveDataWindow = new Window();
+ liveDataWindow.setTitle(MSG.view_measureTable_live_title());
+ liveDataWindow.setShowModalMask(true);
+ liveDataWindow.setShowMinimizeButton(false);
+ liveDataWindow.setShowMaximizeButton(true);
+ liveDataWindow.setShowCloseButton(true);
+ liveDataWindow.setShowResizer(true);
+ liveDataWindow.setCanDragResize(true);
+ liveDataWindow.setDismissOnEscape(true);
+ liveDataWindow.setIsModal(true);
+ liveDataWindow.setWidth(700);
+ liveDataWindow.setHeight(425);
+ liveDataWindow.setAutoCenter(true);
+ liveDataWindow.centerInPage();
+ liveDataWindow.addCloseClickHandler(new CloseClickHandler() {
+ @Override
+ public void onCloseClick(CloseClickEvent event) {
+ liveDataWindow.destroy();
+ metricsTableView.refreshTableInfo();
+ }
+ });
+
+ ListGrid liveDataGrid = new ListGrid();
+ liveDataGrid.setShowAllRecords(true);
+ liveDataGrid.setData(records.toArray(new ListGridRecord[records.size()]));
+ liveDataGrid.setSelectionType(SelectionStyle.NONE);
+ ListGridField name = new ListGridField("name",
MSG.common_title_metric());
+ ListGridField value = new ListGridField("value",
MSG.common_title_value());
+ liveDataGrid.setFields(name, value);
+
+ liveDataWindow.addItem(liveDataGrid);
+ liveDataWindow.show();
+ }
+
+ }
+
+ @Override
+ /**
+ * Redraw Graphs in this context means to refresh the table and redraw open graphs.
+ */
+ public void redrawGraphs() {
+ Log.debug("MetricsView.redrawGraphs.");
+
+ new Timer() {
+
+ @Override
+ public void run() {
+ BrowserUtility.graphSparkLines();
+ }
+ }.schedule(150);
+
+ }
+
+ public class MetricsTableListGrid extends ListGrid {
+
+ private static final int TREEVIEW_DETAIL_CHART_HEIGHT = 205;
+ private static final int NUM_METRIC_POINTS = 60;
+ private Resource resource;
+ final MetricsTableView metricsTableView;
+
+ public MetricsTableListGrid(final MetricsTableView metricsTableView, final
Resource resource) {
+ super();
+ this.resource = resource;
+ this.metricsTableView = metricsTableView;
+ setCanExpandRecords(true);
+ setCanExpandMultipleRecords(true);
+ setExpansionMode(ExpansionMode.DETAIL_FIELD);
+
+ addRecordExpandHandler(new RecordExpandHandler() {
+ @Override
+ public void onRecordExpand(RecordExpandEvent recordExpandEvent) {
+
metricsTableView.expandedRows.add(recordExpandEvent.getRecord().getAttributeAsInt(
+ MetricsViewDataSource.FIELD_METRIC_DEF_ID));
+ redrawGraphs();
+ }
+
+ });
+ addRecordCollapseHandler(new RecordCollapseHandler() {
+ @Override
+ public void onRecordCollapse(RecordCollapseEvent recordCollapseEvent) {
+
metricsTableView.expandedRows.remove(recordCollapseEvent.getRecord().getAttributeAsInt(
+ MetricsViewDataSource.FIELD_METRIC_DEF_ID));
+ redrawGraphs();
+ }
+ });
+ addSortChangedHandler(new SortChangedHandler() {
+ @Override
+ public void onSortChanged(SortEvent sortEvent) {
+ redrawGraphs();
+ }
+ });
+ addDataArrivedHandler(new DataArrivedHandler() {
+ @Override
+ public void onDataArrived(DataArrivedEvent dataArrivedEvent) {
+ int startRow = dataArrivedEvent.getStartRow();
+ int endRow = dataArrivedEvent.getEndRow();
+ for (int i = startRow; i < endRow; i++) {
+ if (null != metricsTableView.expandedRows
+ &&
metricsTableView.expandedRows.contains(getRecord(i).getAttributeAsInt(
+ MetricsViewDataSource.FIELD_METRIC_DEF_ID))) {
+ expandRecord(getRecord(i));
+ }
+ }
+ }
+ });
+
+ }
+
+ @Override
+ protected Canvas getExpansionComponent(final ListGridRecord record) {
+ final Integer definitionId =
record.getAttributeAsInt(MetricsViewDataSource.FIELD_METRIC_DEF_ID);
+ final Integer resourceId =
record.getAttributeAsInt(MetricsViewDataSource.FIELD_RESOURCE_ID);
+ VLayout vLayout = new VLayout();
+ vLayout.setPadding(5);
+
+ final String chartId = "rChart-" + resourceId + "-" +
definitionId;
+ HTMLFlow htmlFlow = new
HTMLFlow(MetricD3Graph.createGraphMarkerTemplate(chartId,
+ TREEVIEW_DETAIL_CHART_HEIGHT));
+ vLayout.addMember(htmlFlow);
+
+ int[] definitionArrayIds = new int[1];
+ definitionArrayIds[0] = definitionId;
+ GWTServiceLookup.getMeasurementDataService().findDataForResource(resourceId,
definitionArrayIds,
+ measurementUserPrefs.getMetricRangePreferences().begin,
+ measurementUserPrefs.getMetricRangePreferences().end, NUM_METRIC_POINTS,
+ new
AsyncCallback<List<List<MeasurementDataNumericHighLowComposite>>>() {
+ @Override
+ public void onFailure(Throwable caught) {
+ Log.warn("Error retrieving recent metrics charting data for
resource [" + resourceId + "]:"
+ + caught.getMessage());
+ }
+
+ @Override
+ public void
onSuccess(List<List<MeasurementDataNumericHighLowComposite>> results) {
+ if (!results.isEmpty()) {
+
+ //load the data results for the given metric definition
+ List<MeasurementDataNumericHighLowComposite>
measurementList = results.get(0);
+
+ MeasurementDefinition measurementDefinition = null;
+ for (MeasurementDefinition definition :
resource.getResourceType().getMetricDefinitions()) {
+ if (definition.getId() == definitionId) {
+ measurementDefinition = definition;
+ break;
+ }
+ }
+
+ MetricGraphData metricGraphData =
MetricGraphData.createForResource(resourceId,
+ resource.getName(), measurementDefinition,
measurementList, null);
+ metricGraphData.setHideLegend(true);
+
+ StackedBarMetricGraphImpl graph =
GWT.create(StackedBarMetricGraphImpl.class);
+ graph.setMetricGraphData(metricGraphData);
+ final MetricD3Graph graphView = new MetricD3Graph(graph,
abstractD3GraphListView);
+ new Timer() {
+ @Override
+ public void run() {
+ graphView.drawJsniChart();
+ BrowserUtility.graphSparkLines();
+
+ }
+ }.schedule(150);
+
+ } else {
+ Log.warn("No chart data retrieving for resource ["
+ resourceId + "-" + definitionId + "]");
+
+ }
+ }
+ });
+
+ return vLayout;
+ }
+ }
+
+}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsViewDataSource.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsViewDataSource.java
new file mode 100644
index 0000000..5c2fe25
--- /dev/null
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsViewDataSource.java
@@ -0,0 +1,307 @@
+package
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.table;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
+import com.smartgwt.client.data.Record;
+import com.smartgwt.client.widgets.grid.CellFormatter;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
+import org.rhq.core.domain.criteria.Criteria;
+import org.rhq.core.domain.measurement.DataType;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.measurement.MeasurementSchedule;
+import org.rhq.core.domain.measurement.composite.MeasurementDataNumericHighLowComposite;
+import org.rhq.core.domain.measurement.ui.MetricDisplaySummary;
+import org.rhq.core.domain.measurement.ui.MetricDisplayValue;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.BrowserUtility;
+import org.rhq.enterprise.gui.coregui.client.util.Log;
+import org.rhq.enterprise.gui.coregui.client.util.MeasurementUtility;
+import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+import org.rhq.enterprise.gui.coregui.client.util.async.Command;
+import org.rhq.enterprise.gui.coregui.client.util.async.CountDownLatch;
+import
org.rhq.enterprise.gui.coregui.client.util.preferences.MeasurementUserPreferences;
+
+/**
+ * A simple data source to read in metric data summaries for a resource.
+ * This doesn't support paging - everything is returned in one query. Since
+ * the number of metrics per resource is relatively small (never more than tens of
them),
+ * we just load them all in at once.
+ *
+ * @author John Mazzitelli
+ * @author Mike Thompson
+ */
+public class MetricsViewDataSource extends RPCDataSource<MetricDisplaySummary,
Criteria> {
+
+ private static final int NUMBER_OF_METRIC_POINTS = 60;
+ public static final String FIELD_SPARKLINE = "sparkline";
+ public static final String FIELD_METRIC_LABEL = "label";
+ public static final String FIELD_ALERT_COUNT = "alertCount";
+ public static final String FIELD_MIN_VALUE = "min";
+ public static final String FIELD_MAX_VALUE = "max";
+ public static final String FIELD_AVG_VALUE = "avg";
+ public static final String FIELD_LAST_VALUE = "last";
+ public static final String FIELD_METRIC_DEF_ID = "defId";
+ public static final String FIELD_METRIC_SCHED_ID = "schedId";
+ public static final String FIELD_METRIC_UNITS = "units";
+ public static final String FIELD_METRIC_NAME = "name";
+ public static final String FIELD_RESOURCE_ID = "resourceId";
+ private final Resource resource;
+ private List<MetricDisplaySummary> metricDisplaySummaries;
+ private List<List<MeasurementDataNumericHighLowComposite>>
metricsDataList;
+ private int[] definitionArrayIds;
+ private final MeasurementUserPreferences measurementUserPrefs;
+
+ public MetricsViewDataSource(Resource resource) {
+ this.resource = resource;
+ measurementUserPrefs = new
MeasurementUserPreferences(UserSessionManager.getUserPreferences());
+ }
+
+ /**
+ * The view that contains the list grid which will display this datasource's data
will call this
+ * method to get the field information which is used to control the display of the
data.
+ *
+ * @return list grid fields used to display the datasource data
+ */
+ public ArrayList<ListGridField> getListGridFields() {
+ ArrayList<ListGridField> fields = new ArrayList<ListGridField>(7);
+
+ ListGridField sparklineField = new ListGridField(FIELD_SPARKLINE,
MSG.chart_metrics_sparkline_header());
+ sparklineField.setCellFormatter(new CellFormatter() {
+ @Override
+ public String format(Object value, ListGridRecord record, int rowNum, int
colNum) {
+ if (value == null) {
+ return "";
+ }
+ String contents = "<span id='sparkline_" +
resource.getId() + "-"
+ + record.getAttributeAsInt(FIELD_METRIC_DEF_ID) + "'
class='dynamicsparkline' width='70' "
+ + "values='" + record.getAttribute(FIELD_SPARKLINE) +
"'></span>";
+ return contents;
+
+ }
+ });
+
+ sparklineField.setWidth(80);
+ fields.add(sparklineField);
+
+ ListGridField nameField = new ListGridField(FIELD_METRIC_LABEL,
MSG.common_title_name());
+ nameField.setWidth("30%");
+ fields.add(nameField);
+
+ ListGridField minField = new ListGridField(FIELD_MIN_VALUE,
MSG.view_resource_monitor_table_min());
+ minField.setWidth("15%");
+ fields.add(minField);
+
+ ListGridField maxField = new ListGridField(FIELD_MAX_VALUE,
MSG.view_resource_monitor_table_max());
+ maxField.setWidth("15%");
+ fields.add(maxField);
+
+ ListGridField avgField = new ListGridField(FIELD_AVG_VALUE,
MSG.view_resource_monitor_table_avg());
+ avgField.setWidth("15%");
+ fields.add(avgField);
+
+ ListGridField lastField = new ListGridField(FIELD_LAST_VALUE,
MSG.view_resource_monitor_table_last());
+ lastField.setWidth("15%");
+ fields.add(lastField);
+
+ ListGridField alertsField = new ListGridField(FIELD_ALERT_COUNT,
MSG.common_title_alerts());
+ alertsField.setWidth("10%");
+ fields.add(alertsField);
+
+ return fields;
+ }
+
+ @Override
+ public MetricDisplaySummary copyValues(Record from) {
+ // we should never need this method - we only go in one direction
+ // if we ever need this, just have copyValues store an "object"
attribute whose value is "from"
+ // which this method then just reads out. Since we don't need this now, save
memory by not
+ // keeping the MetricDisplayValue around
+ return null;
+ }
+
+ @Override
+ public ListGridRecord copyValues(MetricDisplaySummary from) {
+ MeasurementUtility.formatSimpleMetrics(from);
+
+ ListGridRecord record = new ListGridRecord();
+ record.setAttribute(FIELD_SPARKLINE,
getCsvMetricsForSparkline(from.getDefinitionId()));
+ record.setAttribute(FIELD_METRIC_LABEL, from.getLabel());
+ record.setAttribute(FIELD_ALERT_COUNT, String.valueOf(from.getAlertCount()));
+ record.setAttribute(FIELD_MIN_VALUE, getMetricStringValue(from.getMinMetric()));
+ record.setAttribute(FIELD_MAX_VALUE, getMetricStringValue(from.getMaxMetric()));
+ record.setAttribute(FIELD_AVG_VALUE, getMetricStringValue(from.getAvgMetric()));
+ record.setAttribute(FIELD_LAST_VALUE,
getMetricStringValue(from.getLastMetric()));
+ record.setAttribute(FIELD_METRIC_DEF_ID, from.getDefinitionId());
+ record.setAttribute(FIELD_METRIC_SCHED_ID, from.getScheduleId());
+ record.setAttribute(FIELD_METRIC_UNITS, from.getUnits());
+ record.setAttribute(FIELD_METRIC_NAME, from.getMetricName());
+ record.setAttribute(FIELD_RESOURCE_ID, resource.getId());
+ return record;
+ }
+
+ private String getCsvMetricsForSparkline(int definitionId) {
+ StringBuilder sb = new StringBuilder();
+ List<MeasurementDataNumericHighLowComposite> selectedMetricsList =
getMeasurementsForMeasurementDefId(definitionId);
+
+ for (int i = 0; i < selectedMetricsList.size(); i++) {
+ MeasurementDataNumericHighLowComposite measurementData =
selectedMetricsList.get(i);
+ if (!Double.isNaN(measurementData.getValue())) {
+ sb.append((int) measurementData.getValue());
+ sb.append(",");
+ }
+ }
+
+ if (sb.toString().endsWith(",")) {
+ sb.setLength(sb.length() - 1);
+ }
+
+ return sb.toString();
+ }
+
+ List<MeasurementDataNumericHighLowComposite>
getMeasurementsForMeasurementDefId(int definitionId) {
+ int selectedIndex = 0;
+
+ // find the ordinal position as specified when querying the metrics
+ for (int i = 0; i < definitionArrayIds.length; i++) {
+ if (definitionArrayIds[i] == definitionId) {
+ selectedIndex = i;
+ break;
+ }
+ }
+
+ return metricsDataList.get(selectedIndex);
+ }
+
+ protected String getMetricStringValue(MetricDisplayValue value) {
+ return (value != null) ? value.toString() : "";
+ }
+
+ @Override
+ protected Criteria getFetchCriteria(DSRequest request) {
+ // NOTE: we don't use criterias for this datasource, just return null
+ return null;
+ }
+
+ @Override
+ protected void executeFetch(final DSRequest request, final DSResponse response, final
Criteria unused) {
+
+
GWTServiceLookup.getMeasurementScheduleService().findSchedulesForResourceAndType(resource.getId(),
+ DataType.MEASUREMENT, null, true, new
AsyncCallback<ArrayList<MeasurementSchedule>>() {
+ @Override
+ public void onSuccess(ArrayList<MeasurementSchedule>
measurementSchedules) {
+ int[] scheduleIds = new int[measurementSchedules.size()];
+ int i = 0;
+ for (MeasurementSchedule measurementSchedule : measurementSchedules)
{
+ scheduleIds[i++] = measurementSchedule.getId();
+ }
+
+ final CountDownLatch countDownLatch = CountDownLatch.create(2, new
Command() {
+
+ @Override
+ public void execute() {
+ response.setData(buildRecords(metricDisplaySummaries));
+ processResponse(request.getRequestId(), response);
+
+ new Timer() {
+
+ @Override
+ public void run() {
+ BrowserUtility.graphSparkLines();
+ }
+ }.schedule(150);
+ }
+ });
+
+ queryResourceMetrics(resource,
measurementUserPrefs.getMetricRangePreferences().begin,
+ measurementUserPrefs.getMetricRangePreferences().end,
countDownLatch);
+ queryMetricDisplaySummaries(scheduleIds,
measurementUserPrefs.getMetricRangePreferences().begin,
+ measurementUserPrefs.getMetricRangePreferences().end,
countDownLatch);
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Cannot load
schedules", caught);
+ }
+ });
+ }
+
+ private void queryMetricDisplaySummaries(int[] scheduleIds, Long startTime, Long
endTime,
+ final CountDownLatch countDownLatch) {
+
GWTServiceLookup.getMeasurementChartsService().getMetricDisplaySummariesForResource(resource.getId(),
+ scheduleIds, startTime, endTime, new
AsyncCallback<ArrayList<MetricDisplaySummary>>() {
+ @Override
+ public void onSuccess(ArrayList<MetricDisplaySummary>
metricDisplaySummaries) {
+ setMetricDisplaySummaries(metricDisplaySummaries);
+ countDownLatch.countDown();
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Cannot load
metrics", caught);
+ countDownLatch.countDown();
+ }
+ }
+
+ );
+ }
+
+ void setMetricDisplaySummaries(List<MetricDisplaySummary>
metricDisplaySummaries) {
+ this.metricDisplaySummaries = metricDisplaySummaries;
+ }
+
+ public void queryResourceMetrics(final Resource resource, Long startTime, Long
endTime,
+ final CountDownLatch countDownLatch) {
+ Set<MeasurementDefinition> definitions =
resource.getResourceType().getMetricDefinitions();
+
+ //build id mapping for measurementDefinition instances Ex. Free Memory ->
MeasurementDefinition[100071]
+ final HashMap<String, MeasurementDefinition> measurementDefMap = new
HashMap<String, MeasurementDefinition>();
+ for (MeasurementDefinition definition : definitions) {
+ measurementDefMap.put(definition.getDisplayName(), definition);
+ }
+ //bundle definition ids for asynch call.
+ definitionArrayIds = new int[definitions.size()];
+ final String[] displayOrder = new String[definitions.size()];
+ measurementDefMap.keySet().toArray(displayOrder);
+ //sort the charting data ex. Free Memory, Free Swap Space,..System Load
+ Arrays.sort(displayOrder);
+
+ //organize definitionArrayIds for ordered request on server.
+ int index = 0;
+ for (String definitionToDisplay : displayOrder) {
+ definitionArrayIds[index++] =
measurementDefMap.get(definitionToDisplay).getId();
+ }
+
+
GWTServiceLookup.getMeasurementDataService().findDataForResource(resource.getId(),
definitionArrayIds,
+ startTime, endTime, NUMBER_OF_METRIC_POINTS,
+ new
AsyncCallback<List<List<MeasurementDataNumericHighLowComposite>>>() {
+ @Override
+ public void onFailure(Throwable caught) {
+ Log.warn("Error retrieving recent metrics charting data for
resource [" + resource.getId() + "]:"
+ + caught.getMessage());
+ }
+
+ @Override
+ public void
onSuccess(List<List<MeasurementDataNumericHighLowComposite>>
measurementDataList) {
+
+ if (null != measurementDataList &&
!measurementDataList.isEmpty()) {
+ metricsDataList = measurementDataList;
+ countDownLatch.countDown();
+ }
+ }
+ });
+
+ }
+}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/ResourceMetricAvailabilityView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/ResourceMetricAvailabilityView.java
new file mode 100644
index 0000000..9d6b892
--- /dev/null
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/ResourceMetricAvailabilityView.java
@@ -0,0 +1,208 @@
+/*
+ * RHQ Management Platform
+ * Copyright 2012, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.table;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.FormItem;
+import com.smartgwt.client.widgets.form.fields.StaticTextItem;
+
+import org.rhq.core.domain.measurement.MeasurementUnits;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.composite.ResourceAvailabilitySummary;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.components.table.TimestampCellFormatter;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.MeasurementConverterClient;
+import org.rhq.enterprise.gui.coregui.client.util.enhanced.EnhancedVLayout;
+
+/**
+ * This shows the availability history for a resource.
+ *
+ * @author Jay Shaughnessy
+ * @author John Mazzitelli
+ * @author Mike Thompson
+ */
+public class ResourceMetricAvailabilityView extends EnhancedVLayout {
+
+ private Resource resource;
+ private StaticTextItem currentField;
+ private StaticTextItem availField;
+ private StaticTextItem availTimeField;
+ private StaticTextItem downField;
+ private StaticTextItem downTimeField;
+ private StaticTextItem disabledField;
+ private StaticTextItem disabledTimeField;
+ private StaticTextItem failureCountField;
+ private StaticTextItem disabledCountField;
+ private StaticTextItem mtbfField;
+ private StaticTextItem mttrField;
+ private StaticTextItem unknownField;
+ private StaticTextItem currentTimeField;
+
+ public ResourceMetricAvailabilityView(Resource resource) {
+ super();
+
+ this.resource = resource;
+
+ setWidth100();
+ setHeight(165);
+ }
+
+ @Override
+ protected void onInit() {
+ super.onInit();
+
+ addMember(createSummaryForm());
+ }
+
+ private DynamicForm createSummaryForm() {
+ DynamicForm form = new DynamicForm();
+ form.setWidth100();
+ form.setAutoHeight();
+ form.setMargin(10);
+ form.setNumCols(4);
+
+ // row 1
+ currentField = new StaticTextItem("current",
MSG.view_resource_monitor_availability_currentStatus());
+ currentField.setWrapTitle(false);
+ currentField.setColSpan(4);
+
+ // row 2
+ availField = new StaticTextItem("avail",
MSG.view_resource_monitor_availability_availability());
+ availField.setWrapTitle(false);
+ prepareTooltip(availField,
MSG.view_resource_monitor_availability_availability_tooltip());
+
+ availTimeField = new StaticTextItem("availTime",
MSG.view_resource_monitor_availability_uptime());
+ availTimeField.setWrapTitle(false);
+ prepareTooltip(availTimeField,
MSG.view_resource_monitor_availability_uptime_tooltip());
+
+ // row 3
+ downField = new StaticTextItem("down",
MSG.view_resource_monitor_availability_down());
+ downField.setWrapTitle(false);
+ prepareTooltip(downField,
MSG.view_resource_monitor_availability_down_tooltip());
+
+ downTimeField = new StaticTextItem("downTime",
MSG.view_resource_monitor_availability_downtime());
+ downTimeField.setWrapTitle(false);
+ prepareTooltip(downTimeField,
MSG.view_resource_monitor_availability_downtime_tooltip());
+
+ // row 4
+ disabledField = new StaticTextItem("disabled",
MSG.view_resource_monitor_availability_disabled());
+ disabledField.setWrapTitle(false);
+ prepareTooltip(disabledField,
MSG.view_resource_monitor_availability_disabled_tooltip());
+
+ disabledTimeField = new StaticTextItem("disabledTime",
MSG.view_resource_monitor_availability_disabledTime());
+ disabledTimeField.setWrapTitle(false);
+ prepareTooltip(disabledTimeField,
MSG.view_resource_monitor_availability_disabledTime_tooltip());
+
+ // row 5
+ failureCountField = new StaticTextItem("failureCount",
MSG.view_resource_monitor_availability_numFailures());
+ failureCountField.setWrapTitle(false);
+ prepareTooltip(failureCountField,
MSG.view_resource_monitor_availability_numFailures_tooltip());
+
+ disabledCountField = new StaticTextItem("disabledCount",
MSG.view_resource_monitor_availability_numDisabled());
+ disabledCountField.setWrapTitle(false);
+ prepareTooltip(disabledCountField,
MSG.view_resource_monitor_availability_numDisabled_tooltip());
+
+ // row 6
+ mtbfField = new StaticTextItem("mtbf",
MSG.view_resource_monitor_availability_mtbf());
+ mtbfField.setWrapTitle(false);
+ prepareTooltip(mtbfField,
MSG.view_resource_monitor_availability_mtbf_tooltip());
+
+ mttrField = new StaticTextItem("mttr",
MSG.view_resource_monitor_availability_mttr());
+ mttrField.setWrapTitle(false);
+ prepareTooltip(mttrField,
MSG.view_resource_monitor_availability_mttr_tooltip());
+
+ // row 7
+ unknownField = new StaticTextItem("unknown");
+ unknownField.setWrapTitle(false);
+ unknownField.setColSpan(4);
+ unknownField.setShowTitle(false);
+
+ // row 8
+ currentTimeField = new StaticTextItem("currentTime");
+ currentTimeField.setWrapTitle(false);
+ currentTimeField.setColSpan(4);
+ currentTimeField.setShowTitle(false);
+
+ form.setItems(currentField, availField, availTimeField, downField, downTimeField,
disabledField,
+ disabledTimeField, failureCountField, disabledCountField, mtbfField,
mttrField, unknownField,
+ currentTimeField);
+
+ reloadSummaryData();
+
+ return form;
+ }
+
+ private void reloadSummaryData() {
+
GWTServiceLookup.getResourceService().getResourceAvailabilitySummary(resource.getId(),
+ new AsyncCallback<ResourceAvailabilitySummary>() {
+
+ @Override
+ public void onSuccess(ResourceAvailabilitySummary result) {
+
+
currentField.setValue(MSG.view_resource_monitor_availability_currentStatus_value(result
+ .getCurrent().getName(),
TimestampCellFormatter.format(result.getLastChange().getTime())));
+
availField.setValue(MeasurementConverterClient.format(result.getUpPercentage(),
+ MeasurementUnits.PERCENTAGE, true));
+ availTimeField.setValue(MeasurementConverterClient.format((double)
result.getUpTime(),
+ MeasurementUnits.MILLISECONDS, true));
+
downField.setValue(MeasurementConverterClient.format(result.getDownPercentage(),
+ MeasurementUnits.PERCENTAGE, true));
+ downTimeField.setValue(MeasurementConverterClient.format((double)
result.getDownTime(),
+ MeasurementUnits.MILLISECONDS, true));
+
disabledField.setValue(MeasurementConverterClient.format(result.getDisabledPercentage(),
+ MeasurementUnits.PERCENTAGE, true));
+ disabledTimeField.setValue(MeasurementConverterClient.format((double)
result.getDisabledTime(),
+ MeasurementUnits.MILLISECONDS, true));
+ failureCountField.setValue(result.getFailures());
+ disabledCountField.setValue(result.getDisabled());
+ mtbfField.setValue(MeasurementConverterClient.format((double)
result.getMTBF(),
+ MeasurementUnits.MILLISECONDS, true));
+ mttrField.setValue(MeasurementConverterClient.format((double)
result.getMTTR(),
+ MeasurementUnits.MILLISECONDS, true));
+
+ if (result.getUnknownTime() > 0L) {
+
unknownField.setValue(MSG.view_resource_monitor_availability_unknown(MeasurementConverterClient
+ .format((double) result.getUnknownTime(),
MeasurementUnits.MILLISECONDS, true)));
+ } else {
+ unknownField.setValue("");
+ }
+
+
currentTimeField.setValue(MSG.view_resource_monitor_availability_currentAsOf(TimestampCellFormatter
+ .format(result.getCurrentTime())));
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ currentField.setValue(MSG.common_label_error());
+ CoreGUI.getErrorHandler()
+
.handleError(MSG.view_resource_monitor_availability_summaryError(), caught);
+ }
+ });
+ }
+
+ private void prepareTooltip(FormItem item, String tooltip) {
+ item.setHoverWidth(400);
+ item.setPrompt(tooltip);
+ }
+
+}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/searchbar/BasicSearchStrategy.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/searchbar/BasicSearchStrategy.java
index 1edd076..94fd1e8 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/searchbar/BasicSearchStrategy.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/searchbar/BasicSearchStrategy.java
@@ -26,7 +26,6 @@ import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.widgets.form.fields.events.KeyUpEvent;
import com.smartgwt.client.widgets.grid.HoverCustomizer;
import com.smartgwt.client.widgets.grid.ListGrid;
-import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
@@ -89,17 +88,14 @@ public class BasicSearchStrategy extends AbstractSearchStrategy {
*/
@Override
public void onRecordClick(RecordClickEvent event) {
- Log.debug("BasicSearchStrategy click");
String kind = event.getRecord().getAttribute(ATTR_KIND);
String searchExpression;
if (kind.equals("SAVED") || kind.equals("GLOBAL")) {
- Log.debug("Saved or Global Search Click");
searchExpression = event.getRecord().getAttribute(ATTR_PATTERN);
} else {
- Log.debug("Regular Search Click");
searchExpression = event.getRecord().getAttribute(ATTR_NAME);
}
@@ -112,14 +108,12 @@ public class BasicSearchStrategy extends AbstractSearchStrategy {
@Override
public void searchFocusHandler() {
- Log.debug("focus in BasicSearchStrategy");
String searchExpression = searchBar.getSearchTextItem().getValueAsString();
doSearch(searchExpression);
}
@Override
public void searchKeyUpHandler(KeyUpEvent keyUpEvent) {
- Log.debug("Keyup in BasicSearchStrategy: " + keyUpEvent.getKeyName());
String searchExpression = searchBar.getSearchTextItem().getValueAsString();
doSearch(searchExpression);
}
@@ -131,20 +125,16 @@ public class BasicSearchStrategy extends AbstractSearchStrategy {
private void doSearch(String searchExpression) {
if (isSearchInProgress) {
- Log.debug("Adding pending search [" + searchExpression +
"]");
pendingSearchExpression = (null == searchExpression) ? "" :
searchExpression;
return;
}
- Log.debug("Search Start");
isSearchInProgress = true;
if (null == searchExpression || searchExpression.isEmpty()) {
- Log.debug("Empty Search expression");
getSearchSuggestions(SearchSubsystem.RESOURCE, null, 0);
} else {
- Log.debug("doSearch: " + searchExpression);
getSearchSuggestions(SearchSubsystem.RESOURCE,
searchBar.getSearchTextItem().getValueAsString(), searchBar
.getSearchTextItem().getValueAsString().length());
}
@@ -154,7 +144,6 @@ public class BasicSearchStrategy extends AbstractSearchStrategy {
final long suggestStart = System.currentTimeMillis();
- Log.debug("Searching for: " + expression);
searchService.getTabAwareSuggestions(searchSubsystem, expression, caretPosition,
null,
new AsyncCallback<List<SearchSuggestion>>() {
@@ -179,7 +168,6 @@ public class BasicSearchStrategy extends AbstractSearchStrategy {
ds.setFields(idField, valueField);
searchBarPickListGrid.setDataSource(ds);
- ListGridField[] fields =
searchBarPickListGrid.getAllFields();
searchBarPickListGrid.getField(ATTR_VALUE).setShowHover(true);
searchBarPickListGrid.getField(ATTR_VALUE).setHoverCustomizer(new HoverCustomizer() {
@@ -223,7 +211,7 @@ public class BasicSearchStrategy extends AbstractSearchStrategy {
searchBarPickListGrid.setData(new ListGridRecord[] {});
searchBarPickListGrid.fetchData();
} catch (Exception e) {
- Log.debug("Caught exception on fetchData: " + e);
+ Log.info("Caught exception on fetchData: " + e);
}
long suggestFetchTime = System.currentTimeMillis() -
suggestStart;
@@ -250,7 +238,6 @@ public class BasicSearchStrategy extends AbstractSearchStrategy {
@Override
public void onFailure(Throwable caught) {
- Log.debug("Search End");
isSearchInProgress = false;
pendingSearchExpression = null;
CoreGUI.getErrorHandler().handleError(MSG.view_searchBar_suggest_failSuggest(), caught);
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/enhanced/Enhanced.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/enhanced/Enhanced.java
index 10505e9..a069a5d 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/enhanced/Enhanced.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/enhanced/Enhanced.java
@@ -31,5 +31,5 @@ import org.rhq.enterprise.gui.coregui.client.Messages;
*/
public interface Enhanced {
- Messages MSG = CoreGUI.getMessages();
+ final static Messages MSG = CoreGUI.getMessages();
}
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 19d3fa5..abcfa62 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
@@ -20,6 +20,10 @@ chart_hover_period_label = Period
chart_hover_start_label = Start
chart_hover_time_format = %I:%M:%S %p
chart_ie_not_supported = Charting is not available for this browser.
+chart_metrics= Metrics
+chart_metrics_collapse_tooltip= Click here to see additional tabular availability data.
+chart_metrics_expand_tooltip= Click here to collapse additional availability detail.
+chart_metrics_sparkline_header= Chart
chart_no_data_label = No Data
chart_single_value_label = Value
chart_slider_button_bar_day = Day
@@ -1792,6 +1796,7 @@ view_messageCenter_messageTime = Time
view_messageCenter_messageTitle = Message Center
view_messageCenter_noRecentMessages = No Recent Messages
view_messageCenter_stackTraceFollows = --- STACK TRACE FOLLOWS ---
+view_metric_addToDashboard = Add to Dashboard
view_metric_traits = Traits
view_metric_viewTraitHistory = Value History for Trait [{0}]
view_operationHistoryDetails_dateCompleted = Date Completed
@@ -2111,7 +2116,7 @@ view_titleBar_common_updateTagsSuccessful = The tags for [{0}] have
been updated
view_titleBar_group_failInfo = Failed to get general info on group [{0}] with ID [{1}]
view_titleBar_group_summary_collapsedTooltip = Click to show more details for this group
view_titleBar_group_summary_expandedTooltip = Click to hide details for this group
-view_tree_common_contextMenu_addChartToDashboard = Add chart to dashboard [{0}]
+view_tree_common_contextMenu_addChartToDashboard = Add Graph to Dashboard [{0}]
view_tree_common_contextMenu_editPluginConfiguration = Edit [{0}] Plugin Configuration
view_tree_common_contextMenu_editResourceConfiguration = Edit [{0}] Resource
Configuration
view_tree_common_contextMenu_groupGraph = Group Metric Graph
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 f71f907..3a79eeb 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
@@ -48,6 +48,10 @@ chart_hover_date_format = %d.%m.%y
##chart_hover_start_label = Start
chart_hover_time_format = %H:%M:%S
##chart_ie_not_supported = Charting is not available for this browser.
+##chart_metrics= Metrics
+##chart_metrics_collapse_tooltip= Click here to see additional tabular availability
data.
+##chart_metrics_expand_tooltip= Click here to collapse additional availability detail.
+##chart_metrics_sparkline_header= Chart
##chart_no_data_label = No Data
##chart_single_value_label = Value
##chart_slider_button_bar_day = Day
@@ -1804,6 +1808,7 @@ view_messageCenter_messageTime = Čas
view_messageCenter_messageTitle = Centrum zpráv
view_messageCenter_noRecentMessages = Žádné nové zprávy
view_messageCenter_stackTraceFollows = --- VÝPIS ZÁSOBNÍKU NÍŽE ---
+##view_metric_addToDashboard = Add to Dashboard
view_metric_traits = Vlastnosti
view_metric_viewTraitHistory = Historie hodnot pro vlastnost [{0}]
view_operationHistoryDetails_dateCompleted = Datum ukončení
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 524dcc0..e79504c 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
@@ -23,6 +23,10 @@ chart_hover_period_label = Zeitraum
chart_hover_start_label = Start
chart_hover_time_format = %H:%M:%S
chart_ie_not_supported = Charting ist bei diesem Browser nicht unterstützt
+##chart_metrics= Metrics
+##chart_metrics_collapse_tooltip= Click here to see additional tabular availability
data.
+##chart_metrics_expand_tooltip= Click here to collapse additional availability detail.
+##chart_metrics_sparkline_header= Chart
chart_no_data_label = Keine Daten vorhanden
##chart_single_value_label = Value
chart_slider_button_bar_day = Tag
@@ -1591,6 +1595,7 @@ view_messageCenter_messageTime = Zeitpukt
view_messageCenter_messageTitle = Nachrichtencenter
view_messageCenter_noRecentMessages = Keine aktuellen Nachrichten
view_messageCenter_stackTraceFollows = --- STACK TRACE FOLGT ---
+##view_metric_addToDashboard = Add to Dashboard
view_metric_traits = Traits
view_metric_viewTraitHistory = Werteverlauf für Trait [{0}]
##view_operationCreateWizard_error_scheduleOperationFailure = Failed to schedule
operation execution.
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 cb0c35f..3f1f701 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
@@ -24,6 +24,10 @@
##chart_hover_date_format = %m/%d/%y
##chart_hover_time_format = %I:%M:%S %p
##chart_ie_not_supported = Charting is not available for this browser.
+##chart_metrics= Metrics
+##chart_metrics_collapse_tooltip= Click here to see additional tabular availability
data.
+##chart_metrics_expand_tooltip= Click here to collapse additional availability detail.
+##chart_metrics_sparkline_header= Chart
##chart_no_data_label = No Data
##chart_single_value_label = Value
##chart_slider_button_bar_minute = Min
@@ -1775,6 +1779,7 @@ view_messageCenter_messageTime = 時間
view_messageCenter_messageTitle = メッセージセンター
view_messageCenter_noRecentMessages = 最近のメッセージはありません
view_messageCenter_stackTraceFollows = --- スタックトレース ---
+##view_metric_addToDashboard = Add to Dashboard
view_metric_traits = トレイト
view_metric_viewTraitHistory = トレイト [{0}] のための値の履歴
view_operationHistoryDetails_dateCompleted = 完了日
diff --git
a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties
b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties
index 32dc73d..3d40d83 100644
---
a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties
+++
b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties
@@ -22,6 +22,10 @@
##chart_hover_date_format = %m/%d/%y
##chart_hover_time_format = %I:%M:%S %p
##chart_ie_not_supported = Charting is not available for this browser.
+##chart_metrics= Metrics
+##chart_metrics_collapse_tooltip= Click here to see additional tabular availability
data.
+##chart_metrics_expand_tooltip= Click here to collapse additional availability detail.
+##chart_metrics_sparkline_header= Chart
##chart_no_data_label = No Data
##chart_single_value_label = Value
##chart_slider_button_bar_minute = Min
@@ -1496,6 +1500,7 @@ view_messageCenter_messageTime = 시간
view_messageCenter_messageTitle = 메시지 센터
view_messageCenter_noRecentMessages = 최근 메시지는 없습니다
view_messageCenter_stackTraceFollows = --- 스택 추적 ---
+##view_metric_addToDashboard = Add to Dashboard
view_metric_traits = 특성
view_metric_viewTraitHistory = 특성 [{0}]에 대한 값 기록
view_operationHistoryDetails_dateCompleted = 완료일
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 f4419e1..de43fa4 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
@@ -21,6 +21,10 @@
##chart_hover_date_format = %m/%d/%y
##chart_hover_time_format = %I:%M:%S %p
##chart_ie_not_supported = Charting is not available for this browser.
+##chart_metrics= Metrics
+##chart_metrics_collapse_tooltip= Click here to see additional tabular availability
data.
+##chart_metrics_expand_tooltip= Click here to collapse additional availability detail.
+##chart_metrics_sparkline_header= Chart
##chart_no_data_label = No Data
##chart_single_value_label = Value
##chart_slider_button_bar_minute = Min
@@ -1808,6 +1812,7 @@ view_messageCenter_messageTime = Tempo
view_messageCenter_messageTitle = Centro de Mensagens
view_messageCenter_noRecentMessages = N\u00E3o existem Mensagens Recentes
view_messageCenter_stackTraceFollows = --- STACK TRACE FOLLOWS ---
+##view_metric_addToDashboard = Add to Dashboard
view_metric_traits = Traits
view_metric_viewTraitHistory = Value History for Trait [{0}]
view_operationCreateWizard_button_execute = Execute
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 d75b76e..669d8d6 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
@@ -21,6 +21,10 @@
##chart_hover_date_format = %m/%d/%y
##chart_hover_time_format = %I:%M:%S %p
##chart_ie_not_supported = Charting is not available for this browser.
+##chart_metrics= Metrics
+##chart_metrics_collapse_tooltip= Click here to see additional tabular availability
data.
+##chart_metrics_expand_tooltip= Click here to collapse additional availability detail.
+##chart_metrics_sparkline_header= Chart
##chart_no_data_label = No Data
##chart_single_value_label = Value
##chart_slider_button_bar_minute = Min
@@ -1728,6 +1732,7 @@
#view_messageCenter_messageTitle = Message Center
#view_messageCenter_noRecentMessages = No Recent Messages
#view_messageCenter_stackTraceFollows = --- STACK TRACE FOLLOWS ---
+##view_metric_addToDashboard = Add to Dashboard
#view_metric_traits = Traits
#view_metric_viewTraitHistory = Value History for Trait [{0}]
#view_operationHistoryDetails_dateCompleted = Date Completed
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 a9a24df..b15023f 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
@@ -21,6 +21,10 @@
##chart_hover_date_format = %m/%d/%y
##chart_hover_time_format = %I:%M:%S %p
##chart_ie_not_supported = Charting is not available for this browser.
+##chart_metrics= Metrics
+##chart_metrics_collapse_tooltip= Click here to see additional tabular availability
data.
+##chart_metrics_expand_tooltip= Click here to collapse additional availability detail.
+##chart_metrics_sparkline_header= Chart
##chart_no_data_label = No Data
##chart_single_value_label = Value
##chart_slider_button_bar_minute = Min
@@ -1776,6 +1780,7 @@ view_messageCenter_messageTime = \u65f6\u95f4
view_messageCenter_messageTitle = \u6d88\u606f\u4e2d\u5fc3
view_messageCenter_noRecentMessages = \u65e0\u8fd1\u671f\u6d88\u606f
view_messageCenter_stackTraceFollows = --- \u540e\u9762\u662f\u5f02\u5e38\u4fe1\u606f
---
+##view_metric_addToDashboard = Add to Dashboard
view_metric_traits = \u7279\u5f81
view_metric_viewTraitHistory = Value History for Trait [{0}]
view_operationHistoryDetails_dateCompleted = \u5b8c\u6210\u65e5\u671f
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 40c7ca8..ef65e69 100644
--- a/modules/enterprise/gui/coregui/src/main/webapp/js/rhq.js
+++ b/modules/enterprise/gui/coregui/src/main/webapp/js/rhq.js
@@ -38,9 +38,10 @@ if (!window.console.log) window.console.log = function () {
* @param singleValueLabel
* @param chartXaxisTimeFormatHours
* @param chartXaxisTimeFormatHoursMinutes
+ * @param showLegend
* @constructor
*/
-var ChartContext = function (chartId, chartHeight, metricsData, xAxisLabel, chartTitle,
yAxisUnits, minChartTitle, avgChartTitle, peakChartTitle, dateLabel, timeLabel, downLabel,
unknownLabel, noDataLabel, hoverStartLabel, hoverEndLabel, hoverPeriodLabel,
hoverBarLabel, chartHoverTimeFormat, chartHoverDateFormat, isPortalGraph, portalId,
buttonBarDateTimeFormat, singleValueLabel, chartXaxisTimeFormatHours,
chartXaxisTimeFormatHoursMinutes) {
+var ChartContext = function (chartId, chartHeight, metricsData, xAxisLabel, chartTitle,
yAxisUnits, minChartTitle, avgChartTitle, peakChartTitle, dateLabel, timeLabel, downLabel,
unknownLabel, noDataLabel, hoverStartLabel, hoverEndLabel, hoverPeriodLabel,
hoverBarLabel, chartHoverTimeFormat, chartHoverDateFormat, isPortalGraph, portalId,
buttonBarDateTimeFormat, singleValueLabel, chartXaxisTimeFormatHours,
chartXaxisTimeFormatHoursMinutes, hideLegend) {
"use strict";
if (!(this instanceof ChartContext)) {
throw new Error("ChartContext function cannot be called as a
function.")
@@ -78,6 +79,7 @@ var ChartContext = function (chartId, chartHeight, metricsData,
xAxisLabel, char
this.buttonBarDateTimeFormat = buttonBarDateTimeFormat;
this.chartXaxisTimeFormatHours = chartXaxisTimeFormatHours;
this.chartXaxisTimeFormatHoursMinutes = chartXaxisTimeFormatHoursMinutes;
+ this.hideLegend = hideLegend;
},
/**