modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ImageManager.java | 50 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 11 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ActivityView2.java | 618 ++++++++++ modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/GwtRelativeDurationConverter.java | 99 + modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ContentGWTServiceImpl.java | 12 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/EventGWTServiceImpl.java | 9 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 13 7 files changed, 810 insertions(+), 2 deletions(-)
New commits: commit c68e0e42d9b2bdb075372e87e1b62f5e1fbcc000 Author: Simeon Pinder spinder@redhat.com Date: Mon Dec 20 21:04:46 2010 -0500
initial commit of resource/activity. There are several jsf pieces that are non-trivial to replace. Will keep both iframe and gwt versions until more functionality can be moved.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ImageManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ImageManager.java index 576af53..7b79f88 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ImageManager.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ImageManager.java @@ -2,6 +2,7 @@ package org.rhq.enterprise.gui.coregui.client;
import org.rhq.core.domain.alert.AlertPriority; import org.rhq.core.domain.configuration.ConfigurationUpdateStatus; +import org.rhq.core.domain.event.EventSeverity; import org.rhq.core.domain.measurement.AvailabilityType; import org.rhq.core.domain.measurement.ResourceAvailability; import org.rhq.core.domain.operation.OperationRequestStatus; @@ -364,4 +365,53 @@ public class ImageManager { public static String getLockedIcon() { return "global/Locked_16.png"; } + + /** + * Returns the configuration update status icon. If status is null, returns + * the plain, unbadged, configuration icon. + */ + public static String getConfigurationUpdateResultsIcon(ConfigurationUpdateStatus status) { + String icon = ""; + if (status != null) { + switch (status) { + case INPROGRESS: + icon = "_inprogress"; + break; + case SUCCESS: + icon = "_ok"; + break; + case FAILURE: + icon = "_failed"; + break; + } + } + + return "subsystems/configure/Configure" + icon + "_16.png"; + + } + + public static String getEventSeverityIcon(EventSeverity severity) { + String icon = ""; + if (severity != null) { + switch (severity) { + case DEBUG: + icon = "_debug"; + break; + case INFO: + icon = "_info"; + break; + case WARN: + icon = "_warning"; + break; + case ERROR: + icon = "_info"; + break; + case FATAL: + icon = "_fatal"; + break; + } + } + + return "subsystems/event/Events" + icon + "_16.png"; + } } 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 ffc4ca5..0c61ed0 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 @@ -63,6 +63,7 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitorin 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; import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.summary.ActivityView; +import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.summary.ActivityView2; import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository; import org.rhq.enterprise.gui.coregui.client.util.message.Message;
@@ -92,6 +93,7 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo private TwoLevelTab contentTab;
private SubTab summaryActivity; + private SubTab summaryActivity2; private SubTab summaryTimeline; private SubTab monitorGraphs; private SubTab monitorTables; @@ -129,9 +131,12 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo .view_tabs_common_summary()), ImageManager.getResourceIcon(ResourceCategory.SERVICE, Boolean.TRUE)); summaryActivity = new SubTab(summaryTab.extendLocatorId("Activity"), new ViewName("Activity", MSG .view_tabs_common_activity()), null); + summaryActivity2 = new SubTab(summaryTab.extendLocatorId("Activity2"), new ViewName("Activity2", MSG + .view_tabs_common_activity() + 2), null); summaryTimeline = new SubTab(summaryTab.extendLocatorId("Timeline"), new ViewName("Timeline", MSG .view_tabs_common_timeline()), null); - summaryTab.registerSubTabs(summaryActivity, summaryTimeline); + // summaryTab.registerSubTabs(summaryActivity, summaryTimeline); + summaryTab.registerSubTabs(summaryActivity, summaryActivity2, summaryTimeline); tabs.add(summaryTab);
inventoryTab = new TwoLevelTab(getTabSet().extendLocatorId("Inventory"), new ViewName("Inventory", MSG @@ -255,6 +260,8 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo private void updateSummaryTabContent(Resource resource) { updateSubTab(this.summaryTab, this.summaryActivity, new ActivityView(this.summaryActivity .extendLocatorId("View"), this.resourceComposite), true, true); + updateSubTab(this.summaryTab, this.summaryActivity2, new ActivityView2(this.summaryActivity2 + .extendLocatorId("View"), this.resourceComposite), true, true);
updateSubTab(this.summaryTab, this.summaryTimeline, new FullHTMLPane(this.summaryTimeline .extendLocatorId("View"), "/rhq/resource/summary/timeline-plain.xhtml?id=" + resource.getId()), true, true); @@ -347,7 +354,7 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo updateSubTab(this.operationsTab, this.operationsHistory, new ResourceOperationHistoryListView(operationsTab .extendLocatorId("HistoryView"), this.resourceComposite), true, true);
- updateSubTab(this.operationsTab, this.operationsSchedule,new ResourceOperationScheduleListView( + updateSubTab(this.operationsTab, this.operationsSchedule, new ResourceOperationScheduleListView( operationsTab.extendLocatorId("SchedulesView"), this.resourceComposite), true, true); } } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ActivityView2.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ActivityView2.java new file mode 100644 index 0000000..8907f16 --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ActivityView2.java @@ -0,0 +1,618 @@ +/* + * RHQ Management Platform + * Copyright (C) 2005-2010 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.summary; + +import java.util.Date; +import java.util.List; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.HTMLFlow; +import com.smartgwt.client.widgets.Img; +import com.smartgwt.client.widgets.form.fields.FormItemIcon; +import com.smartgwt.client.widgets.form.fields.LinkItem; +import com.smartgwt.client.widgets.form.fields.StaticTextItem; + +import org.rhq.core.domain.alert.Alert; +import org.rhq.core.domain.configuration.ResourceConfigurationUpdate; +import org.rhq.core.domain.criteria.AlertCriteria; +import org.rhq.core.domain.criteria.EventCriteria; +import org.rhq.core.domain.criteria.InstalledPackageCriteria; +import org.rhq.core.domain.criteria.ResourceConfigurationUpdateCriteria; +import org.rhq.core.domain.measurement.composite.MeasurementOOBComposite; +import org.rhq.core.domain.operation.composite.ResourceOperationLastCompletedComposite; +import org.rhq.core.domain.resource.composite.DisambiguationReport; +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.enterprise.gui.coregui.client.ImageManager; +import org.rhq.enterprise.gui.coregui.client.RefreshableView; +import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; +import org.rhq.enterprise.gui.coregui.client.resource.disambiguation.ReportDecorator; +import org.rhq.enterprise.gui.coregui.client.util.selenium.Locatable; +import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableCanvas; +import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm; +import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout; +import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout; + +/** + * The content pane of the Resource Summary>Activity tab. + * + * @author Simeon Pinder + */ +public class ActivityView2 extends LocatableHLayout implements RefreshableView { + private LocatableVLayout leftPane; + private LocatableVLayout rightPane; + private LocatableCanvas recentMeasurementsContent = new LocatableCanvas(extendLocatorId("RecentMetricsContent")); + private LocatableCanvas recentAlertsContent = new LocatableCanvas(extendLocatorId("RecentAlertsContent")); + private LocatableCanvas recentOobContent = new LocatableCanvas(extendLocatorId("RecentOobsContent")); + private LocatableCanvas recentConfigurationContent = new LocatableCanvas(extendLocatorId("RecentConfigContent")); + private LocatableCanvas recentOperationsContent = new LocatableCanvas(extendLocatorId("RecentOperationsContent")); + private LocatableCanvas recentEventsContent = new LocatableCanvas(extendLocatorId("RecentEventsContent")); + private LocatableCanvas recentPkgHistoryContent = new LocatableCanvas(extendLocatorId("RecentPkgHistoryContent")); + private String RECENT_MEASUREMENTS = MSG.common_title_recent_measurements(); + private String RECENT_MEASUREMENTS_NONE = MSG.view_resource_inventory_activity_no_recent_metrics(); + private String RECENT_ALERTS = MSG.common_title_recent_alerts(); + private String RECENT_ALERTS_NONE = MSG.view_resource_inventory_activity_no_recent_alerts(); + private String RECENT_OOB = MSG.common_title_recent_oob_metrics(); + private String RECENT_OOB_NONE = MSG.view_resource_inventory_activity_no_recent_oob(); + private String RECENT_CONFIGURATIONS = MSG.common_title_recent_configuration_updates(); + private String RECENT_CONFIGURATIONS_NONE = MSG.view_resource_inventory_activity_no_recent_config_history(); + private String RECENT_OPERATIONS = MSG.common_title_recent_operations(); + private String RECENT_OPERATIONS_NONE = MSG.view_resource_inventory_activity_no_recent_operations(); + private String RECENT_EVENTS = MSG.common_title_recent_event_counts(); + private String RECENT_EVENTS_NONE = MSG.view_resource_inventory_activity_no_recent_events(); + private String RECENT_PKG_HISTORY = MSG.common_title_recent_pkg_history(); + private String RECENT_PKG_HISTORY_NONE = MSG.view_resource_inventory_activity_no_recent_pkg_history(); + + private ResourceComposite resourceComposite; + + public ActivityView2(String locatorId, ResourceComposite resourceComposite) { + super(locatorId); + this.resourceComposite = resourceComposite; + initializeUi(); + } + + private void initializeUi() { + setPadding(5); + setMembersMargin(5); + //dividers definition + HTMLFlow divider1 = new HTMLFlow("<hr/>"); + HTMLFlow divider2 = new HTMLFlow("<hr/>"); + HTMLFlow divider3 = new HTMLFlow("<hr/>"); + HTMLFlow divider4 = new HTMLFlow("<hr/>"); + HTMLFlow divider5 = new HTMLFlow("<hr/>"); + divider1.setWidth("50%"); + divider2.setWidth("50%"); + divider3.setWidth("50%"); + divider4.setWidth("50%"); + divider5.setWidth("50%"); + + //leftPane + leftPane = new LocatableVLayout(extendLocatorId("Left")); + leftPane.setWidth("50%"); + leftPane.setPadding(5); + leftPane.setMembersMargin(5); + leftPane.setAutoHeight(); + //recentMetrics.xhtml + LocatableHLayout recentMetricsTitle = new TitleWithIcon(leftPane, "RecentMetrics", + "subsystems/monitor/Monitor_24.png", RECENT_MEASUREMENTS); + leftPane.addMember(recentMetricsTitle); + leftPane.addMember(recentMeasurementsContent); + recentMeasurementsContent.setHeight(20); + recentMeasurementsContent.setContents(RECENT_MEASUREMENTS_NONE); + leftPane.addMember(divider1); + //recentAlerts.xhtml + LocatableHLayout recentAlertsTitle = new TitleWithIcon(leftPane, "RecentAlerts", + "subsystems/alert/Flag_blue_24.png", RECENT_ALERTS); + leftPane.addMember(recentAlertsTitle); + leftPane.addMember(recentAlertsContent); + recentAlertsContent.setHeight(20); + // recentAlertsContent.setContents(RECENT_ALERTS_NONE); + leftPane.addMember(divider2); + //recentOOBs.xhtml + LocatableHLayout recentOobsTitle = new TitleWithIcon(leftPane, "RecentOobs", + "subsystems/monitor/Monitor_failed_24.png", RECENT_OOB); + leftPane.addMember(recentOobsTitle); + leftPane.addMember(recentOobContent); + recentOobContent.setHeight(20); + recentOobContent.setContents(RECENT_OOB_NONE); + + //rightPane + rightPane = new LocatableVLayout(extendLocatorId("Right")); + rightPane.setWidth("50%"); + rightPane.setPadding(5); + rightPane.setMembersMargin(5); + rightPane.setAutoHeight(); + //recentConfigUpdates.xhtml + LocatableHLayout recentConfigUpdatesTitle = new TitleWithIcon(leftPane, "RecentConfigUpdates", + "subsystems/configure/Configure_24.png", RECENT_CONFIGURATIONS); + rightPane.addMember(recentConfigUpdatesTitle); + rightPane.addMember(recentConfigurationContent); + recentConfigurationContent.setHeight(20); + // recentConfigurationContent.setContents(RECENT_CONFIGURATIONS_NONE); + rightPane.addMember(divider3); + //recentOperations.xhtml + LocatableHLayout recentOperationsTitle = new TitleWithIcon(leftPane, "RecentOperations", + "subsystems/control/Operation_24.png", RECENT_OPERATIONS); + rightPane.addMember(recentOperationsTitle); + rightPane.addMember(recentOperationsContent); + recentOperationsContent.setHeight(20); + // recentOperationsContent.setContents(RECENT_OPERATIONS_NONE); + rightPane.addMember(divider4); + //recentEventCounts.xhtml + LocatableHLayout recentEventsTitle = new TitleWithIcon(leftPane, "RecentEvent", + "subsystems/event/Events_24.png", RECENT_EVENTS); + rightPane.addMember(recentEventsTitle); + rightPane.addMember(recentEventsContent); + recentEventsContent.setHeight(20); + recentEventsContent.setContents(RECENT_EVENTS_NONE); + rightPane.addMember(divider5); + //recentPackageHistory.xhtml + LocatableHLayout recentPkgHistoryTitle = new TitleWithIcon(leftPane, "RecentPkgHistory", + "subsystems/content/Content_24.png", RECENT_PKG_HISTORY); + rightPane.addMember(recentPkgHistoryTitle); + rightPane.addMember(recentPkgHistoryContent); + recentPkgHistoryContent.setHeight(20); + recentPkgHistoryContent.setContents(RECENT_PKG_HISTORY_NONE); + loadData(); + } + + private void loadData() { + getRecentAlerts(); + getRecentOperations(); + getRecentConfigurationUpdates(); + getRecentEventUpdates(); + getRecentOobs(); + getRecentPkgHistory(); + } + + @Override + protected void onDraw() { + super.onDraw(); + + addMember(leftPane); + addMember(rightPane); + refresh(); + } + + @Override + public void refresh() { + // int resourceId = this.resourceComposite.getResource().getId(); + // this.iFrame.setContentsURL("/rhq/resource/summary/overview-plain.xhtml?id=" + resourceId); + loadData(); + markForRedraw(); + } + + class TitleWithIcon extends LocatableHLayout { + public TitleWithIcon(String locatorId) { + super(locatorId); + } + + public TitleWithIcon(Locatable parentContainer, String locatorIdentifier, String imageUrl, String title) { + super(parentContainer.extendLocatorId(locatorIdentifier)); + Img titleImage = new Img(imageUrl, 24, 24); + HTMLFlow titleElement = new HTMLFlow(); + titleElement.setWidth("*"); + titleElement.setContents(title); + titleElement.setStyleName("HeaderLabel"); + addMember(titleImage); + addMember(titleElement); + setMembersMargin(10); + } + } + + private void getRecentAlerts() { + final int resourceId = this.resourceComposite.getResource().getId(); + AlertCriteria criteria = new AlertCriteria(); + criteria.addFilterResourceIds(resourceId); + PageControl pageControl = new PageControl(0, 5); + criteria.setPageControl(pageControl); + GWTServiceLookup.getAlertService().findAlertsByCriteria(criteria, new AsyncCallback<PageList<Alert>>() { + @Override + public void onSuccess(PageList<Alert> result) { + LocatableVLayout column = new LocatableVLayout(recentAlertsContent.extendLocatorId("Content")); + column.setHeight(10); + if (!result.isEmpty()) { + for (Alert alert : result) { + LocatableDynamicForm row = new LocatableDynamicForm(recentAlertsContent + .extendLocatorId("ContentForm")); + row.setNumCols(3); + + StaticTextItem iconItem = new StaticTextItem(); + FormItemIcon img = new FormItemIcon(); + img.setSrc(ImageManager.getAlertIcon(alert.getAlertDefinition().getPriority())); + img.setWidth(16); + img.setHeight(16); + iconItem.setIcons(img); + iconItem.setShowTitle(false); + + LinkItem link = new LinkItem(); + link.setLinkTitle(alert.getAlertDefinition().getName()); + link.setTitle(alert.getAlertDefinition().getName()); + link.setValue(ReportDecorator.GWT_RESOURCE_URL + resourceId + "/Alerts/Definitions/" + + alert.getAlertDefinition().getId()); + link.setTarget("_self"); + link.setShowTitle(false); + + StaticTextItem time = new StaticTextItem(); + time.setDefaultValue(new Date(alert.getAlertDefinition().getCtime()).toString()); + time.setShowTitle(false); + time.setShowPickerIcon(false); + time.setWrap(false); + row.setItems(iconItem, link, time); + + column.addMember(row); + } + } else { + column.setContents(RECENT_ALERTS_NONE); + } + recentAlertsContent.setContents(""); + for (Canvas child : recentAlertsContent.getChildren()) { + child.destroy(); + } + recentAlertsContent.addChild(column); + recentAlertsContent.markForRedraw(); + } + + @Override + public void onFailure(Throwable caught) { + Log.debug("Error retrieving recent alerts for resource [" + resourceId + "]:" + caught.getMessage()); + } + }); + } + + private void getRecentOperations() { + final int resourceId = this.resourceComposite.getResource().getId(); + GWTServiceLookup.getOperationService().findRecentCompletedOperations(5, + new AsyncCallback<List<DisambiguationReport<ResourceOperationLastCompletedComposite>>>() { + + @Override + public void onFailure(Throwable caught) { + Log.debug("Error retrieving recent operations for resource [" + resourceId + "]:" + + caught.getMessage()); + } + + @Override + public void onSuccess(List<DisambiguationReport<ResourceOperationLastCompletedComposite>> result) { + LocatableVLayout column = new LocatableVLayout(recentOperationsContent.extendLocatorId("Content")); + column.setHeight(10); + if (!result.isEmpty()) { + for (DisambiguationReport<ResourceOperationLastCompletedComposite> report : result) { + LocatableDynamicForm row = new LocatableDynamicForm(recentOperationsContent + .extendLocatorId("ContentForm")); + row.setNumCols(3); + + StaticTextItem iconItem = new StaticTextItem(); + FormItemIcon img = new FormItemIcon(); + img.setSrc(ImageManager.getOperationResultsIcon(report.getOriginal().getOperationStatus())); + img.setWidth(16); + img.setHeight(16); + iconItem.setIcons(img); + iconItem.setShowTitle(false); + + LinkItem link = new LinkItem(); + link.setLinkTitle(report.getOriginal().getOperationName()); + link.setTitle(report.getOriginal().getOperationName()); + link.setValue(ReportDecorator.GWT_RESOURCE_URL + resourceId + "/Operations/History/" + + report.getOriginal().getOperationHistoryId()); + link.setTarget("_self"); + link.setShowTitle(false); + + StaticTextItem time = new StaticTextItem(); + time.setDefaultValue(new Date(report.getOriginal().getOperationStartTime()).toString()); + time.setShowTitle(false); + time.setShowPickerIcon(false); + time.setWrap(false); + row.setItems(iconItem, link, time); + + column.addMember(row); + } + } else { + column.setContents(RECENT_OPERATIONS_NONE); + } + for (Canvas child : recentOperationsContent.getChildren()) { + child.destroy(); + } + recentOperationsContent.addChild(column); + recentOperationsContent.markForRedraw(); + } + }); + } + + private void getRecentConfigurationUpdates() { + final int resourceId = this.resourceComposite.getResource().getId(); + ResourceConfigurationUpdateCriteria criteria = new ResourceConfigurationUpdateCriteria(); + criteria.addFilterResourceIds(resourceId); + PageControl pageControl = new PageControl(0, 5); + criteria.setPageControl(pageControl); + GWTServiceLookup.getConfigurationService().findResourceConfigurationUpdatesByCriteria(criteria, + new AsyncCallback<PageList<ResourceConfigurationUpdate>>() { + + @Override + public void onFailure(Throwable caught) { + Log.debug("Error retrieving recent configuration updates for resource [" + resourceId + "]:" + + caught.getMessage()); + } + + @Override + public void onSuccess(PageList<ResourceConfigurationUpdate> result) { + LocatableVLayout column = new LocatableVLayout(recentOperationsContent.extendLocatorId("Content")); + column.setHeight(10); + if (!result.isEmpty()) { + for (ResourceConfigurationUpdate update : result) { + LocatableDynamicForm row = new LocatableDynamicForm(recentConfigurationContent + .extendLocatorId("ContentForm")); + row.setNumCols(3); + + StaticTextItem iconItem = new StaticTextItem(); + FormItemIcon img = new FormItemIcon(); + img.setSrc(ImageManager.getConfigurationUpdateResultsIcon(update.getStatus())); + img.setWidth(16); + img.setHeight(16); + iconItem.setIcons(img); + iconItem.setShowTitle(false); + + LinkItem link = new LinkItem(); + link.setLinkTitle(MSG.view_resource_inventory_activity_changed_by() + + update.getSubjectName()); + link.setTitle(MSG.view_resource_inventory_activity_changed_by() + update.getSubjectName()); + link.setValue(ReportDecorator.GWT_RESOURCE_URL + resourceId + "/Configuration/History/" + + update.getId()); + link.setTarget("_self"); + link.setShowTitle(false); + + StaticTextItem time = new StaticTextItem(); + time.setDefaultValue(new Date(update.getCreatedTime()).toString()); + time.setShowTitle(false); + time.setShowPickerIcon(false); + time.setWrap(false); + row.setItems(iconItem, link, time); + + column.addMember(row); + } + } else { + LocatableDynamicForm row = new LocatableDynamicForm(recentConfigurationContent + .extendLocatorId("ContentForm")); + row.setNumCols(3); + StaticTextItem none = new StaticTextItem(); + none.setShowTitle(false); + none.setDefaultValue(RECENT_CONFIGURATIONS_NONE); + none.setWrap(false); + row.setItems(none); + column.addMember(row); + } + //cleanup + for (Canvas child : recentConfigurationContent.getChildren()) { + child.destroy(); + } + recentConfigurationContent.addChild(column); + recentConfigurationContent.markForRedraw(); + } + }); + } + + private void getRecentEventUpdates() { + final int resourceId = this.resourceComposite.getResource().getId(); + EventCriteria criteria = new EventCriteria(); + // criteria.addFilterResourceIds(resourceId); + long now = System.currentTimeMillis(); + long nowMinus24Hours = now - (24 * 60 * 60 * 1000); + + criteria.addFilterResourceId(resourceId); + PageControl pageControl = PageControl.getUnlimitedInstance(); + criteria.setPageControl(pageControl); + //Error retrieving recent event counts for resource [" + resourceId + "]:" + // GWTServiceLookup.getEventService().getEventCountsBySeverity(resourceId, nowMinus24Hours, now, + // new AsyncCallback<Map<EventSeverity, Integer>>() { + // @Override + // public void onFailure(Throwable caught) { + // Log.debug("Error retrieving recent event counts for resource [" + resourceId + "]:" + // + caught.getMessage()); + // } + // + // @Override + // public void onSuccess(Map<EventSeverity, Integer> result) { + // LocatableVLayout column = new LocatableVLayout(recentOperationsContent.extendLocatorId("Content")); + // column.setHeight(10); + // if (!result.isEmpty()) { + // for (Entry<EventSeverity, Integer> entry : result.entrySet()) { + // EventSeverity severity = entry.getKey(); + // LocatableDynamicForm row = new LocatableDynamicForm(recentOperationsContent + // .extendLocatorId("ContentForm")); + // row.setNumCols(2); + // + // StaticTextItem iconItem = new StaticTextItem(); + // FormItemIcon img = new FormItemIcon(); + // img.setSrc(ImageManager.getEventSeverityIcon(severity)); + // // img.set + // img.setWidth(16); + // img.setHeight(16); + // iconItem.setIcons(img); + // iconItem.setShowTitle(false); + // + // StaticTextItem time = new StaticTextItem(); + // time.setDefaultValue(entry.getValue()); + // time.setShowTitle(false); + // time.setShowPickerIcon(false); + // time.setWrap(false); + // row.setItems(iconItem, time); + // + // column.addMember(row); + // } + // } else { + // LocatableDynamicForm row = new LocatableDynamicForm(recentEventsContent + // .extendLocatorId("ContentForm")); + // row.setNumCols(3); + // StaticTextItem none = new StaticTextItem(); + // none.setShowTitle(false); + // none.setDefaultValue(RECENT_EVENTS_NONE); + // none.setWrap(false); + // row.setItems(none); + // column.addMember(row); + // } + // //cleanup + // for (Canvas child : recentEventsContent.getChildren()) { + // child.destroy(); + // } + // recentEventsContent.addChild(column); + // recentEventsContent.markForRedraw(); + // } + // }); + } + + private void getRecentOobs() { + final int resourceId = this.resourceComposite.getResource().getId(); + AlertCriteria criteria = new AlertCriteria(); + criteria.addFilterResourceIds(resourceId); + PageControl pageControl = new PageControl(0, 5); + criteria.setPageControl(pageControl); + GWTServiceLookup.getMeasurementDataService().getHighestNOOBsForResource(resourceId, 5, + new AsyncCallback<PageList<MeasurementOOBComposite>>() { + @Override + public void onFailure(Throwable caught) { + Log.debug("Error retrieving recent out of bound metrics for resource [" + resourceId + "]:" + + caught.getMessage()); + } + + @Override + public void onSuccess(PageList<MeasurementOOBComposite> result) { + LocatableVLayout column = new LocatableVLayout(recentAlertsContent.extendLocatorId("Content")); + column.setHeight(10); + if (!result.isEmpty()) { + for (MeasurementOOBComposite oob : result) { + LocatableDynamicForm row = new LocatableDynamicForm(recentOobContent + .extendLocatorId("ContentForm")); + row.setNumCols(3); + + // StaticTextItem iconItem = new StaticTextItem(); + // FormItemIcon img = new FormItemIcon(); + // img.setSrc(ImageManager.getAlertIcon(alert.getAlertDefinition().getPriority())); + // img.setWidth(16); + // img.setHeight(16); + // iconItem.setIcons(img); + // iconItem.setShowTitle(false); + // + // LinkItem link = new LinkItem(); + // link.setLinkTitle(alert.getAlertDefinition().getName()); + // link.setTitle(alert.getAlertDefinition().getName()); + // link.setValue(ReportDecorator.GWT_RESOURCE_URL + resourceId + "/Alerts/Definitions/" + // + alert.getAlertDefinition().getId()); + // link.setTarget("_self"); + // link.setShowTitle(false); + // + // StaticTextItem time = new StaticTextItem(); + // time.setDefaultValue(new Date(alert.getAlertDefinition().getCtime()).toString()); + // time.setShowTitle(false); + // time.setShowPickerIcon(false); + // time.setWrap(false); + // row.setItems(iconItem, link, time); + // + // column.addMember(row); + } + } else { + column.setContents(RECENT_OOB_NONE); + } + recentOobContent.setContents(""); + for (Canvas child : recentOobContent.getChildren()) { + child.destroy(); + } + recentOobContent.addChild(column); + recentOobContent.markForRedraw(); + + } + }); + } + + private void getRecentPkgHistory() { + final int resourceId = this.resourceComposite.getResource().getId(); + InstalledPackageCriteria criteria = new InstalledPackageCriteria(); + criteria.addFilterResourceId(resourceId); + // criteria. + PageControl pageControl = new PageControl(0, 5); + criteria.setPageControl(pageControl); + + // GWTServiceLookup.getContentService().getInstalledPackageHistoryForResource(resourceId, 5, + // new AsyncCallback<PageList<InstalledPackageHistory>>() { + // @Override + // public void onFailure(Throwable caught) { + // Log.debug("Error retrieving installed package history for resource [" + resourceId + "]:" + // + caught.getMessage()); + // } + // + // @Override + // public void onSuccess(PageList<InstalledPackageHistory> result) { + // LocatableVLayout column = new LocatableVLayout(recentPkgHistoryContent.extendLocatorId("Content")); + // column.setHeight(10); + // if (!result.isEmpty()) { + // for (InstalledPackageHistory history : result) { + // LocatableDynamicForm row = new LocatableDynamicForm(recentPkgHistoryContent + // .extendLocatorId("ContentForm")); + // row.setNumCols(3); + // + // StaticTextItem iconItem = new StaticTextItem(); + // FormItemIcon img = new FormItemIcon(); + // img.setSrc("subsystems/content/Content_16.png"); + // img.setWidth(16); + // img.setHeight(16); + // iconItem.setIcons(img); + // iconItem.setShowTitle(false); + // + // LinkItem link = new LinkItem(); + // link.setLinkTitle(history.getPackageVersion().getDisplayName()); + // link.setTitle(history.getPackageVersion().getDisplayName()); + // // link.setValue(ReportDecorator.GWT_RESOURCE_URL + resourceId + "/Configuration/History/" + // // + update.getId()); + // //link.setValue(rhq/resource/content/audit-trail-item.xhtml?id=10005&selectedHistoryId=10002 + // link.setValue("rhq/resource/content/audit-trail-item.xhtml?id=" + resourceId + // + "&selectedHistoryId=" + history.getId()); + // link.setTarget("_self"); + // link.setShowTitle(false); + // + // StaticTextItem time = new StaticTextItem(); + // time.setDefaultValue(new Date(history.getTimestamp()).toString()); + // time.setShowTitle(false); + // time.setShowPickerIcon(false); + // time.setWrap(false); + // row.setItems(iconItem, link, time); + // + // column.addMember(row); + // } + // } else { + // LocatableDynamicForm row = new LocatableDynamicForm(recentPkgHistoryContent + // .extendLocatorId("ContentForm")); + // row.setNumCols(3); + // StaticTextItem none = new StaticTextItem(); + // none.setShowTitle(false); + // none.setDefaultValue(RECENT_PKG_HISTORY_NONE); + // none.setWrap(false); + // row.setItems(none); + // column.addMember(row); + // } + // //cleanup + // for (Canvas child : recentPkgHistoryContent.getChildren()) { + // child.destroy(); + // } + // recentPkgHistoryContent.addChild(column); + // recentPkgHistoryContent.markForRedraw(); + // } + // }); + } +} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/GwtRelativeDurationConverter.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/GwtRelativeDurationConverter.java new file mode 100644 index 0000000..36dee5e --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/GwtRelativeDurationConverter.java @@ -0,0 +1,99 @@ +package org.rhq.enterprise.gui.coregui.client.util; + +//import java.text.SimpleDateFormat; +import java.util.Date; + +import com.google.gwt.i18n.client.DateTimeFormat; +import com.google.gwt.i18n.client.TimeZone; +import com.google.gwt.i18n.client.TimeZoneInfo; + +/** An RPC gwt serializable implemenation of the jsf RelativeDurationConverter + * utility. + * + * Convert the passed value in to a relative date compared to now. + * If the passed value is -1, the output will be empty (as a value of 0 + * returns the number of days since the epoch) + * @author Joseph Marques + * @author Simeon Pinder + */ +public class GwtRelativeDurationConverter { + private static final long MILLIS_IN_SECOND = 1000L; + private static final long MILLIS_IN_MINUTE = 60 * MILLIS_IN_SECOND; + private static final long MILLIS_IN_HOUR = 60 * MILLIS_IN_MINUTE; + private static final long NEVER = -1; + + private static final long MILLIS_IN_DAY = 24 * MILLIS_IN_HOUR; + // private static final SimpleDateFormat dayFormatter = new SimpleDateFormat("D"); + // private static final SimpleDateFormat formatter = new SimpleDateFormat("hh:mm aaa z"); + private static final DateTimeFormat dayFormatter = DateTimeFormat.getFormat("D"); + private static final DateTimeFormat formatter = DateTimeFormat.getFormat("hh:mm aaa z"); + + public static TimeZone tz = null; + + public static String format(long eventMillis) { + int dayOfYearToday = Integer.parseInt(dayFormatter.format(new Date(System.currentTimeMillis()))); + int dayOfYearEvent = Integer.parseInt(dayFormatter.format(new Date(eventMillis))); + String result = null; + if (dayOfYearEvent == dayOfYearToday) { + // <time> + result = formatter.format(new Date(eventMillis)); + } else if (dayOfYearEvent == dayOfYearToday - 1) { + // "yesterday" <time> + result = "Yesterday, " + formatter.format(new Date(eventMillis)); + } else { + // <time> "ago" + result = getRelativeTimeAgo(eventMillis) + " ago"; + } + return result; + } + + private static TimeZone getTimeZone() { + if (tz == null) { + // return TimeZone.getDefault(); + return TimeZone.createTimeZone(TimeZoneInfo.buildTimeZoneData(String.valueOf(System.currentTimeMillis()))); + } else { + return tz; + } + } + + private static String getRelativeTimeAgo(long millis) { + StringBuilder buf = new StringBuilder(); + long timeAgo = System.currentTimeMillis() - millis; + + int count = 0; + int days = (int) (timeAgo / MILLIS_IN_DAY); + timeAgo %= MILLIS_IN_DAY; + if (days > 0) { + count++; + buf.append(days).append(" day"); + if (days != 1) + buf.append("s"); + } + + int hours = (int) (timeAgo / MILLIS_IN_HOUR); + timeAgo %= MILLIS_IN_HOUR; + if (hours > 0) { + count++; + if (buf.length() > 0) + buf.append(", "); + buf.append(hours).append(" hour"); + if (hours != 1) + buf.append("s"); + } + + if (count < 2) { + int mins = (int) (timeAgo / MILLIS_IN_MINUTE); + timeAgo %= MILLIS_IN_MINUTE; + if (mins > 0) { + if (buf.length() > 0) + buf.append(", "); + buf.append(mins).append(" minute"); + if (mins != 1) + buf.append("s"); + } + } + + return buf.toString(); + } + +} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ContentGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ContentGWTServiceImpl.java index bd6da37..cc9c288 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ContentGWTServiceImpl.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ContentGWTServiceImpl.java @@ -33,6 +33,7 @@ import org.rhq.core.util.exception.ThrowableUtil; import org.rhq.enterprise.gui.coregui.client.gwt.ContentGWTService; import org.rhq.enterprise.gui.coregui.server.util.SerialUtility; import org.rhq.enterprise.server.content.ContentManagerLocal; +import org.rhq.enterprise.server.content.ContentUIManagerLocal; import org.rhq.enterprise.server.util.LookupUtil;
/** @@ -43,6 +44,7 @@ public class ContentGWTServiceImpl extends AbstractGWTServiceImpl implements Con private static final long serialVersionUID = 1L;
private ContentManagerLocal contentManager = LookupUtil.getContentManager(); + private ContentUIManagerLocal contentUiManager = LookupUtil.getContentUIManager();
public void deletePackageVersion(int packageVersionId) { try { @@ -61,6 +63,16 @@ public class ContentGWTServiceImpl extends AbstractGWTServiceImpl implements Con } }
+ // public PageList<InstalledPackageHistory> getInstalledPackageHistoryForResource(int resourceId, int count) { + // try { + // PageControl pc = new PageControl(0, count); + // return SerialUtility.prepare(contentUiManager.getInstalledPackageHistoryForResource(resourceId, pc), + // "ContentService.getInstalledPackageHistoryForResource"); + // } catch (Exception e) { + // throw new RuntimeException(ThrowableUtil.getAllMessages(e)); + // } + // } + public List<Architecture> getArchitectures() { try { return SerialUtility.prepare(contentManager.findArchitectures(getSessionSubject()), diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/EventGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/EventGWTServiceImpl.java index 3dbae8e..6369c90 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/EventGWTServiceImpl.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/EventGWTServiceImpl.java @@ -75,6 +75,15 @@ public class EventGWTServiceImpl extends AbstractGWTServiceImpl implements Event } }
+ // public Map<EventSeverity, Integer> getEventCountsBySeverity(int resourceId, long startDate, long endDate) { + // try { + // return SerialUtility.prepare(eventManager.getEventCountsBySeverity(getSessionSubject(), resourceId, + // startDate, endDate), "EventService.getEventCountsBySeverity"); + // } catch (Exception e) { + // throw new RuntimeException(ThrowableUtil.getAllMessages(e)); + // } + // } + public PageList<Event> findEventsByCriteria(EventCriteria criteria) { try { return SerialUtility.prepare(eventManager.findEventsByCriteria(getSessionSubject(), criteria), 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 2c45fbb..8f06b15 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 @@ -133,7 +133,12 @@ common_title_port = Port common_title_providers = Providers common_title_recently_added = Recently Added Resources common_title_recent_alerts = Recent Alerts +common_title_recent_configuration_updates=Recent Configuration Updates +common_title_recent_event_counts=Recent Event Counts +common_title_recent_measurements=Recent Measurements +common_title_recent_oob_metrics=Recent Out of Bound metrics common_title_recent_operations = Recent Operations +common_title_recent_pkg_history=Recent Package History common_title_remove_column = Remove Column common_title_repositories = Repositories common_title_resource = Resource @@ -1286,6 +1291,14 @@ view_inventory_resources_loadFailed = Failed to load resource composite data view_inventory_resources_title = Member Resources view_inventory_resources_title_children = Child Resources view_inventory_resources_title_members = Member Resources +view_resource_inventory_activity_changed_by=Changed by +view_resource_inventory_activity_no_recent_alerts=No recent alerts +view_resource_inventory_activity_no_recent_config_history=No configuration change history +view_resource_inventory_activity_no_recent_events =No events in the last 24 hours +view_resource_inventory_activity_no_recent_metrics=This resource has no recent metrics +view_resource_inventory_activity_no_recent_oob=No OOB conditions found +view_resource_inventory_activity_no_recent_operations=No recent operation history +view_resource_inventory_activity_no_recent_pkg_history=No recent package history view_resource_monitor_availability_loadFailed = Failed to load availability history view_resource_monitor_graphs_noneAvailable = No graphs available view_resource_monitor_graphs_loadFailed = Failed to load graph data