modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/dashboard/portlets/resource/ResourceMetricsPortlet.java | 389 +++++-----
modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/resource/detail/DashboardLinkUtility.java | 116 --
modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/resource/detail/ResourceTreeView.java | 4
modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml | 118 +--
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java | 4
5 files changed, 281 insertions(+), 350 deletions(-)
New commits:
commit df44d50f6fbbfd570335a7f40a8b98d9d8152a9a
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Wed Dec 4 20:04:49 2013 +0100
[BZ 1038270] - NPE when accessing the storage node view immediately after the install - NPE check added
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
index 7946411..089719a 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
@@ -848,7 +848,9 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN
try {
Map<Integer, StorageNode> resourceIdToStorageNodeMap = new TreeMap<Integer, StorageNode>();
for (StorageNode storageNode : storageNodes) {
- resourceIdToStorageNodeMap.put(storageNode.getResource().getId(), storageNode);
+ if (storageNode.getResource() != null) { // handling the case before the s.n. autoimport
+ resourceIdToStorageNodeMap.put(storageNode.getResource().getId(), storageNode);
+ }
}
Map<Integer, Integer> storageNodeAlertCounts = new TreeMap<Integer, Integer>();
commit 985cf07bc5835ab816d661008f1f752a355f3d4e
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Wed Dec 4 19:20:10 2013 +0100
[BZ 1038067] - Resource Summary/Activity shows summary of disabled metrics - adding a check that finds out whether the resource has those metrics scheduled. This is done in parallel using the countdown latch pattern.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/dashboard/portlets/resource/ResourceMetricsPortlet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/dashboard/portlets/resource/ResourceMetricsPortlet.java
index ddd70a3..df4e659 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/dashboard/portlets/resource/ResourceMetricsPortlet.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/dashboard/portlets/resource/ResourceMetricsPortlet.java
@@ -21,6 +21,7 @@ package org.rhq.coregui.client.dashboard.portlets.resource;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -41,13 +42,15 @@ import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.common.EntityContext;
+import org.rhq.core.domain.criteria.MeasurementScheduleCriteria;
import org.rhq.core.domain.criteria.ResourceCriteria;
-import org.rhq.core.domain.dashboard.DashboardPortlet;
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.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
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.coregui.client.LinkManager;
import org.rhq.coregui.client.dashboard.Portlet;
@@ -60,6 +63,8 @@ import org.rhq.coregui.client.inventory.resource.detail.monitoring.D3GraphListVi
import org.rhq.coregui.client.inventory.resource.type.ResourceTypeRepository;
import org.rhq.coregui.client.util.BrowserUtility;
import org.rhq.coregui.client.util.Log;
+import org.rhq.coregui.client.util.async.Command;
+import org.rhq.coregui.client.util.async.CountDownLatch;
/**
* This portlet allows the end user to customize the metric display
@@ -72,7 +77,7 @@ public class ResourceMetricsPortlet extends GroupMetricsPortlet {
public static final String KEY = "ResourceMetrics";
// A default displayed, persisted name for the portlet
public static final String NAME = MSG.view_portlet_defaultName_resource_metrics();
-
+
private int resourceId = -1;
private ChartViewWindow window;
@@ -82,6 +87,9 @@ public class ResourceMetricsPortlet extends GroupMetricsPortlet {
super(EntityContext.forResource(-1));
this.resourceId = resourceId;
}
+
+ private volatile List<MeasurementSchedule> enabledSchedules = null;
+ private volatile Resource resource = null;
public static final class Factory implements PortletViewFactory {
public static final PortletViewFactory INSTANCE = new Factory();
@@ -101,12 +109,31 @@ public class ResourceMetricsPortlet extends GroupMetricsPortlet {
* digits.
*/
@Override
- protected void getRecentMetrics() {
- final DashboardPortlet storedPortlet = this.portletWindow.getStoredPortlet();
+ protected void getRecentMetrics() {
+
//display container
final VLayout column = new VLayout();
column.setHeight(10);//pack
column.setWidth100();
+
+ final CountDownLatch latch = CountDownLatch.create(2, new Command() {
+
+ @Override
+ public void execute() {
+ showEnabledMetrics(enabledSchedules == null ? null : getEnabledDefinitions(enabledSchedules), column, resource);
+ }
+
+ private Set<MeasurementDefinition> getEnabledDefinitions(List<MeasurementSchedule> enabledSchedules) {
+ Set<MeasurementDefinition> enabledDefinitions = new HashSet<MeasurementDefinition>(enabledSchedules.size());
+ for (MeasurementSchedule schedule : enabledSchedules) {
+ enabledDefinitions.add(schedule.getDefinition());
+ }
+ return enabledDefinitions;
+ }
+ });
+
+ //fetch only enabled schedules
+ fetchEnabledSchedules(latch);
//locate resource reference
ResourceCriteria criteria = new ResourceCriteria();
@@ -120,13 +147,14 @@ public class ResourceMetricsPortlet extends GroupMetricsPortlet {
Log.debug("Error retrieving resource resource composite for resource [" + resourceId + "]:"
+ caught.getMessage());
setRefreshing(false);
+ latch.countDown();
}
@Override
public void onSuccess(PageList<ResourceComposite> results) {
if (!results.isEmpty()) {
final ResourceComposite resourceComposite = results.get(0);
- final Resource resource = resourceComposite.getResource();
+ resource = resourceComposite.getResource();
// Load the fully fetched ResourceType.
ResourceType resourceType = resource.getResourceType();
ResourceTypeRepository.Cache.getInstance().getResourceTypes(resourceType.getId(),
@@ -134,176 +162,11 @@ public class ResourceMetricsPortlet extends GroupMetricsPortlet {
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, CustomDateRangeState.getInstance().getStartTime(),
- CustomDateRangeState.getInstance().getEndTime(), 60,
- new AsyncCallback<List<List<MeasurementDataNumericHighLowComposite>>>() {
- @Override
- public void onFailure(Throwable caught) {
- Log.debug("Error retrieving recent metrics charting data for resource ["
- + resourceId + "]:" + caught.getMessage());
- setRefreshing(false);
- }
-
- @Override
- public void onSuccess(
- List<List<MeasurementDataNumericHighLowComposite>> results) {
- if (!results.isEmpty()) {
- boolean someChartedData = false;
- //iterate over the retrieved charting data
- for (int index = 0; index < displayOrder.length; index++) {
- //retrieve the correct measurement definition
- final MeasurementDefinition md = measurementDefMap
- .get(displayOrder[index]);
-
- //load the data results for the given metric definition
- List<MeasurementDataNumericHighLowComposite> data = results
- .get(index);
-
- //locate last and minimum values.
- double lastValue = -1;
- double minValue = Double.MAX_VALUE;//
- for (MeasurementDataNumericHighLowComposite d : data) {
- if ((!Double.isNaN(d.getValue()))
- && (!String.valueOf(d.getValue()).contains("NaN"))) {
- if (d.getValue() < minValue) {
- minValue = d.getValue();
- }
- lastValue = d.getValue();
- }
- }
-
- //collapse the data into comma delimited list for consumption by third party javascript library(jquery.sparkline)
- String commaDelimitedList = "";
-
- for (MeasurementDataNumericHighLowComposite d : data) {
- if ((!Double.isNaN(d.getValue()))
- && (!String.valueOf(d.getValue()).contains("NaN"))) {
- commaDelimitedList += d.getValue() + ",";
- }
- }
- DynamicForm row = new DynamicForm();
- row.setNumCols(3);
- row.setColWidths(65, "*", 100);
- row.setWidth100();
- row.setAutoHeight();
- row.setOverflow(Overflow.VISIBLE);
- HTMLFlow sparklineGraph = new HTMLFlow();
- String contents = "<span id='sparkline_" + index
- + "' class='dynamicsparkline' width='0' " + "values='"
- + commaDelimitedList + "'>...</span>";
- sparklineGraph.setContents(contents);
- sparklineGraph.setContentsType(ContentsType.PAGE);
- //disable scrollbars on span
- sparklineGraph.setScrollbarSize(0);
-
- CanvasItem sparklineContainer = new CanvasItem();
- sparklineContainer.setShowTitle(false);
- sparklineContainer.setHeight(16);
- sparklineContainer.setWidth(60);
- sparklineContainer.setCanvas(sparklineGraph);
-
- //Link/title element
- final String title = md.getDisplayName();
- LinkItem link = AbstractActivityView.newLinkItem(title, null);
- link.setTooltip(title);
- link.setTitleVAlign(VerticalAlignment.TOP);
- link.setAlign(Alignment.LEFT);
- link.setClipValue(true);
- link.setWrap(true);
- link.setHeight(26);
- link.setWidth("100%");
- if (!BrowserUtility.isBrowserPreIE9()) {
- link.addClickHandler(new ClickHandler() {
- @Override
- public void onClick(ClickEvent event) {
- window = new ChartViewWindow(title,"", refreshablePortlet);
-
- graphView = D3GraphListView.createSingleGraph(
- resourceComposite.getResource(), md.getId(),
- true);
-
- window.addItem(graphView);
- window.show();
- }
- });
- } else {
- link.disable();
- }
-
- //Value
- String convertedValue;
- convertedValue = AbstractActivityView
- .convertLastValueForDisplay(lastValue, md);
- StaticTextItem value = AbstractActivityView
- .newTextItem(convertedValue);
- value.setVAlign(VerticalAlignment.TOP);
- value.setAlign(Alignment.RIGHT);
-
- row.setItems(sparklineContainer, link, value);
- row.setWidth100();
-
- //if graph content returned
- if ((!md.getName().trim().contains("Trait."))
- && (lastValue != -1)) {
- column.addMember(row);
- someChartedData = true;
- }
- }
- if (!someChartedData) {// when there are results but no chartable entries.
- DynamicForm row = AbstractActivityView.createEmptyDisplayRow(
-
- AbstractActivityView.RECENT_MEASUREMENTS_NONE);
- column.addMember(row);
- } else {
- //insert see more link
- DynamicForm row = new DynamicForm();
- String link = LinkManager
- .getResourceMonitoringGraphsLink(resourceId);
- AbstractActivityView.addSeeMoreLink(row, link, column);
- }
- //call out to 3rd party javascript lib
- new Timer() {
- @Override
- public void run() {
- BrowserUtility.graphSparkLines();
- }
- }.schedule(200);
- } else {
- DynamicForm row = AbstractActivityView
- .createEmptyDisplayRow(AbstractActivityView.RECENT_MEASUREMENTS_NONE);
- column.addMember(row);
- }
- setRefreshing(false);
- }
- }
-
- );
-
+ latch.countDown();
}
});
+ } else {
+ latch.countDown();
}
}
});
@@ -315,4 +178,184 @@ public class ResourceMetricsPortlet extends GroupMetricsPortlet {
recentMeasurementsContent.addChild(column);
recentMeasurementsContent.markForRedraw();
}
+
+ private void fetchEnabledSchedules(final CountDownLatch latch) {
+ MeasurementScheduleCriteria criteria = new MeasurementScheduleCriteria();
+ criteria.addFilterResourceId(resourceId);
+ criteria.addFilterEnabled(true);
+ criteria.fetchDefinition(true);
+ criteria.setPageControl(PageControl.getUnlimitedInstance());
+ GWTServiceLookup.getMeasurementDataService().findMeasurementSchedulesByCriteria(criteria, new AsyncCallback<PageList<MeasurementSchedule>>() {
+
+ @Override
+ public void onSuccess(PageList<MeasurementSchedule> result) {
+ enabledSchedules = result;
+ latch.countDown();
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ latch.countDown();
+ }
+ });
+ }
+
+
+ private void showEnabledMetrics(final Set<MeasurementDefinition> definitions, final VLayout layout, final Resource resource) {
+ if (resource == null || definitions == null) {
+ Log.warn("Unable to render recent metrics properly.");
+ return;
+ }
+
+ //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 async 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,
+ CustomDateRangeState.getInstance().getStartTime(), CustomDateRangeState.getInstance().getEndTime(), 60,
+ new AsyncCallback<List<List<MeasurementDataNumericHighLowComposite>>>() {
+ @Override
+ public void onFailure(Throwable caught) {
+ Log.debug("Error retrieving recent metrics charting data for resource [" + resourceId + "]:"
+ + caught.getMessage());
+ setRefreshing(false);
+ }
+
+ @Override
+ public void onSuccess(List<List<MeasurementDataNumericHighLowComposite>> results) {
+ if (!results.isEmpty()) {
+ boolean someChartedData = false;
+ //iterate over the retrieved charting data
+ for (int index = 0; index < displayOrder.length; index++) {
+ //retrieve the correct measurement definition
+ final MeasurementDefinition md = measurementDefMap.get(displayOrder[index]);
+
+ //load the data results for the given metric definition
+ List<MeasurementDataNumericHighLowComposite> data = results.get(index);
+
+ //locate last and minimum values.
+ double lastValue = -1;
+ double minValue = Double.MAX_VALUE;//
+ for (MeasurementDataNumericHighLowComposite d : data) {
+ if ((!Double.isNaN(d.getValue())) && (!String.valueOf(d.getValue()).contains("NaN"))) {
+ if (d.getValue() < minValue) {
+ minValue = d.getValue();
+ }
+ lastValue = d.getValue();
+ }
+ }
+
+ //collapse the data into comma delimited list for consumption by third party javascript library(jquery.sparkline)
+ String commaDelimitedList = "";
+
+ for (MeasurementDataNumericHighLowComposite d : data) {
+ if ((!Double.isNaN(d.getValue())) && (!String.valueOf(d.getValue()).contains("NaN"))) {
+ commaDelimitedList += d.getValue() + ",";
+ }
+ }
+ DynamicForm row = new DynamicForm();
+ row.setNumCols(3);
+ row.setColWidths(65, "*", 100);
+ row.setWidth100();
+ row.setAutoHeight();
+ row.setOverflow(Overflow.VISIBLE);
+ HTMLFlow sparklineGraph = new HTMLFlow();
+ String contents = "<span id='sparkline_" + index + "' class='dynamicsparkline' width='0' "
+ + "values='" + commaDelimitedList + "'>...</span>";
+ sparklineGraph.setContents(contents);
+ sparklineGraph.setContentsType(ContentsType.PAGE);
+ //disable scrollbars on span
+ sparklineGraph.setScrollbarSize(0);
+
+ CanvasItem sparklineContainer = new CanvasItem();
+ sparklineContainer.setShowTitle(false);
+ sparklineContainer.setHeight(16);
+ sparklineContainer.setWidth(60);
+ sparklineContainer.setCanvas(sparklineGraph);
+
+ //Link/title element
+ final String title = md.getDisplayName();
+ LinkItem link = AbstractActivityView.newLinkItem(title, null);
+ link.setTooltip(title);
+ link.setTitleVAlign(VerticalAlignment.TOP);
+ link.setAlign(Alignment.LEFT);
+ link.setClipValue(true);
+ link.setWrap(true);
+ link.setHeight(26);
+ link.setWidth("100%");
+ if (!BrowserUtility.isBrowserPreIE9()) {
+ link.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(ClickEvent event) {
+ window = new ChartViewWindow(title, "", refreshablePortlet);
+
+ graphView = D3GraphListView.createSingleGraph(resource, md.getId(), true);
+
+ window.addItem(graphView);
+ window.show();
+ }
+ });
+ } else {
+ link.disable();
+ }
+
+ //Value
+ String convertedValue;
+ convertedValue = AbstractActivityView.convertLastValueForDisplay(lastValue, md);
+ StaticTextItem value = AbstractActivityView.newTextItem(convertedValue);
+ value.setVAlign(VerticalAlignment.TOP);
+ value.setAlign(Alignment.RIGHT);
+
+ row.setItems(sparklineContainer, link, value);
+ row.setWidth100();
+
+ //if graph content returned
+ if ((!md.getName().trim().contains("Trait.")) && (lastValue != -1)) {
+ layout.addMember(row);
+ someChartedData = true;
+ }
+ }
+ if (!someChartedData) {// when there are results but no chartable entries.
+ DynamicForm row = AbstractActivityView.createEmptyDisplayRow(
+
+ AbstractActivityView.RECENT_MEASUREMENTS_NONE);
+ layout.addMember(row);
+ } else {
+ //insert see more link
+ DynamicForm row = new DynamicForm();
+ String link = LinkManager.getResourceMonitoringGraphsLink(resourceId);
+ AbstractActivityView.addSeeMoreLink(row, link, layout);
+ }
+ //call out to 3rd party javascript lib
+ new Timer() {
+ @Override
+ public void run() {
+ BrowserUtility.graphSparkLines();
+ }
+ }.schedule(200);
+ } else {
+ DynamicForm row = AbstractActivityView
+ .createEmptyDisplayRow(AbstractActivityView.RECENT_MEASUREMENTS_NONE);
+ layout.addMember(row);
+ }
+ setRefreshing(false);
+ }
+ }
+
+ );
+ }
}
commit 7355462e593ce38a8a7b88e3a0e68b4f9da2a561
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Wed Dec 4 19:17:46 2013 +0100
[BZ 1035501] - Remove Add Graph to Monitor View Menu Item in Resource Tree - Removing the option leading to the old portal war page from the context menu.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/resource/detail/DashboardLinkUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/resource/detail/DashboardLinkUtility.java
index 1f6cc4e..c58e665 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/resource/detail/DashboardLinkUtility.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/resource/detail/DashboardLinkUtility.java
@@ -22,39 +22,26 @@ 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.coregui.client.CoreGUI;
import org.rhq.coregui.client.Messages;
-import org.rhq.coregui.client.UserSessionManager;
import org.rhq.coregui.client.dashboard.portlets.inventory.resource.graph.ResourceD3GraphPortlet;
import org.rhq.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.coregui.client.util.Log;
import org.rhq.coregui.client.util.message.Message;
-import org.rhq.coregui.client.util.preferences.MeasurementUserPreferences;
-import org.rhq.coregui.client.util.preferences.UserPreferences;
/**
* Utility Class to build menus for linking to the Dashboard.
@@ -144,57 +131,6 @@ public class DashboardLinkUtility {
});
}
-
- //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_graphToView());
- 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);
- }
- });
- }
- }
- });
- }
}
}
@@ -203,56 +139,4 @@ public class DashboardLinkUtility {
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 = "/portal/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/coregui/client/inventory/resource/detail/ResourceTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/resource/detail/ResourceTreeView.java
index 6277a34..c2e4784 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/resource/detail/ResourceTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/coregui/client/inventory/resource/detail/ResourceTreeView.java
@@ -559,10 +559,6 @@ public class ResourceTreeView extends EnhancedVLayout {
}
resourceContextMenu.addItem(operations);
- // Metric graph addition menu
- 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);
final Set<ResourceType> importableChildTypes = getImportableChildTypes(resourceType);
commit cce8d75b28e55793ba222a10a6cd2b80d207191d
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Wed Dec 4 19:01:33 2013 +0100
[BZ 1036681] - Starting page listening on :7080 freezes if the server turns off itself during installation - adding logic that handles the case if the server went down during the installation (or normal startup process). Also externalizing the JavaScript to its own file and linking it to the HTML page.
diff --git a/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml b/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml
index 585ce10..8b257ba 100644
--- a/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml
+++ b/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml
@@ -456,62 +456,68 @@
<target name="prepare-welcome-content">
<echo>Changing the default welcome content</echo>
<!-- Simple redirect script written in EcmaScript checking if the server has fully started -->
- <replaceregexp file="${jboss.home}/welcome-content/index.html" flags="gis" match='<body>' replace='
- <body>

- <script type="text/JavaScript">

- <!--

- function httpGet() {

- var url = "/portal/sessionAccess";

- var xmlHttp = null;

- xmlHttp = new XMLHttpRequest();

- xmlHttp.open("GET", url, false);

- xmlHttp.send(null);

- return xmlHttp;

- }

- function showError(msg) {

- var elError = document.getElementById("error");

- if (elError != null) {

- if (msg) {

- elError.innerHTML = "Following subsystems had problem to start: <b>" + msg + "</b>";

- if (msg.indexOf("storage") != -1) elError.innerHTML += "<br /><i>NOTE: Start at least one storage node as soon as possible.</i>"

- elError.setAttribute("style", elError.getAttribute("style").replace(/display:.*/gi, "display: visible;"));

