modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
| 32 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/GroupResourceConfigurationEditView.java
| 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/GroupPluginConfigurationEditView.java
| 228 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/RecentOperationsDataSource.java
| 8
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/ScheduledOperationsDataSource.java
| 8
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/ProblemResourcesDataSource.java
| 8
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/disambiguation/ReportDecorator.java
| 74 ++-
7 files changed, 314 insertions(+), 49 deletions(-)
New commits:
commit 5ea3d1e4c383bb4e2592b86494e1c2e56665f0cd
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Wed Oct 27 12:30:59 2010 -0400
implement group plugin config view (group Inventory > Connection Settings subtab);
extract code for building group member labels into ReportDecorator utility class
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
index bcef904..2d2c7c8 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
@@ -50,6 +50,7 @@ import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import
org.rhq.enterprise.gui.coregui.client.inventory.common.detail.AbstractTwoLevelTabSetView;
import
org.rhq.enterprise.gui.coregui.client.inventory.common.event.EventCompositeHistoryView;
import
org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.configuration.GroupResourceConfigurationEditView;
+import
org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.inventory.GroupPluginConfigurationEditView;
import
org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.inventory.ResourceGroupMembershipView;
import
org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.monitoring.schedules.SchedulesView;
import
org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.monitoring.traits.TraitsView;
@@ -215,22 +216,26 @@ public class ResourceGroupDetailView extends
AbstractTwoLevelTabSetView<Resource
// summaryTab.updateSubTab("Overview", new
DashboardView(resource));
// summaryTab.updateSubTab("Timeline", timelinePane);
// Summary tab is always visible and enabled.
- updateSubTab(this.summaryTab, this.summaryOverview, new
OverviewView(this.summaryTab
- .extendLocatorId("OverviewView"), this.groupComposite), true,
true);
+ updateSubTab(this.summaryTab, this.summaryOverview, new
OverviewView(this.summaryOverview
+ .extendLocatorId("View"), this.groupComposite), true, true);
if (updateTab(this.monitoringTab, groupCategory == GroupCategory.COMPATIBLE,
true)) {
visible = hasMetricsOfType(this.groupComposite, DataType.MEASUREMENT);
canvas = (visible) ? new
FullHTMLPane("/rhq/group/monitor/graphs-plain.xhtml?groupId=" + groupId) :
null;
updateSubTab(this.monitoringTab, this.monitorGraphs, canvas, visible, true);
+
// visible = same test as above
canvas = (visible) ? new
FullHTMLPane("/rhq/group/monitor/tables-plain.xhtml?groupId=" + groupId) :
null;
updateSubTab(this.monitoringTab, this.monitorTables, canvas, visible, true);
+
visible = hasMetricsOfType(this.groupComposite, DataType.TRAIT);
- canvas = (visible) ? new
TraitsView(this.monitoringTab.extendLocatorId("TraitsView"), groupId) : null;
+ canvas = (visible) ? new
TraitsView(this.monitorTraits.extendLocatorId("View"), groupId) : null;
updateSubTab(this.monitoringTab, this.monitorTraits, canvas, visible, true);
+
visible = hasMetricsOfType(this.groupComposite, null);
- canvas = (visible) ? new
SchedulesView(this.monitoringTab.extendLocatorId("SchedulesView"), groupId) :
null;
+ canvas = (visible) ? new
SchedulesView(this.monitorSched.extendLocatorId("View"), groupId) : null;
updateSubTab(this.monitoringTab, this.monitorSched, canvas, visible, true);
+
visible = facets.contains(ResourceTypeFacet.CALL_TIME);
canvas = (visible) ? new
FullHTMLPane("/rhq/group/monitor/response-plain.xhtml?groupId=" + groupId) :
null;
updateSubTab(this.monitoringTab, this.monitorCallTime, canvas, visible,
true);
@@ -238,14 +243,13 @@ public class ResourceGroupDetailView extends
AbstractTwoLevelTabSetView<Resource
}
// Inventory tab is always visible and enabled.
- updateSubTab(this.inventoryTab, this.inventoryMembers,
ResourceSearchView.getMembersOf(this.inventoryTab
- .extendLocatorId("MembersView"), groupId), true, true);
- // TODO: Uncomment this once the group config component is done.
- //updateSubTab(this.inventoryTab, this.inventoryConn,
- // new GroupPluginConfigurationEditView(this.group.getId(),
this.group.getResourceType().getId(), ConfigurationEditor.ConfigType.plugin),
- // facets.contains(ResourceTypeFacet.PLUGIN_CONFIGURATION), true);
+ updateSubTab(this.inventoryTab, this.inventoryMembers,
ResourceSearchView.getMembersOf(this.inventoryMembers
+ .extendLocatorId("View"), groupId), true, true);
+ updateSubTab(this.inventoryTab, this.inventoryConn,
+ new
GroupPluginConfigurationEditView(this.inventoryConn.extendLocatorId("View"),
this.groupComposite),
+ facets.contains(ResourceTypeFacet.PLUGIN_CONFIGURATION), true);
enabled = globalPermissions.contains(Permission.MANAGE_INVENTORY);
- canvas = (enabled) ? new
ResourceGroupMembershipView(this.inventoryTab.extendLocatorId("MembershipView"),
+ canvas = (enabled) ? new
ResourceGroupMembershipView(this.inventoryMembership.extendLocatorId("View"),
groupId) : null;
updateSubTab(this.inventoryTab, this.inventoryMembership, canvas, true,
enabled);
@@ -263,7 +267,7 @@ public class ResourceGroupDetailView extends
AbstractTwoLevelTabSetView<Resource
updateSubTab(this.alertsTab, this.alertHistory,
GroupAlertHistoryView.get(groupComposite), true, true);
// but alert definitions can only be created on compatible groups
visible = (groupCategory == GroupCategory.COMPATIBLE);
- canvas = (visible) ? new
GroupAlertDefinitionsView(alertsTab.extendLocatorId("AlertDefView"),
+ canvas = (visible) ? new
GroupAlertDefinitionsView(alertDef.extendLocatorId("View"),
this.groupComposite) : null;
updateSubTab(this.alertsTab, this.alertDef, canvas, visible, true);
}
@@ -281,8 +285,8 @@ public class ResourceGroupDetailView extends
AbstractTwoLevelTabSetView<Resource
visible = groupCategory == GroupCategory.MIXED
|| (groupCategory == GroupCategory.COMPATIBLE &&
facets.contains(ResourceTypeFacet.EVENT));
if (updateTab(this.eventsTab, visible, true)) {
- updateSubTab(this.eventsTab, this.eventHistory,
EventCompositeHistoryView.get(this.eventsTab
- .extendLocatorId("CompositeHistView"), groupComposite), true,
true);
+ updateSubTab(this.eventsTab, this.eventHistory,
EventCompositeHistoryView.get(this.eventHistory
+ .extendLocatorId("View"), groupComposite), true, true);
}
this.show();
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/GroupResourceConfigurationEditView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/GroupResourceConfigurationEditView.java
index 4e9d337..f9ff99e 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/GroupResourceConfigurationEditView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/GroupResourceConfigurationEditView.java
@@ -159,11 +159,8 @@ public class GroupResourceConfigurationEditView extends
LocatableVLayout
public void
onSuccess(List<DisambiguationReport<ResourceConfigurationComposite>> results)
{
memberConfigurations = new
ArrayList<GroupMemberConfiguration>(results.size());
for (DisambiguationReport<ResourceConfigurationComposite>
result : results) {
- String parentsHtml =
ReportDecorator.decorateResourceLineage(result.getParents());
int resourceId = result.getOriginal().getResourceId();
- String resourceHtml =
ReportDecorator.decorateResourceName(ReportDecorator.GWT_RESOURCE_URL,
- result.getResourceType(), result.getName(), resourceId);
- String label = parentsHtml +
ReportDecorator.DEFAULT_SEPARATOR + resourceHtml;
+ String label =
ReportDecorator.decorateDisambiguationReport(result, resourceId, false);
Configuration configuration =
result.getOriginal().getConfiguration();
GroupMemberConfiguration memberConfiguration = new
GroupMemberConfiguration(resourceId, label,
configuration);
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/GroupPluginConfigurationEditView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/GroupPluginConfigurationEditView.java
new file mode 100644
index 0000000..218d663
--- /dev/null
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/GroupPluginConfigurationEditView.java
@@ -0,0 +1,228 @@
+/*
+ * 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.groups.detail.inventory;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.types.Overflow;
+import com.smartgwt.client.widgets.IButton;
+import com.smartgwt.client.widgets.events.ClickEvent;
+import com.smartgwt.client.widgets.events.ClickHandler;
+import com.smartgwt.client.widgets.layout.LayoutSpacer;
+import com.smartgwt.client.widgets.toolbar.ToolStrip;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.composite.ResourceConfigurationComposite;
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.resource.composite.DisambiguationReport;
+import org.rhq.core.domain.resource.composite.ResourcePermission;
+import org.rhq.core.domain.resource.group.ResourceGroup;
+import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.RefreshableView;
+import
org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
+import
org.rhq.enterprise.gui.coregui.client.components.configuration.GroupConfigurationEditor;
+import
org.rhq.enterprise.gui.coregui.client.components.configuration.GroupMemberConfiguration;
+import
org.rhq.enterprise.gui.coregui.client.components.configuration.PropertyValueChangeEvent;
+import
org.rhq.enterprise.gui.coregui.client.components.configuration.PropertyValueChangeListener;
+import org.rhq.enterprise.gui.coregui.client.gwt.ConfigurationGWTServiceAsync;
+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.resource.disambiguation.ReportDecorator;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.MessageCenter;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIButton;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+
+/**
+ * A view for editing a group's configuration.
+ *
+ * @author Ian Springer
+ */
+public class GroupPluginConfigurationEditView extends LocatableVLayout
+ implements PropertyValueChangeListener, RefreshableView {
+ private final ConfigurationGWTServiceAsync configurationService =
GWTServiceLookup.getConfigurationService();
+
+ private ResourceGroup group;
+ private ResourcePermission resourcePermission;
+ private ConfigurationDefinition configurationDefinition;
+ private List<GroupMemberConfiguration> memberConfigurations;
+
+ private ConfigurationEditor editor;
+ private IButton saveButton;
+
+ public GroupPluginConfigurationEditView(String locatorId, ResourceGroupComposite
groupComposite) {
+ super(locatorId);
+
+ this.group = groupComposite.getResourceGroup();
+ this.resourcePermission = groupComposite.getResourcePermission();
+ }
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+
+ ToolStrip toolStrip = new ToolStrip();
+ toolStrip.setWidth100();
+
+ toolStrip.addMember(new LayoutSpacer());
+
+ this.saveButton = new LocatableIButton(this.extendLocatorId("Save"),
"Save");
+ this.saveButton.setTooltip("Update the connection settings of all group
members.");
+ this.saveButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ save();
+ }
+ });
+ toolStrip.addMember(saveButton);
+
+ addMember(toolStrip);
+ refresh();
+
+ if (!this.resourcePermission.isInventory()) {
+ Message message = new Message("You do not have permission to edit this
group's connection settings.",
+ Message.Severity.Info, EnumSet.of(Message.Option.Transient,
Message.Option.Sticky));
+ CoreGUI.getMessageCenter().notify(message);
+ }
+ }
+
+ @Override
+ public void refresh() {
+ this.saveButton.disable();
+ if (editor != null) {
+ editor.destroy();
+ removeMember(editor);
+ }
+ // TODO (ips): If editor != null, use editor.reload() instead.
+
+ loadConfigurationDefinition();
+ loadConfigurations();
+ }
+
+ private void initEditor() {
+ if (this.configurationDefinition != null && this.memberConfigurations !=
null) {
+ this.editor = new
GroupConfigurationEditor(this.extendLocatorId("Editor"),
this.configurationDefinition,
+ this.memberConfigurations);
+ this.editor.setOverflow(Overflow.AUTO);
+ this.editor.addPropertyValueChangeListener(this);
+ this.editor.setReadOnly(!this.resourcePermission.isConfigureWrite());
+ addMember(this.editor);
+ }
+ }
+
+ private void loadConfigurationDefinition() {
+ if (this.configurationDefinition == null) {
+ final ResourceType type = this.group.getResourceType();
+ ResourceTypeRepository.Cache.getInstance().getResourceTypes(new Integer[] {
type.getId() },
+
EnumSet.of(ResourceTypeRepository.MetadataType.pluginConfigurationDefinition),
+ new ResourceTypeRepository.TypesLoadedCallback() {
+ public void onTypesLoaded(Map<Integer, ResourceType> types) {
+ configurationDefinition =
types.get(type.getId()).getPluginConfigurationDefinition();
+ if (configurationDefinition == null) {
+ throw new IllegalStateException("Connection settings are
not supported by this group.");
+ }
+ initEditor();
+ }
+ });
+ }
+ }
+
+ private void loadConfigurations() {
+ this.memberConfigurations = null;
+ this.configurationService.findPluginConfigurationsForGroup(group.getId(), new
AsyncCallback<List<DisambiguationReport<ResourceConfigurationComposite>>>()
{
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to retrieve
member connection settings for " + group + ".", caught);
+ }
+
+ public void
onSuccess(List<DisambiguationReport<ResourceConfigurationComposite>> results)
{
+ memberConfigurations = new
ArrayList<GroupMemberConfiguration>(results.size());
+ for (DisambiguationReport<ResourceConfigurationComposite>
result : results) {
+ int resourceId = result.getOriginal().getResourceId();
+ String label =
ReportDecorator.decorateDisambiguationReport(result, resourceId, false);
+ Configuration configuration =
result.getOriginal().getConfiguration();
+ GroupMemberConfiguration memberConfiguration = new
GroupMemberConfiguration(resourceId, label,
+ configuration);
+ if (configuration == null ||
configuration.getProperties().isEmpty()) {
+ throw new RuntimeException("One or more null or
empty member connection settings was returned by the Server.");
+ }
+ memberConfigurations.add(memberConfiguration);
+ }
+ initEditor();
+ }
+ });
+ }
+
+ private void save() {
+ List<ResourceConfigurationComposite> resourceConfigurations =
convertToCompositeList();
+
GWTServiceLookup.getConfigurationService().updatePluginConfigurationsForGroup(this.group.getId(),
+ resourceConfigurations, new AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Connection settings
update failed for "
+ + group.getResourceType().getName() + " compatible group
'" + group.getName() + "'.", caught);
+ }
+
+ public void onSuccess(Void result) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("Connection settings update initiated.",
+ "Connection settings update initiated for " +
group.getResourceType().getName()
+ + " compatible group '" + group.getName() +
"'.",
+ Message.Severity.Info));
+ refresh();
+ }
+ });
+ }
+
+ private List<ResourceConfigurationComposite> convertToCompositeList() {
+ List<ResourceConfigurationComposite> resourceConfigurations =
+ new
ArrayList<ResourceConfigurationComposite>(this.memberConfigurations.size());
+ for (GroupMemberConfiguration memberConfiguration : this.memberConfigurations) {
+ resourceConfigurations.add(new
ResourceConfigurationComposite(memberConfiguration.getId(),
+ memberConfiguration.getConfiguration()));
+ }
+ return resourceConfigurations;
+ }
+
+ @Override
+ public void propertyValueChanged(PropertyValueChangeEvent event) {
+ MessageCenter messageCenter = CoreGUI.getMessageCenter();
+ Message message;
+ if (event.isValidationStateChanged()) {
+ Set<String> invalidPropertyNames = event.getInvalidPropertyNames();
+ if (invalidPropertyNames.isEmpty()) {
+ this.saveButton.enable();
+ message = new Message("All properties have valid values, so the
connection settings can now be saved.",
+ Message.Severity.Info, EnumSet.of(Message.Option.Transient,
Message.Option.Sticky));
+ } else {
+ this.saveButton.disable();
+ message = new Message("The following properties have invalid values:
"
+ + invalidPropertyNames + ". The values must be corrected before
the connection settings can be saved.",
+ Message.Severity.Error, EnumSet.of(Message.Option.Transient,
Message.Option.Sticky));
+ }
+ messageCenter.notify(message);
+ } else {
+ this.saveButton.enable();
+ }
+ }
+}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/RecentOperationsDataSource.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/RecentOperationsDataSource.java
index 24ada45..62d2ede 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/RecentOperationsDataSource.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/RecentOperationsDataSource.java
@@ -188,9 +188,9 @@ public class RecentOperationsDataSource extends
//disambiguated Resource name, decorated with html anchors to problem
resources
record.setAttribute(resource,
ReportDecorator.decorateResourceName(ReportDecorator.GWT_RESOURCE_URL,
report.getResourceType(), report.getOriginal().getResourceName(),
report.getOriginal()
- .getResourceId()));
+ .getResourceId(), true));
//disambiguated resource lineage, decorated with html anchors
- record.setAttribute(location,
ReportDecorator.decorateResourceLineage(report.getParents()));
+ record.setAttribute(location,
ReportDecorator.decorateResourceLineage(report.getParents(), true));
//operation name.
record.setAttribute(operation, report.getOriginal().getOperationName());
//timestamp.
@@ -238,8 +238,8 @@ public class RecentOperationsDataSource extends
public ListGridRecord
copyValues(DisambiguationReport<ResourceOperationLastCompletedComposite> from) {
ListGridRecord record = new ListGridRecord();
record.setAttribute(resource,
ReportDecorator.decorateResourceName(ReportDecorator.GWT_RESOURCE_URL, from
- .getResourceType(), from.getOriginal().getResourceName(),
from.getOriginal().getResourceId()));
- record.setAttribute(location,
ReportDecorator.decorateResourceLineage(from.getParents()));
+ .getResourceType(), from.getOriginal().getResourceName(),
from.getOriginal().getResourceId(), true));
+ record.setAttribute(location,
ReportDecorator.decorateResourceLineage(from.getParents(), true));
record.setAttribute(operation, from.getOriginal().getOperationName());
record.setAttribute(time, from.getOriginal().getOperationStartTime());
record.setAttribute(status, generateResourceOperationStatusLink(from));
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/ScheduledOperationsDataSource.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/ScheduledOperationsDataSource.java
index ab28a8e..770dd0e 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/ScheduledOperationsDataSource.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/ScheduledOperationsDataSource.java
@@ -181,9 +181,9 @@ public class ScheduledOperationsDataSource extends
//disambiguated Resource name, decorated with html anchors to problem
resources
record.setAttribute(resource,
ReportDecorator.decorateResourceName(ReportDecorator.GWT_RESOURCE_URL,
report.getResourceType(), report.getOriginal().getResourceName(),
report.getOriginal()
- .getResourceId()));
+ .getResourceId(), true));
//disambiguated resource lineage, decorated with html anchors
- record.setAttribute(location,
ReportDecorator.decorateResourceLineage(report.getParents()));
+ record.setAttribute(location,
ReportDecorator.decorateResourceLineage(report.getParents(), true));
//operation name.
record.setAttribute(operation, report.getOriginal().getOperationName());
//timestamp.
@@ -204,8 +204,8 @@ public class ScheduledOperationsDataSource extends
public ListGridRecord
copyValues(DisambiguationReport<ResourceOperationScheduleComposite> from) {
ListGridRecord record = new ListGridRecord();
record.setAttribute(resource,
ReportDecorator.decorateResourceName(ReportDecorator.GWT_RESOURCE_URL, from
- .getResourceType(), from.getOriginal().getResourceName(),
from.getOriginal().getResourceId()));
- record.setAttribute(location,
ReportDecorator.decorateResourceLineage(from.getParents()));
+ .getResourceType(), from.getOriginal().getResourceName(),
from.getOriginal().getResourceId(), true));
+ record.setAttribute(location,
ReportDecorator.decorateResourceLineage(from.getParents(), true));
record.setAttribute(operation, from.getOriginal().getOperationName());
record.setAttribute(time, from.getOriginal().getOperationNextFireTime());
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/ProblemResourcesDataSource.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/ProblemResourcesDataSource.java
index e7c8050..9c0a84c 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/ProblemResourcesDataSource.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/ProblemResourcesDataSource.java
@@ -178,9 +178,9 @@ public class ProblemResourcesDataSource extends
RPCDataSource<DisambiguationRepo
//disambiguated Resource name, decorated with html anchors to problem
resources
record.setAttribute(resource,
ReportDecorator.decorateResourceName(ReportDecorator.GWT_RESOURCE_URL,
report.getResourceType(), report.getOriginal().getResourceName(),
report.getOriginal()
- .getResourceId()));
+ .getResourceId(), true));
//disambiguated resource lineage, decorated with html anchors
- record.setAttribute(location,
ReportDecorator.decorateResourceLineage(report.getParents()));
+ record.setAttribute(location,
ReportDecorator.decorateResourceLineage(report.getParents(), true));
//alert cnt.
record.setAttribute(alerts, report.getOriginal().getNumAlerts());
//populate availability icon
@@ -200,8 +200,8 @@ public class ProblemResourcesDataSource extends
RPCDataSource<DisambiguationRepo
public ListGridRecord copyValues(DisambiguationReport<ProblemResourceComposite>
from) {
ListGridRecord record = new ListGridRecord();
record.setAttribute(resource,
ReportDecorator.decorateResourceName(ReportDecorator.GWT_RESOURCE_URL, from
- .getResourceType(), from.getOriginal().getResourceName(),
from.getOriginal().getResourceId()));
- record.setAttribute(location,
ReportDecorator.decorateResourceLineage(from.getParents()));
+ .getResourceType(), from.getOriginal().getResourceName(),
from.getOriginal().getResourceId(), true));
+ record.setAttribute(location,
ReportDecorator.decorateResourceLineage(from.getParents(), true));
record.setAttribute(alerts, from.getOriginal().getNumAlerts());
if (from.getOriginal().getAvailabilityType().compareTo(AvailabilityType.DOWN) ==
0) {
record.setAttribute(available,
"/images/icons/availability_red_16.png");
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/disambiguation/ReportDecorator.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/disambiguation/ReportDecorator.java
index e7ca4ff..30b68d7 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/disambiguation/ReportDecorator.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/disambiguation/ReportDecorator.java
@@ -18,67 +18,103 @@ import
org.rhq.core.domain.resource.composite.DisambiguationReport.ResourceType;
public class ReportDecorator {
//TODO: pull value from more bookmarking/history definition
- public final static String GWT_RESOURCE_URL =
"/coregui/CoreGUI.html#Resource/";
- public final static String GWT_RECENT_OPERATION_URL =
"/coregui/CoreGUI.html#Operation/";
+ public final static String GWT_RESOURCE_URL = "#Resource/";
public static final String DEFAULT_SEPARATOR = " > ";
- /** Generates HTML label from DisambiguationReport data.
+ /**
+ * Generates HTML label that includes hyperlinks to each of the Resources in the
linage from a DisambiguationReport.
+ *
+ * @param disambiguationReport a disambiguation report
+ * @param resourceId the id of the Resource to which the disambiguation report
corresponds
+ * @param makeLink if true, the Resource name will be made into a link to go the
Resource
+ *
+ * @return the HTML label
+ */
+ public static String decorateDisambiguationReport(DisambiguationReport
disambiguationReport, int resourceId,
+ boolean makeLink) {
+ String parentsHtml = decorateResourceLineage(disambiguationReport.getParents(),
true);
+ String resourceHtml =
ReportDecorator.decorateResourceName(ReportDecorator.GWT_RESOURCE_URL,
+ disambiguationReport.getResourceType(), disambiguationReport.getName(),
resourceId, makeLink);
+ String label;
+ if (parentsHtml.length() >= 1) {
+ label = parentsHtml + ReportDecorator.DEFAULT_SEPARATOR + resourceHtml;
+ } else {
+ label = resourceHtml;
+ }
+ return label;
+ }
+
+ /**
+ * Generates HTML label from DisambiguationReport data.
*
- * @param ResourceType type. If !null, the ResourceType name is prepended to
result.
+ * @param type ResourceType - If !null, the ResourceType name is prepended to
result.
* @param resourceName Name of the element from report
* @param resourceId Id for resource
+ * @param makeLink if true, the Resource name will be made into a link to go the
Resource
+ *
* @return String of generated html for a ResourceName.
*/
- public static String decorateResourceName(String specificUrl, ResourceType type,
String resourceName, int resourceId) {
+ public static String decorateResourceName(String specificUrl, ResourceType type,
String resourceName,
+ int resourceId, boolean makeLink) {
String decorated = "";
if (type != null) {
decorated += type.getName();
-
if (type.getPlugin() != null) {
- decorated += " (" + type.getPlugin() + " plugin) ";
+ decorated += " (" + type.getPlugin() + " plugin)";
}
+ decorated += " ";
+ }
+
+ if (makeLink) {
+ decorated += "<a href=\"" + specificUrl + resourceId +
"\">";
+ }
+ decorated += resourceName;
+ if (makeLink) {
+ decorated += "</a>";
}
- decorated += " <a href=\"" + specificUrl + resourceId +
"\">" + resourceName + "</a>";
return decorated;
}
- /** Generates Html label of Resource Lineage for disambiguation.
+ /**
+ * Generates HTML label of Resource Lineage for disambiguation.
*
* @param parents ResourceLineage provided by DisambiguationReport.
+ * @param makeLink if true, the Resource name will be made into a link to go the
Resource
+ *
* @return String of generated html for ResourceLineage.
*/
- public static String decorateResourceLineage(List<Resource> parents) {
- StringBuffer decorated = new StringBuffer();
+ public static String decorateResourceLineage(List<Resource> parents, boolean
makeLink) {
+ StringBuilder decorated = new StringBuilder();
if (parents != null && parents.size() > 0) {
Iterator<DisambiguationReport.Resource> it = parents.iterator();
DisambiguationReport.Resource parent = it.next();
//generate first link
String parentUrl = ReportDecorator.decorateResourceName(GWT_RESOURCE_URL,
null, parent.getName(), parent
- .getId());
- decorated = writeResource(decorated, parentUrl, parent.getName(),
parent.getType());
+ .getId(), true);
+ decorated = writeResource(decorated, parentUrl, parent.getType());
while (it.hasNext()) {
decorated.append(DEFAULT_SEPARATOR);
parent = it.next();
decorated = writeResource(decorated,
ReportDecorator.decorateResourceName(GWT_RESOURCE_URL, null,
- parent.getName(), parent.getId()), parent.getName(),
parent.getType());
+ parent.getName(), parent.getId(), makeLink), parent.getType());
}
}
return decorated.toString();
}
- /** Appends resource lineage details with html anchors.
+ /**
+ * Appends resource lineage details with HTML anchors.
*
- * @param existing
+ * @param existing
* @param url
- * @param resourceName
* @param resourceType
* @return
*/
- private static StringBuffer writeResource(StringBuffer existing, String url, String
resourceName,
- DisambiguationReport.ResourceType resourceType) {
+ private static StringBuilder writeResource(StringBuilder existing, String url,
+ ResourceType resourceType) {
if (!resourceType.isSingleton()) {
existing.append(resourceType.getName()).append(" ");