- } else elError.setAttribute("style", elError.getAttribute("style").replace(/display:.*/gi, "display: none;"));

- }

- }

- function checkIfRunning(attemptNum) {

- var response = httpGet();

- if (response.status === 200) {

- var json = JSON.parse(response.responseText);

- if (json.serverInitialized) {

- location.href = "/coregui";

- } else {

- showError(json.startupError);

- }

- }

- var elProgress = document.getElementById("progress");

- if (elProgress != null) {

- elProgress.innerHTML = elProgress.innerHTML.trim() + "." + (attemptNum % 180 == 0 ? "<br />" : "") ;

- }

- setTimeout("checkIfRunning(" + (attemptNum + 1) + ");", 3000);

- }

- checkIfRunning(16);

- -->

- </script>


- <noscript>

- <h1>Your browser does not support JavaScript!</h1>

- <h2>Please turn it on or use a different browser.</h2>

- <h2>You will NOT be automatically redirected...</h2>

- </noscript>
'/>
-
- <!-- Changing the default content of the welcome page -->
- <replaceregexp file="${jboss.home}/welcome-content/index.html" flags="gis" match='<div class="section">(.*?)</div>' replace='
- <div class="section">

- <h1>Server Initialization</h1>

- <h3>Your server is starting, please wait.</h3>

- <p class="WarnBlock" id="error" style="background-color: #DE7272; display: none;"></p>

- <p class="WarnBlock" id="progress">Starting ..</p>

- <sub>You will be automatically redirected once the server is up and running. If this takes more than 10 minutes, please check the server log for possible issues.</sub>

- </div>'/>
+ <echo file="${jboss.home}/welcome-content/backend-checker.js"><![CDATA[function httpGet() {
+ var url = "/portal/sessionAccess";
+ var xmlHttp = null;
+ xmlHttp = new XMLHttpRequest();
+ xmlHttp.open("GET", url, false);
+ xmlHttp.send(null);
+ return xmlHttp;
+}
+
+function showError(msg) {
+ var elError = document.getElementById("error");
+ if (elError) {
+ if (msg) {
+ elError.innerHTML = "Following subsystems had problem to start: <b>" + msg + "</b>";
+ if (msg.indexOf("storage") != -1) {
+ elError.innerHTML += "<br /><i>NOTE: Start at least one storage node as soon as possible.</i>"
+ }
+ elError.setAttribute("style", elError.getAttribute("style").replace(/display:.*/gi, "display: visible;"));
+ } else elError.setAttribute("style", elError.getAttribute("style").replace(/display:.*/gi, "display: none;"));
+ }
+}
+
+function checkIfRunning(attemptNum) {
+ try {
+ var response = httpGet();
+ } catch (error) {
+ showError(error.message + " Is the server running?");
+ }
+ if (response && response.status === 200) {
+ var json = JSON.parse(response.responseText);
+ if (json.serverInitialized) {
+ location.href = "/coregui";
+ } else showError(json.startupError);
+ }
+ var elProgress = document.getElementById("progress");
+ if (elProgress) {
+ elProgress.innerHTML = elProgress.innerHTML.trim() + "." + (attemptNum % 180 == 0 ? "<br />" : "") ;
+ }
+ setTimeout("checkIfRunning(" + (attemptNum + 1) + ");", 3000);
+}
+
+checkIfRunning(16);]]>
+</echo>
+
+ <!-- Adding the script and noscript elements to the welcome webpage -->
+ <replaceregexp file="${jboss.home}/welcome-content/index.html" flags="gis" match='<body>' replace='<body>

+ <script src="backend-checker.js">
+ </script>

+ <noscript>

+ <h1>Your browser does not support JavaScript!</h1>

+ <h2>Please turn it on or use a different browser.</h2>

+ <h2>You will NOT be automatically redirected...</h2>

+ </noscript>
'/>
+
+ <!-- Changing the default content of the welcome page to support our indications -->
+ <replaceregexp file="${jboss.home}/welcome-content/index.html" flags="gis" match='<div class="section">(.*?)</div>' replace='<div class="section">

+ <h1>Server Initialization</h1>

+ <h3>Your server is starting, please wait.</h3>

+ <p class="WarnBlock" id="error" style="background-color: #DE7272; display: none;"></p>

+ <p class="WarnBlock" id="progress">Starting ..</p>

+ <sub>You will be automatically redirected once the server is up and running. If this takes more than 10 minutes, please check the server log for possible issues.</sub>

+ </div>'/>
</target>
<target name="package-connectors">