modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java
| 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
| 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
| 12
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationMembers.java
| 245 ++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationSettings.java
| 150 +++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationTable.java
| 276 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationView.java
| 86 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/CurrentGroupPluginConfigurationView.java
| 249 ---------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/GroupPluginConfigurationEditView.java
| 249 +++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationMembers.java
| 93 +--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationTable.java
| 87 +--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
| 22
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
| 26
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/group/ViewGroupConnectionPropertyDetailsUIBean.java
| 12
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
| 7
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
| 3
16 files changed, 1145 insertions(+), 379 deletions(-)
New commits:
commit 239280baebbfa542c60cc6430ae526150ab84398
Merge: 0ca30d0... ef1a25d...
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 1 18:01:30 2011 -0500
Merge commit 'origin/master' into group-config-history
commit 0ca30d011810cfdd624e41cc8316d76e838428e8
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 1 18:01:27 2011 -0500
firs try at group resource config history
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java
index 5770cd3..61bfede 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java
@@ -98,7 +98,7 @@ public class LinkManager {
public static String getGroupResourceConfigurationUpdateHistoryLink(int groupId,
Integer groupUpdateHistoryId) {
if (groupUpdateHistoryId != null) {
- return getResourceGroupLink(groupId) + "/Configuration/History/" +
groupUpdateHistoryId;
+ return getResourceGroupLink(groupId) + "/Configuration/History/" +
groupUpdateHistoryId + "/Members";
} else {
return getResourceGroupLink(groupId) + "/Configuration/History";
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
index e1757b8..62f9655 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
@@ -73,6 +73,9 @@ public interface ConfigurationGWTService extends RemoteService {
List<DisambiguationReport<ResourceConfigurationComposite>>
findPluginConfigurationsForGroup(int groupId)
throws RuntimeException;
+ List<DisambiguationReport<ResourceConfigurationComposite>>
findResourceConfigurationsForGroupUpdate(
+ int groupUpdateId) throws RuntimeException;
+
List<DisambiguationReport<ResourceConfigurationComposite>>
findPluginConfigurationsForGroupUpdate(int groupUpdateId)
throws RuntimeException;
@@ -87,6 +90,4 @@ public interface ConfigurationGWTService extends RemoteService {
void deleteGroupResourceConfigurationUpdate(Integer groupId, Integer[]
groupResourceConfigUpdateIds)
throws RuntimeException;
-
- //RawConfiguration dummy(RawConfiguration config) throws RuntimeException;
}
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 a137250..9b89dff 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
@@ -55,6 +55,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.configuration.HistoryGroupResourceConfigurationView;
import
org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.inventory.GroupPluginConfigurationEditView;
import
org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.inventory.HistoryGroupPluginConfigurationView;
import
org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.inventory.MembersView;
@@ -337,8 +338,7 @@ public class ResourceGroupDetailView extends
AbstractTwoLevelTabSetView<Resource
true, new ViewFactory() {
@Override
public Canvas createView() {
- return new
GroupPluginConfigurationEditView(inventoryConn.extendLocatorId("View"),
- groupComposite);
+ return new
GroupPluginConfigurationEditView(inventoryConn.extendLocatorId("View"),
groupComposite);
}
});
updateSubTab(this.inventoryTab, this.inventoryConnHistory, facets
@@ -397,8 +397,6 @@ public class ResourceGroupDetailView extends
AbstractTwoLevelTabSetView<Resource
.contains(ResourceTypeFacet.CONFIGURATION));
Set<Permission> groupPermissions =
this.groupComposite.getResourcePermission().getPermissions();
if (updateTab(this.configurationTab, visible, visible &&
groupPermissions.contains(Permission.CONFIGURE_READ))) {
- //updateSubTab(this.configurationTab, this.configCurrent, new FullHTMLPane(
- // "/rhq/group/configuration/viewCurrent-plain.xhtml?groupId=" +
groupId), true, true);
updateSubTab(this.configurationTab, this.configCurrent, true, true, new
ViewFactory() {
@Override
public Canvas createView() {
@@ -408,8 +406,8 @@ public class ResourceGroupDetailView extends
AbstractTwoLevelTabSetView<Resource
updateSubTab(this.configurationTab, this.configHistory, true, true, new
ViewFactory() {
@Override
public Canvas createView() {
- return new
FullHTMLPane(configHistory.extendLocatorId("View"),
- "/rhq/group/configuration/history-plain.xhtml?groupId="
+ groupId);
+ return new
HistoryGroupResourceConfigurationView(inventoryConnHistory.extendLocatorId("View"),
+ groupComposite);
}
});
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationMembers.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationMembers.java
new file mode 100644
index 0000000..99fd567
--- /dev/null
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationMembers.java
@@ -0,0 +1,245 @@
+/*
+ * 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.configuration;
+
+import java.util.Date;
+import java.util.HashMap;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
+import com.smartgwt.client.data.Record;
+import com.smartgwt.client.types.ListGridFieldType;
+import com.smartgwt.client.widgets.grid.HoverCustomizer;
+import com.smartgwt.client.widgets.grid.ListGrid;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
+import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
+
+import org.rhq.core.domain.configuration.AbstractConfigurationUpdate;
+import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
+import org.rhq.core.domain.configuration.ResourceConfigurationUpdate;
+import org.rhq.core.domain.criteria.ResourceConfigurationUpdateCriteria;
+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.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.ErrorMessageWindow;
+import org.rhq.enterprise.gui.coregui.client.ImageManager;
+import org.rhq.enterprise.gui.coregui.client.LinkManager;
+import org.rhq.enterprise.gui.coregui.client.components.buttons.BackButton;
+import org.rhq.enterprise.gui.coregui.client.components.table.Table;
+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.util.RPCDataSource;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+
+/**
+ * Shows a table of individual resource members that belonged to the group when the group
configuration was updated.
+ *
+ * @author John Mazzitelli
+ */
+public class HistoryGroupResourceConfigurationMembers extends LocatableVLayout {
+ private final ResourceGroup group;
+ private final ResourcePermission groupPerms;
+ private final int groupUpdateId;
+
+ public HistoryGroupResourceConfigurationMembers(String locatorId,
ResourceGroupComposite groupComposite,
+ int updateId) {
+ super(locatorId);
+ this.group = groupComposite.getResourceGroup();
+ this.groupPerms = groupComposite.getResourcePermission();
+ this.groupUpdateId = updateId;
+
+ setMargin(5);
+ setMembersMargin(5);
+ String backPath =
LinkManager.getGroupResourceConfigurationUpdateHistoryLink(this.group.getId(), null);
+ BackButton backButton = new BackButton(extendLocatorId("BackButton"),
MSG.view_tableSection_backButton(),
+ backPath);
+ addMember(backButton);
+
+ MembersTable table = new MembersTable(extendLocatorId("Table"));
+ addMember(table);
+ }
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+ }
+
+ private class MembersTable extends Table<MembersTable.DataSource> {
+ public MembersTable(String locatorId) {
+ super(locatorId, MSG.view_group_resConfig_members_title());
+ setDataSource(new DataSource());
+ }
+
+ @Override
+ protected void configureTable() {
+ ListGridField fieldResource = new
ListGridField(DataSource.Field.RESOURCELINK, MSG.common_title_resource());
+ ListGridField fieldDateCreated = new
ListGridField(DataSource.Field.DATECREATED, MSG
+ .common_title_dateCreated());
+ ListGridField fieldLastUpdated = new
ListGridField(DataSource.Field.LASTUPDATED, MSG
+ .common_title_lastUpdated());
+ ListGridField fieldStatus = new ListGridField(DataSource.Field.STATUS,
MSG.common_title_status());
+ ListGridField fieldUser = new ListGridField(DataSource.Field.USER,
MSG.common_title_user());
+
+ fieldResource.setWidth("*");
+ fieldDateCreated.setWidth("15%");
+ fieldLastUpdated.setWidth("15%");
+ fieldStatus.setWidth("10%");
+ fieldUser.setWidth("10%");
+
+ fieldResource.setType(ListGridFieldType.LINK);
+ fieldResource.setTarget("_self");
+
+ fieldStatus.setType(ListGridFieldType.ICON);
+ HashMap<String, String> statusIcons = new HashMap<String,
String>(4);
+ statusIcons.put(ConfigurationUpdateStatus.SUCCESS.name(), ImageManager
+ .getResourceConfigurationIcon(ConfigurationUpdateStatus.SUCCESS));
+ statusIcons.put(ConfigurationUpdateStatus.FAILURE.name(), ImageManager
+ .getResourceConfigurationIcon(ConfigurationUpdateStatus.FAILURE));
+ statusIcons.put(ConfigurationUpdateStatus.INPROGRESS.name(), ImageManager
+ .getResourceConfigurationIcon(ConfigurationUpdateStatus.INPROGRESS));
+ statusIcons.put(ConfigurationUpdateStatus.NOCHANGE.name(), ImageManager
+ .getResourceConfigurationIcon(ConfigurationUpdateStatus.NOCHANGE));
+ fieldStatus.setValueIcons(statusIcons);
+ fieldStatus.addRecordClickHandler(new RecordClickHandler() {
+ @Override
+ public void onRecordClick(RecordClickEvent event) {
+ new ErrorMessageWindow("statusDetailsWin",
MSG.view_group_resConfig_members_statusDetails(),
+ "<pre>" + getStatusHtmlString(event.getRecord())
+ "</pre>").show();
+ }
+ });
+ fieldStatus.setShowHover(true);
+ fieldStatus.setHoverCustomizer(new HoverCustomizer() {
+ @Override
+ public String hoverHTML(Object value, ListGridRecord record, int rowNum,
int colNum) {
+ String html = getStatusHtmlString(record);
+ if (html.length() > 80) {
+ // this was probably an error stack trace, snip it so the tooltip
isn't too big
+ html = "<pre>" + html.substring(0, 80) +
"...</pre><p>"
+ + MSG.view_group_resConfig_table_clickStatusIcon() +
"</p>";
+ }
+ return html;
+ }
+ });
+
+ ListGrid listGrid = getListGrid();
+ listGrid.setFields(fieldResource, fieldDateCreated, fieldLastUpdated,
fieldStatus, fieldUser);
+ listGrid.setLinkTextProperty(DataSource.Field.RESOURCENAME);
+ }
+
+ private String getStatusHtmlString(Record record) {
+ String html = null;
+ AbstractConfigurationUpdate obj = (AbstractConfigurationUpdate) record
+ .getAttributeAsObject(DataSource.Field.OBJECT);
+ switch (obj.getStatus()) {
+ case SUCCESS: {
+ html = MSG.view_group_resConfig_members_statusSuccess();
+ break;
+ }
+ case INPROGRESS: {
+ html = MSG.view_group_resConfig_members_statusInprogress();
+ break;
+ }
+ case NOCHANGE: {
+ html = MSG.view_group_resConfig_members_statusNochange();
+ break;
+ }
+ case FAILURE: {
+ html = obj.getErrorMessage();
+ if (html == null) {
+ html = MSG.view_group_resConfig_members_statusFailure();
+ }
+ break;
+ }
+ }
+ return html;
+ }
+
+ private class DataSource extends RPCDataSource<ResourceConfigurationUpdate>
{
+
+ public class Field {
+ public static final String ID = "id";
+ public static final String RESOURCELINK = "resourceLink";
+ public static final String RESOURCENAME = "resourceName";
+ public static final String DATECREATED = "dateCreated";
+ public static final String LASTUPDATED = "lastUpdated";
+ public static final String STATUS = "status";
+ public static final String USER = "user";
+ public static final String OBJECT = "object";
+ }
+
+ @Override
+ public ResourceConfigurationUpdate copyValues(Record from) {
+ return (ResourceConfigurationUpdate)
from.getAttributeAsObject(Field.OBJECT);
+ }
+
+ @Override
+ public ListGridRecord copyValues(ResourceConfigurationUpdate from) {
+ ListGridRecord record = new ListGridRecord();
+
+ record.setAttribute(Field.ID, from.getId());
+ record.setAttribute(Field.RESOURCELINK,
LinkManager.getResourceLink(from.getResource().getId()));
+ record.setAttribute(Field.RESOURCENAME, from.getResource().getName());
+ record.setAttribute(Field.DATECREATED, new Date(from.getCreatedTime()));
+ record.setAttribute(Field.LASTUPDATED, new
Date(from.getModifiedTime()));
+ record.setAttribute(Field.USER, from.getSubjectName());
+ record.setAttribute(Field.STATUS, from.getStatus().name());
+
+ record.setAttribute(Field.OBJECT, from);
+
+ return record;
+ }
+
+ @Override
+ protected void executeFetch(final DSRequest request, final DSResponse
response) {
+ ConfigurationGWTServiceAsync configurationService =
GWTServiceLookup.getConfigurationService();
+
+ ResourceConfigurationUpdateCriteria criteria = new
ResourceConfigurationUpdateCriteria();
+ criteria
+
.addFilterGroupConfigurationUpdateId(HistoryGroupResourceConfigurationMembers.this.groupUpdateId);
+ // TODO need to disambiguate resources
+ criteria.fetchResource(true);
+
+
configurationService.findResourceConfigurationUpdatesByCriteria(criteria,
+ new
AsyncCallback<PageList<ResourceConfigurationUpdate>>() {
+
+ @Override
+ public void onSuccess(PageList<ResourceConfigurationUpdate>
result) {
+ response.setData(buildRecords(result));
+ response.setTotalRows(result.getTotalSize());
+ processResponse(request.getRequestId(), response);
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_group_resConfig_members_fetchFailure(String
+
.valueOf(HistoryGroupResourceConfigurationMembers.this.groupUpdateId)), caught);
+ response.setStatus(DSResponse.STATUS_FAILURE);
+ processResponse(request.getRequestId(), response);
+ }
+ });
+ }
+ }
+ }
+}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationSettings.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationSettings.java
new file mode 100644
index 0000000..375183a
--- /dev/null
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationSettings.java
@@ -0,0 +1,150 @@
+/*
+ * 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.configuration;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Map;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.types.Overflow;
+
+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.LinkManager;
+import org.rhq.enterprise.gui.coregui.client.components.buttons.BackButton;
+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.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.Message.Severity;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+
+/**
+ * Read only view that shows group resource configuration properties. These are
properties
+ * that are common across all members of the group.
+ *
+ * @author John Mazzitelli
+ */
+public class HistoryGroupResourceConfigurationSettings extends LocatableVLayout {
+ private final ResourceGroup group;
+ private final ResourcePermission groupPerms;
+ private final int groupUpdateId;
+ private ConfigurationDefinition configurationDefinition;
+ private List<GroupMemberConfiguration> memberConfigurations;
+ private GroupConfigurationEditor editor;
+
+ public HistoryGroupResourceConfigurationSettings(String locatorId,
ResourceGroupComposite groupComposite,
+ int updateId) {
+ super(locatorId);
+ this.group = groupComposite.getResourceGroup();
+ this.groupPerms = groupComposite.getResourcePermission();
+ this.groupUpdateId = updateId;
+
+ setMargin(5);
+ setMembersMargin(5);
+ String backPath =
LinkManager.getGroupResourceConfigurationUpdateHistoryLink(this.group.getId(), null);
+ BackButton backButton = new BackButton(extendLocatorId("BackButton"),
MSG.view_tableSection_backButton(),
+ backPath);
+ addMember(backButton);
+ }
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+ if (this.groupPerms.isInventory()) {
+ loadConfigurationDefinition();
+ loadConfigurations();
+ } else {
+ CoreGUI.getMessageCenter().notify(new
Message(MSG.view_group_resConfig_view_noperm()));
+ }
+ }
+
+ private void initEditor() {
+ if (this.configurationDefinition != null && this.memberConfigurations !=
null) {
+ this.editor = new
GroupConfigurationEditor(this.extendLocatorId("Editor"),
this.configurationDefinition,
+ this.memberConfigurations);
+ this.editor.setEditorTitle(MSG.view_group_resConfig_view_groupProperties() +
" - " + this.groupUpdateId);
+ this.editor.setOverflow(Overflow.AUTO);
+ this.editor.setReadOnly(true);
+ 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.resourceConfigurationDefinition),
+ new ResourceTypeRepository.TypesLoadedCallback() {
+ public void onTypesLoaded(Map<Integer, ResourceType> types) {
+ configurationDefinition =
types.get(type.getId()).getResourceConfigurationDefinition();
+ if (configurationDefinition == null) {
+ throw new IllegalStateException("Resource configuration
is not supported by this group.");
+ }
+ initEditor();
+ }
+ });
+ }
+ }
+
+ private void loadConfigurations() {
+ this.memberConfigurations = null;
+
GWTServiceLookup.getConfigurationService().findResourceConfigurationsForGroupUpdate(groupUpdateId,
+ new
AsyncCallback<List<DisambiguationReport<ResourceConfigurationComposite>>>()
{
+ public void onFailure(Throwable caught) {
+ if
(caught.getMessage().contains("ConfigurationUpdateStillInProgressException")) {
+ CoreGUI.getMessageCenter().notify(
+ new
Message(MSG.view_group_resConfig_members_fetchFailureConfigInProgress(), caught,
+ Severity.Info));
+ } else {
+ CoreGUI.getErrorHandler().handleError(
+
MSG.view_group_resConfig_members_fetchFailureConfig(group.toString()), 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 resource
configurations was returned by the Server.");
+ }
+ memberConfigurations.add(memberConfiguration);
+ }
+ initEditor();
+ }
+ });
+ }
+}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationTable.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationTable.java
new file mode 100644
index 0000000..38174c8
--- /dev/null
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationTable.java
@@ -0,0 +1,276 @@
+/*
+ * 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.configuration;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.EnumSet;
+import java.util.HashMap;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
+import com.smartgwt.client.data.Record;
+import com.smartgwt.client.types.ListGridFieldType;
+import com.smartgwt.client.widgets.grid.HoverCustomizer;
+import com.smartgwt.client.widgets.grid.ListGrid;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
+import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
+
+import org.rhq.core.domain.configuration.AbstractConfigurationUpdate;
+import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
+import org.rhq.core.domain.configuration.group.GroupResourceConfigurationUpdate;
+import org.rhq.core.domain.criteria.GroupResourceConfigurationUpdateCriteria;
+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.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.ErrorMessageWindow;
+import org.rhq.enterprise.gui.coregui.client.ImageManager;
+import org.rhq.enterprise.gui.coregui.client.LinkManager;
+import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
+import org.rhq.enterprise.gui.coregui.client.components.table.Table;
+import org.rhq.enterprise.gui.coregui.client.components.table.TableActionEnablement;
+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.util.RPCDataSource;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+
+/**
+ * Table showing group resource configuration history.
+ *
+ * @author John Mazzitelli
+ */
+public class HistoryGroupResourceConfigurationTable extends
Table<HistoryGroupResourceConfigurationTable.DataSource> {
+ private final ResourceGroup group;
+ private final ResourcePermission groupPerms;
+
+ public HistoryGroupResourceConfigurationTable(String locatorId,
ResourceGroupComposite groupComposite) {
+ super(locatorId, MSG.view_group_resConfig_table_title());
+ this.group = groupComposite.getResourceGroup();
+ this.groupPerms = groupComposite.getResourcePermission();
+
+ setDataSource(new DataSource());
+ }
+
+ @Override
+ protected void configureTable() {
+ ListGridField fieldId = new ListGridField(DataSource.Field.ID,
MSG.common_title_version());
+ ListGridField fieldDateCreated = new ListGridField(DataSource.Field.DATECREATED,
MSG.common_title_dateCreated());
+ ListGridField fieldLastUpdated = new ListGridField(DataSource.Field.LASTUPDATED,
MSG.common_title_lastUpdated());
+ ListGridField fieldStatus = new ListGridField(DataSource.Field.STATUS,
MSG.common_title_status());
+ ListGridField fieldUser = new ListGridField(DataSource.Field.USER,
MSG.common_title_user());
+
+ fieldId.setWidth("10%");
+ fieldDateCreated.setWidth("35%");
+ fieldLastUpdated.setWidth("35%");
+ fieldStatus.setWidth("10%");
+ fieldUser.setWidth("*");
+
+ fieldStatus.setType(ListGridFieldType.ICON);
+ HashMap<String, String> statusIcons = new HashMap<String,
String>(4);
+ statusIcons.put(ConfigurationUpdateStatus.SUCCESS.name(), ImageManager
+ .getResourceConfigurationIcon(ConfigurationUpdateStatus.SUCCESS));
+ statusIcons.put(ConfigurationUpdateStatus.FAILURE.name(), ImageManager
+ .getResourceConfigurationIcon(ConfigurationUpdateStatus.FAILURE));
+ statusIcons.put(ConfigurationUpdateStatus.INPROGRESS.name(), ImageManager
+ .getResourceConfigurationIcon(ConfigurationUpdateStatus.INPROGRESS));
+ statusIcons.put(ConfigurationUpdateStatus.NOCHANGE.name(), ImageManager
+ .getResourceConfigurationIcon(ConfigurationUpdateStatus.NOCHANGE));
+ fieldStatus.setValueIcons(statusIcons);
+ fieldStatus.addRecordClickHandler(new RecordClickHandler() {
+ @Override
+ public void onRecordClick(RecordClickEvent event) {
+ new ErrorMessageWindow("errWin", MSG.common_title_error(),
getStatusHtmlString(event.getRecord()))
+ .show();
+ }
+ });
+ fieldStatus.setShowHover(true);
+ fieldStatus.setHoverCustomizer(new HoverCustomizer() {
+ @Override
+ public String hoverHTML(Object value, ListGridRecord record, int rowNum, int
colNum) {
+ String html = getStatusHtmlString(record);
+ return html;
+ }
+ });
+
+ ListGrid listGrid = getListGrid();
+ listGrid.setFields(fieldId, fieldDateCreated, fieldLastUpdated, fieldStatus,
fieldUser);
+
+ addTableAction(extendLocatorId("deleteAction"),
MSG.common_button_delete(), MSG.common_msg_areYouSure(),
+ new AbstractTableAction(this.groupPerms.isInventory() ?
TableActionEnablement.ANY
+ : TableActionEnablement.NEVER) {
+
+ @Override
+ public void executeAction(final ListGridRecord[] selection, Object
actionValue) {
+ if (selection == null || selection.length == 0) {
+ return;
+ }
+
+ ConfigurationGWTServiceAsync service =
GWTServiceLookup.getConfigurationService();
+ Integer groupId =
HistoryGroupResourceConfigurationTable.this.group.getId();
+ Integer[] updateIds = new Integer[selection.length];
+ int i = 0;
+ for (ListGridRecord record : selection) {
+ updateIds[i++] = record.getAttributeAsInt(DataSource.Field.ID);
+ }
+
+ service.deleteGroupResourceConfigurationUpdate(groupId, updateIds,
new AsyncCallback<Void>() {
+ @Override
+ public void onSuccess(Void result) {
+ refresh();
+ Message message = new
Message(MSG.view_group_resConfig_table_deleteSuccessful(String
+ .valueOf(selection.length)), Message.Severity.Info,
EnumSet.of(
+ Message.Option.Transient, Message.Option.Sticky));
+ CoreGUI.getMessageCenter().notify(message);
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+
CoreGUI.getErrorHandler().handleError(MSG.view_group_resConfig_table_deleteFailure(),
+ caught);
+ }
+ });
+ }
+ });
+
+ addTableAction(extendLocatorId("viewSettingsAction"),
MSG.view_group_resConfig_table_viewSettings(),
+ new AbstractTableAction(TableActionEnablement.SINGLE) {
+ @Override
+ public void executeAction(ListGridRecord[] selection, Object actionValue)
{
+
CoreGUI.goToView(LinkManager.getGroupResourceConfigurationUpdateHistoryLink(
+ HistoryGroupResourceConfigurationTable.this.group.getId(), null)
+ + "/" + selection[0].getAttribute(DataSource.Field.ID)
+ "/Settings");
+ }
+ });
+
+ addTableAction(extendLocatorId("viewMemberHistoryAction"),
MSG.view_group_resConfig_table_viewMemberHistory(),
+ new AbstractTableAction(TableActionEnablement.SINGLE) {
+ @Override
+ public void executeAction(ListGridRecord[] selection, Object actionValue)
{
+
CoreGUI.goToView(LinkManager.getGroupResourceConfigurationUpdateHistoryLink(
+ HistoryGroupResourceConfigurationTable.this.group.getId(), null)
+ + "/" + selection[0].getAttribute(DataSource.Field.ID)
+ "/Members");
+ }
+ });
+
+ }
+
+ private String getStatusHtmlString(Record record) {
+ String html = null;
+ AbstractConfigurationUpdate obj = (AbstractConfigurationUpdate) record
+ .getAttributeAsObject(DataSource.Field.OBJECT);
+ switch (obj.getStatus()) {
+ case SUCCESS: {
+ html = MSG.view_group_resConfig_table_statusSuccess();
+ break;
+ }
+ case INPROGRESS: {
+ html = "<p>" +
MSG.view_group_resConfig_table_statusInprogress() + "</p><p>"
+ + MSG.view_group_resConfig_table_msg1() + "</p>";
+ break;
+ }
+ case NOCHANGE: {
+ html = MSG.view_group_resConfig_table_statusNochange();
+ break;
+ }
+ case FAILURE: {
+ html = obj.getErrorMessage();
+ if (html == null) {
+ html = "<p>" +
MSG.view_group_resConfig_table_statusFailure() + "</p><p>"
+ + MSG.view_group_resConfig_table_msg1() + "</p>";
+ } else {
+ if (html.length() > 80) {
+ // this was probably an error stack trace, snip it so the tooltip
isn't too big
+ html = "<pre>" + html.substring(0, 80) +
"...</pre><p>"
+ + MSG.view_group_resConfig_table_clickStatusIcon() +
"</p>";
+ } else {
+ html = "<pre>" + html + "</pre>";
+ }
+ html = html + "<p>" +
MSG.view_group_resConfig_table_msg1() + "</p>";
+ }
+ break;
+ }
+ }
+ return html;
+ }
+
+ class DataSource extends RPCDataSource<GroupResourceConfigurationUpdate> {
+
+ public class Field {
+ public static final String ID = "id";
+ public static final String DATECREATED = "dateCreated";
+ public static final String LASTUPDATED = "lastUpdated";
+ public static final String STATUS = "status";
+ public static final String USER = "user";
+ public static final String OBJECT = "object";
+ }
+
+ @Override
+ public GroupResourceConfigurationUpdate copyValues(Record from) {
+ return (GroupResourceConfigurationUpdate)
from.getAttributeAsObject(DataSource.Field.OBJECT);
+ }
+
+ @Override
+ public ListGridRecord copyValues(GroupResourceConfigurationUpdate from) {
+ ListGridRecord record = new ListGridRecord();
+
+ record.setAttribute(Field.ID, from.getId());
+ record.setAttribute(Field.DATECREATED, new Date(from.getCreatedTime()));
+ record.setAttribute(Field.LASTUPDATED, new Date(from.getModifiedTime()));
+ record.setAttribute(Field.STATUS, from.getStatus().name());
+ record.setAttribute(Field.USER, from.getSubjectName());
+
+ record.setAttribute(Field.OBJECT, from);
+
+ return record;
+ }
+
+ @Override
+ protected void executeFetch(final DSRequest request, final DSResponse response)
{
+ ConfigurationGWTServiceAsync configurationService =
GWTServiceLookup.getConfigurationService();
+
+ GroupResourceConfigurationUpdateCriteria criteria = new
GroupResourceConfigurationUpdateCriteria();
+ ArrayList<Integer> groupList = new ArrayList<Integer>(1);
+ groupList.add(HistoryGroupResourceConfigurationTable.this.group.getId());
+ criteria.addFilterResourceGroupIds(groupList);
+
+
configurationService.findGroupResourceConfigurationUpdatesByCriteria(criteria,
+ new
AsyncCallback<PageList<GroupResourceConfigurationUpdate>>() {
+
+ @Override
+ public void
onSuccess(PageList<GroupResourceConfigurationUpdate> result) {
+ response.setData(buildRecords(result));
+ response.setTotalRows(result.getTotalSize());
+ processResponse(request.getRequestId(), response);
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+
CoreGUI.getErrorHandler().handleError(MSG.view_group_resConfig_table_failFetch(),
caught);
+ response.setStatus(DSResponse.STATUS_FAILURE);
+ processResponse(request.getRequestId(), response);
+ }
+ });
+ }
+ }
+}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationView.java
new file mode 100644
index 0000000..0d8b76a
--- /dev/null
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationView.java
@@ -0,0 +1,86 @@
+/*
+ * 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.configuration;
+
+import com.smartgwt.client.widgets.Canvas;
+
+import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
+import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
+import org.rhq.enterprise.gui.coregui.client.ViewPath;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+
+/**
+ * A view for group resource configuration history.
+ *
+ * @author John Mazzitelli
+ */
+public class HistoryGroupResourceConfigurationView extends LocatableVLayout implements
BookmarkableView {
+ private final ResourceGroupComposite groupComposite;
+ private HistoryGroupResourceConfigurationTable groupHistoryTable;
+ private Canvas detailsCanvas = null;
+
+ public HistoryGroupResourceConfigurationView(String locatorId, ResourceGroupComposite
groupComposite) {
+ super(locatorId);
+ this.groupComposite = groupComposite;
+
+ groupHistoryTable = new
HistoryGroupResourceConfigurationTable(extendLocatorId("Table"),
groupComposite);
+ addMember(groupHistoryTable);
+ }
+
+ @Override
+ public void renderView(ViewPath viewPath) {
+ if (viewPath.isEnd()) {
+ setVisibleMember(this.groupHistoryTable);
+ } else {
+ // the details view can be one of two: the "Settings" view which
shows the group config properties themselves
+ // or "Members" view which shows a tabular set of data, one history
row for each individual resource in the group
+ // the syntax is "/#####/{Settings,Members}" where ##### is the
group history ID
+ int groupHistoryId = viewPath.getCurrentAsInt();
+ viewPath.next();
+ boolean configView = false;
+ if (viewPath.isEnd()) {
+ configView = true; // if nothing follows the ID, the default view to show
is the config properties
+ } else {
+ String currentPath = viewPath.getCurrent().getPath();
+ if ("Settings".equals(currentPath)) { // do not i18n this
string, its a URL fragment
+ configView = true;
+ } else if ("Members".equals(currentPath)) { // do not i18n this
string, its a URL fragment
+ configView = false;
+ } else {
+ throw new IllegalArgumentException("Cannot render page - invalid
URL: " + currentPath);
+ }
+ }
+
+ if (detailsCanvas != null) {
+ removeMember(detailsCanvas);
+ this.detailsCanvas.destroy();
+ }
+
+ if (configView) {
+ detailsCanvas = new
HistoryGroupResourceConfigurationSettings(extendLocatorId("SettingsView"),
+ this.groupComposite, groupHistoryId);
+ } else {
+ detailsCanvas = new
HistoryGroupResourceConfigurationMembers(extendLocatorId("MembersView"),
+ this.groupComposite, groupHistoryId);
+ }
+ addMember(detailsCanvas);
+ setVisibleMember(detailsCanvas);
+ }
+ }
+}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationMembers.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationMembers.java
index b7ca5fc..2af2fcf 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationMembers.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationMembers.java
@@ -26,10 +26,6 @@ import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.ListGridFieldType;
-import com.smartgwt.client.types.Overflow;
-import com.smartgwt.client.widgets.Window;
-import com.smartgwt.client.widgets.events.CloseClickHandler;
-import com.smartgwt.client.widgets.events.CloseClientEvent;
import com.smartgwt.client.widgets.grid.HoverCustomizer;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
@@ -46,6 +42,7 @@ import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.ErrorMessageWindow;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
import org.rhq.enterprise.gui.coregui.client.LinkManager;
import org.rhq.enterprise.gui.coregui.client.components.buttons.BackButton;
@@ -53,12 +50,10 @@ import org.rhq.enterprise.gui.coregui.client.components.table.Table;
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.util.RPCDataSource;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHTMLPane;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
/**
- * Shows a table of individual resource members that belonged to the group when the group
plugin configuration was updated.
+ * Shows a table of individual resource members that belonged to the group when the group
configuration was updated.
*
* @author John Mazzitelli
*/
@@ -89,7 +84,7 @@ public class HistoryGroupPluginConfigurationMembers extends
LocatableVLayout {
super.onDraw();
}
- private class MembersTable extends Table {
+ private class MembersTable extends Table<MembersTable.DataSource> {
public MembersTable(String locatorId) {
super(locatorId, MSG.view_group_pluginConfig_members_title());
setDataSource(new DataSource());
@@ -97,17 +92,19 @@ public class HistoryGroupPluginConfigurationMembers extends
LocatableVLayout {
@Override
protected void configureTable() {
- ListGridField fieldResource = new ListGridField("resourceLink",
MSG.common_title_resource());
- ListGridField fieldDateCreated = new ListGridField("dateCreated",
MSG.common_title_dateCreated());
- ListGridField fieldLastUpdated = new ListGridField("lastUpdated",
MSG.common_title_lastUpdated());
- ListGridField fieldUser = new ListGridField("user",
MSG.common_title_user());
- ListGridField fieldStatus = new ListGridField("status",
MSG.common_title_status());
+ ListGridField fieldResource = new
ListGridField(DataSource.Field.RESOURCELINK, MSG.common_title_resource());
+ ListGridField fieldDateCreated = new
ListGridField(DataSource.Field.DATECREATED, MSG
+ .common_title_dateCreated());
+ ListGridField fieldLastUpdated = new
ListGridField(DataSource.Field.LASTUPDATED, MSG
+ .common_title_lastUpdated());
+ ListGridField fieldStatus = new ListGridField(DataSource.Field.STATUS,
MSG.common_title_status());
+ ListGridField fieldUser = new ListGridField(DataSource.Field.USER,
MSG.common_title_user());
fieldResource.setWidth("*");
fieldDateCreated.setWidth("15%");
fieldLastUpdated.setWidth("15%");
- fieldUser.setWidth("10%");
fieldStatus.setWidth("10%");
+ fieldUser.setWidth("10%");
fieldResource.setType(ListGridFieldType.LINK);
fieldResource.setTarget("_self");
@@ -126,34 +123,8 @@ public class HistoryGroupPluginConfigurationMembers extends
LocatableVLayout {
fieldStatus.addRecordClickHandler(new RecordClickHandler() {
@Override
public void onRecordClick(RecordClickEvent event) {
- final Window winModal = new
LocatableWindow(HistoryGroupPluginConfigurationMembers.this
- .extendLocatorId("statusDetailsWin"));
-
winModal.setTitle(MSG.view_group_pluginConfig_members_statusDetails());
- winModal.setOverflow(Overflow.VISIBLE);
- winModal.setShowMinimizeButton(false);
- winModal.setShowMaximizeButton(true);
- winModal.setIsModal(true);
- winModal.setShowModalMask(true);
- winModal.setAutoSize(true);
- winModal.setAutoCenter(true);
- winModal.setShowResizer(true);
- winModal.setCanDragResize(true);
- winModal.centerInPage();
- winModal.addCloseClickHandler(new CloseClickHandler() {
- @Override
- public void onCloseClick(CloseClientEvent event) {
- winModal.markForDestroy();
- }
- });
-
- LocatableHTMLPane htmlPane = new
LocatableHTMLPane(HistoryGroupPluginConfigurationMembers.this
- .extendLocatorId("statusDetailsPane"));
- htmlPane.setMargin(10);
- htmlPane.setDefaultWidth(500);
- htmlPane.setDefaultHeight(400);
- htmlPane.setContents("<pre>" +
getStatusHtmlString(event.getRecord()) + "</pre>");
- winModal.addItem(htmlPane);
- winModal.show();
+ new ErrorMessageWindow("statusDetailsWin",
MSG.view_group_pluginConfig_members_statusDetails(),
+ "<pre>" + getStatusHtmlString(event.getRecord())
+ "</pre>").show();
}
});
fieldStatus.setShowHover(true);
@@ -171,15 +142,14 @@ public class HistoryGroupPluginConfigurationMembers extends
LocatableVLayout {
});
ListGrid listGrid = getListGrid();
- listGrid.setFields(fieldResource, fieldDateCreated, fieldLastUpdated,
fieldUser, fieldStatus);
-
- listGrid.setLinkTextProperty("resourceName");
-
+ listGrid.setFields(fieldResource, fieldDateCreated, fieldLastUpdated,
fieldStatus, fieldUser);
+ listGrid.setLinkTextProperty(DataSource.Field.RESOURCENAME);
}
private String getStatusHtmlString(Record record) {
String html = null;
- AbstractConfigurationUpdate obj = (AbstractConfigurationUpdate)
record.getAttributeAsObject("object");
+ AbstractConfigurationUpdate obj = (AbstractConfigurationUpdate) record
+ .getAttributeAsObject(DataSource.Field.OBJECT);
switch (obj.getStatus()) {
case SUCCESS: {
html = MSG.view_group_pluginConfig_members_statusSuccess();
@@ -206,24 +176,35 @@ public class HistoryGroupPluginConfigurationMembers extends
LocatableVLayout {
private class DataSource extends RPCDataSource<PluginConfigurationUpdate>
{
+ public class Field {
+ public static final String ID = "id";
+ public static final String RESOURCELINK = "resourceLink";
+ public static final String RESOURCENAME = "resourceName";
+ public static final String DATECREATED = "dateCreated";
+ public static final String LASTUPDATED = "lastUpdated";
+ public static final String STATUS = "status";
+ public static final String USER = "user";
+ public static final String OBJECT = "object";
+ }
+
@Override
public PluginConfigurationUpdate copyValues(Record from) {
- return (PluginConfigurationUpdate)
from.getAttributeAsObject("object");
+ return (PluginConfigurationUpdate)
from.getAttributeAsObject(Field.OBJECT);
}
@Override
public ListGridRecord copyValues(PluginConfigurationUpdate from) {
ListGridRecord record = new ListGridRecord();
- record.setAttribute("id", from.getId());
- record.setAttribute("resourceLink",
LinkManager.getResourceLink(from.getResource().getId()));
- record.setAttribute("resourceName",
from.getResource().getName());
- record.setAttribute("dateCreated", new
Date(from.getCreatedTime()));
- record.setAttribute("lastUpdated", new
Date(from.getModifiedTime()));
- record.setAttribute("user", from.getSubjectName());
- record.setAttribute("status", from.getStatus().name());
+ record.setAttribute(Field.ID, from.getId());
+ record.setAttribute(Field.RESOURCELINK,
LinkManager.getResourceLink(from.getResource().getId()));
+ record.setAttribute(Field.RESOURCENAME, from.getResource().getName());
+ record.setAttribute(Field.DATECREATED, new Date(from.getCreatedTime()));
+ record.setAttribute(Field.LASTUPDATED, new
Date(from.getModifiedTime()));
+ record.setAttribute(Field.USER, from.getSubjectName());
+ record.setAttribute(Field.STATUS, from.getStatus().name());
- record.setAttribute("object", from);
+ record.setAttribute(Field.OBJECT, from);
return record;
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationTable.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationTable.java
index e4d5c78..fe975f2 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationTable.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationTable.java
@@ -28,10 +28,6 @@ import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.ListGridFieldType;
-import com.smartgwt.client.types.Overflow;
-import com.smartgwt.client.widgets.Window;
-import com.smartgwt.client.widgets.events.CloseClickHandler;
-import com.smartgwt.client.widgets.events.CloseClientEvent;
import com.smartgwt.client.widgets.grid.HoverCustomizer;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
@@ -48,6 +44,7 @@ import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.ErrorMessageWindow;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
import org.rhq.enterprise.gui.coregui.client.LinkManager;
import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
@@ -57,15 +54,13 @@ 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.util.RPCDataSource;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHTMLPane;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
/**
* Table showing group plugin configuration history.
*
* @author John Mazzitelli
*/
-public class HistoryGroupPluginConfigurationTable extends Table {
+public class HistoryGroupPluginConfigurationTable extends
Table<HistoryGroupPluginConfigurationTable.DataSource> {
private final ResourceGroup group;
private final ResourcePermission groupPerms;
@@ -79,17 +74,17 @@ public class HistoryGroupPluginConfigurationTable extends Table {
@Override
protected void configureTable() {
- ListGridField fieldId = new ListGridField("id",
MSG.common_title_version());
- ListGridField fieldDateCreated = new ListGridField("dateCreated",
MSG.common_title_dateCreated());
- ListGridField fieldLastUpdated = new ListGridField("lastUpdated",
MSG.common_title_lastUpdated());
- ListGridField fieldUser = new ListGridField("user",
MSG.common_title_user());
- ListGridField fieldStatus = new ListGridField("status",
MSG.common_title_status());
+ ListGridField fieldId = new ListGridField(DataSource.Field.ID,
MSG.common_title_version());
+ ListGridField fieldDateCreated = new ListGridField(DataSource.Field.DATECREATED,
MSG.common_title_dateCreated());
+ ListGridField fieldLastUpdated = new ListGridField(DataSource.Field.LASTUPDATED,
MSG.common_title_lastUpdated());
+ ListGridField fieldStatus = new ListGridField(DataSource.Field.STATUS,
MSG.common_title_status());
+ ListGridField fieldUser = new ListGridField(DataSource.Field.USER,
MSG.common_title_user());
fieldId.setWidth("10%");
fieldDateCreated.setWidth("35%");
fieldLastUpdated.setWidth("35%");
- fieldUser.setWidth("*");
fieldStatus.setWidth("10%");
+ fieldUser.setWidth("*");
fieldStatus.setType(ListGridFieldType.ICON);
HashMap<String, String> statusIcons = new HashMap<String,
String>(4);
@@ -105,34 +100,8 @@ public class HistoryGroupPluginConfigurationTable extends Table {
fieldStatus.addRecordClickHandler(new RecordClickHandler() {
@Override
public void onRecordClick(RecordClickEvent event) {
- final Window winModal = new
LocatableWindow(HistoryGroupPluginConfigurationTable.this
- .extendLocatorId("statusDetailsWin"));
- winModal.setTitle(MSG.view_group_pluginConfig_table_statusDetails());
- winModal.setOverflow(Overflow.VISIBLE);
- winModal.setShowMinimizeButton(false);
- winModal.setShowMaximizeButton(true);
- winModal.setIsModal(true);
- winModal.setShowModalMask(true);
- winModal.setAutoSize(true);
- winModal.setAutoCenter(true);
- winModal.setShowResizer(true);
- winModal.setCanDragResize(true);
- winModal.centerInPage();
- winModal.addCloseClickHandler(new CloseClickHandler() {
- @Override
- public void onCloseClick(CloseClientEvent event) {
- winModal.markForDestroy();
- }
- });
-
- LocatableHTMLPane htmlPane = new
LocatableHTMLPane(HistoryGroupPluginConfigurationTable.this
- .extendLocatorId("statusDetailsPane"));
- htmlPane.setMargin(10);
- htmlPane.setDefaultWidth(500);
- htmlPane.setDefaultHeight(400);
- htmlPane.setContents(getStatusHtmlString(event.getRecord()));
- winModal.addItem(htmlPane);
- winModal.show();
+ new ErrorMessageWindow("errWin", MSG.common_title_error(),
getStatusHtmlString(event.getRecord()))
+ .show();
}
});
fieldStatus.setShowHover(true);
@@ -145,7 +114,7 @@ public class HistoryGroupPluginConfigurationTable extends Table {
});
ListGrid listGrid = getListGrid();
- listGrid.setFields(fieldId, fieldDateCreated, fieldLastUpdated, fieldUser,
fieldStatus);
+ listGrid.setFields(fieldId, fieldDateCreated, fieldLastUpdated, fieldStatus,
fieldUser);
addTableAction(extendLocatorId("deleteAction"),
MSG.common_button_delete(), MSG.common_msg_areYouSure(),
new AbstractTableAction(this.groupPerms.isInventory() ?
TableActionEnablement.ANY
@@ -162,7 +131,7 @@ public class HistoryGroupPluginConfigurationTable extends Table {
Integer[] updateIds = new Integer[selection.length];
int i = 0;
for (ListGridRecord record : selection) {
- updateIds[i++] = record.getAttributeAsInt("id");
+ updateIds[i++] = record.getAttributeAsInt(DataSource.Field.ID);
}
service.deleteGroupPluginConfigurationUpdate(groupId, updateIds, new
AsyncCallback<Void>() {
@@ -190,7 +159,7 @@ public class HistoryGroupPluginConfigurationTable extends Table {
public void executeAction(ListGridRecord[] selection, Object actionValue)
{
CoreGUI.goToView(LinkManager.getGroupPluginConfigurationUpdateHistoryLink(
HistoryGroupPluginConfigurationTable.this.group.getId(), null)
- + "/" + selection[0].getAttribute("id") +
"/Settings");
+ + "/" + selection[0].getAttribute(DataSource.Field.ID)
+ "/Settings");
}
});
@@ -200,7 +169,7 @@ public class HistoryGroupPluginConfigurationTable extends Table {
public void executeAction(ListGridRecord[] selection, Object actionValue) {
CoreGUI.goToView(LinkManager.getGroupPluginConfigurationUpdateHistoryLink(
HistoryGroupPluginConfigurationTable.this.group.getId(), null)
- + "/" + selection[0].getAttribute("id") +
"/Members");
+ + "/" + selection[0].getAttribute(DataSource.Field.ID) +
"/Members");
}
});
@@ -208,7 +177,8 @@ public class HistoryGroupPluginConfigurationTable extends Table {
private String getStatusHtmlString(Record record) {
String html = null;
- AbstractConfigurationUpdate obj = (AbstractConfigurationUpdate)
record.getAttributeAsObject("object");
+ AbstractConfigurationUpdate obj = (AbstractConfigurationUpdate) record
+ .getAttributeAsObject(DataSource.Field.OBJECT);
switch (obj.getStatus()) {
case SUCCESS: {
html = MSG.view_group_pluginConfig_table_statusSuccess();
@@ -244,24 +214,33 @@ public class HistoryGroupPluginConfigurationTable extends Table {
return html;
}
- private class DataSource extends RPCDataSource<GroupPluginConfigurationUpdate>
{
+ class DataSource extends RPCDataSource<GroupPluginConfigurationUpdate> {
+
+ public class Field {
+ public static final String ID = "id";
+ public static final String DATECREATED = "dateCreated";
+ public static final String LASTUPDATED = "lastUpdated";
+ public static final String STATUS = "status";
+ public static final String USER = "user";
+ public static final String OBJECT = "object";
+ }
@Override
public GroupPluginConfigurationUpdate copyValues(Record from) {
- return (GroupPluginConfigurationUpdate)
from.getAttributeAsObject("object");
+ return (GroupPluginConfigurationUpdate)
from.getAttributeAsObject(DataSource.Field.OBJECT);
}
@Override
public ListGridRecord copyValues(GroupPluginConfigurationUpdate from) {
ListGridRecord record = new ListGridRecord();
- record.setAttribute("id", from.getId());
- record.setAttribute("dateCreated", new
Date(from.getCreatedTime()));
- record.setAttribute("lastUpdated", new
Date(from.getModifiedTime()));
- record.setAttribute("user", from.getSubjectName());
- record.setAttribute("status", from.getStatus().name());
+ record.setAttribute(Field.ID, from.getId());
+ record.setAttribute(Field.DATECREATED, new Date(from.getCreatedTime()));
+ record.setAttribute(Field.LASTUPDATED, new Date(from.getModifiedTime()));
+ record.setAttribute(Field.STATUS, from.getStatus().name());
+ record.setAttribute(Field.USER, from.getSubjectName());
- record.setAttribute("object", from);
+ record.setAttribute(Field.OBJECT, from);
return record;
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
index e30b1f1..336206b 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
@@ -278,11 +278,31 @@ public class ConfigurationGWTServiceImpl extends
AbstractGWTServiceImpl implemen
}
@Override
+ public List<DisambiguationReport<ResourceConfigurationComposite>>
findResourceConfigurationsForGroupUpdate(
+ int groupUpdateId) throws RuntimeException {
+ try {
+ Map<Integer, Configuration> configurations = this.configurationManager
+ .getResourceConfigurationMapForGroupUpdate(getSessionSubject(),
groupUpdateId);
+ List<ResourceConfigurationComposite> configurationComposites =
convertToCompositesList(configurations);
+
+ // Disambiguate - i.e. generate unambiguous Resource names for each of the
Resource id's.
+ List<DisambiguationReport<ResourceConfigurationComposite>>
disambiguatedConfigurationComposites = resourceManager
+ .disambiguate(configurationComposites,
RESOURCE_CONFIGURATION_COMPOSITE_RESOURCE_ID_EXTRACTOR,
+ DefaultDisambiguationUpdateStrategies.getDefault());
+
+ return SerialUtility.prepare(disambiguatedConfigurationComposites,
+
"ConfigurationService.findResourceConfigurationsForGroupUpdate");
+ } catch (Throwable t) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(t));
+ }
+ }
+
+ @Override
public List<DisambiguationReport<ResourceConfigurationComposite>>
findPluginConfigurationsForGroupUpdate(
int groupUpdateId) throws RuntimeException {
try {
Map<Integer, Configuration> configurations = this.configurationManager
- .getPluginConfigurationMapForGroupUpdate(groupUpdateId);
+ .getPluginConfigurationMapForGroupUpdate(getSessionSubject(),
groupUpdateId);
List<ResourceConfigurationComposite> configurationComposites =
convertToCompositesList(configurations);
// Disambiguate - i.e. generate unambiguous Resource names for each of the
Resource id's.
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 f6d806d..d6db964 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
@@ -1733,6 +1733,32 @@ view_group_resConfig_edit_saveInitiated_full = The group
configuration updates h
view_group_resConfig_edit_saveFailure = Failed to initiate group configuration update for
[{0}] compatible group named [{1}]
view_group_resConfig_edit_valid = All configuration properties have valid values, so the
configuration can now be saved
view_group_resConfig_edit_invalid = The following configuration properties have invalid
values and must be corrected before the configuration can be saved: [{0}]
+
+view_group_resConfig_view_noperm = You do not have permissions to see the resource
configuration settings
+view_group_resConfig_view_groupProperties = Group Properties
+view_group_resConfig_table_title = Group Resource Configuration History
+view_group_resConfig_table_statusDetails = Status Details
+view_group_resConfig_table_viewSettings = View Settings
+view_group_resConfig_table_viewMemberHistory = View Member History
+view_group_resConfig_table_msg1 = View Member History for status of each individual
resource
+view_group_resConfig_table_failFetch = Failed to get group resource config history
+view_group_resConfig_table_deleteSuccessful = You have deleted [{0}] history items
+view_group_resConfig_table_deleteFailure = Failed to delete group resource config
history
+view_group_resConfig_table_statusSuccess = This group configuration update was
successful
+view_group_resConfig_table_statusInprogress = This group configuration update is still in
progress
+view_group_resConfig_table_statusNochange = No changes were made to this group
configuration
+view_group_resConfig_table_statusFailure = This group configuration update failed
+view_group_resConfig_table_clickStatusIcon = Click the status icon for full details
+view_group_resConfig_members_title = Group Resource Configuration Member Histories
+view_group_resConfig_members_fetchFailure = Failed to get resource config update history
for members of group [{0}]
+view_group_resConfig_members_fetchFailureConfig = Failed to retrieve member resource
configuration settings for [{0}]
+view_group_resConfig_members_fetchFailureConfigInProgress = A group resource
configuration update is currently in progress. You must wait until the update is finished
before you can view the group settings.
+view_group_resConfig_members_statusDetails = Status Details
+view_group_resConfig_members_statusSuccess = This configuration update was successful
+view_group_resConfig_members_statusInprogress = This configuration update is still in
progress
+view_group_resConfig_members_statusNochange = No changes were made to this configuration
+view_group_resConfig_members_statusFailure = This configuration update failed for an
unknown reason
+
view_group_pluginConfig_view_noperm = You do not have permissions to see the connection
settings
view_group_pluginConfig_view_groupProperties = Group Properties
view_group_pluginConfig_table_failFetch = Failed to get group plugin config history
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/group/ViewGroupConnectionPropertyDetailsUIBean.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/group/ViewGroupConnectionPropertyDetailsUIBean.java
index 5f3229d..dd463a3 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/group/ViewGroupConnectionPropertyDetailsUIBean.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/group/ViewGroupConnectionPropertyDetailsUIBean.java
@@ -22,14 +22,14 @@ import java.util.Map;
import javax.faces.model.DataModel;
-import org.rhq.core.domain.configuration.composite.ConfigurationUpdateComposite;
+import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.composite.ConfigurationUpdateComposite;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.gui.util.FacesContextUtility;
import org.rhq.core.gui.configuration.propset.ConfigurationSet;
+import org.rhq.core.gui.util.FacesContextUtility;
import org.rhq.enterprise.gui.common.framework.PagedDataTableUIBean;
import org.rhq.enterprise.gui.common.paging.PageControlView;
import org.rhq.enterprise.gui.common.paging.PagedListDataModel;
@@ -39,7 +39,7 @@ import org.rhq.enterprise.server.util.LookupUtil;
public class ViewGroupConnectionPropertyDetailsUIBean extends PagedDataTableUIBean {
public static final String MANAGED_BEAN_NAME =
"ViewGroupConnectionPropertyDetailsUIBean";
- public static final String VIEW_ID =
"/rhq/group/inventory/view-plugin-configuration-update-details.xhtml";
+ public static final String VIEW_ID =
"/rhq/group/inventory/view-plugin-configuration-update-details.xhtml";
private ResourceGroup resourceGroup;
private Map<Integer, Configuration> pluginConfigurations;
@@ -63,8 +63,8 @@ public class ViewGroupConnectionPropertyDetailsUIBean extends
PagedDataTableUIBe
ResourceGroup group = EnterpriseFacesContextUtility.getResourceGroup();
int groupPluginConfigurationUpdateId =
getPluginResourceConfigurationUpdateId();
- this.pluginConfigurations = this.configurationManager
-
.getPluginConfigurationMapForGroupUpdate(groupPluginConfigurationUpdateId);
+ this.pluginConfigurations =
this.configurationManager.getPluginConfigurationMapForGroupUpdate(subject,
+ groupPluginConfigurationUpdateId);
this.configurationSet =
GroupPluginConfigurationUtility.buildConfigurationSet(subject, group,
this.pluginConfigurations);
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
index 1552162..41c2a58 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
@@ -1801,9 +1801,12 @@ public class ConfigurationManagerBean implements
ConfigurationManagerLocal, Conf
groupIdParameter);
}
- // TODO: THIS NEEDS AUTHZ CHECK!
@SuppressWarnings("unchecked")
- public Map<Integer, Configuration>
getPluginConfigurationMapForGroupUpdate(Integer groupPluginConfigurationUpdateId) {
+ public Map<Integer, Configuration>
getPluginConfigurationMapForGroupUpdate(Subject subject,
+ Integer groupPluginConfigurationUpdateId) {
+ // this method will perform the CONFIGURE_READ security check for us, no need to
keep reference to result
+ getGroupPluginConfigurationUpdate(subject, groupPluginConfigurationUpdateId);
+
Tuple<String, Object> groupIdParameter = new Tuple<String,
Object>("groupConfigurationUpdateId",
groupPluginConfigurationUpdateId);
return
executeGetConfigurationMapQuery(Configuration.QUERY_GET_PLUGIN_CONFIG_MAP_BY_GROUP_UPDATE_ID,
100,
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
index 018b6eb..29e1cb1 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
@@ -415,7 +415,8 @@ public interface ConfigurationManagerLocal {
Map<Integer, Configuration> getPluginConfigurationsForCompatibleGroup(Subject
subject, int groupId)
throws ConfigurationUpdateStillInProgressException, Exception;
- Map<Integer, Configuration> getPluginConfigurationMapForGroupUpdate(Integer
groupPluginConfigurationUpdateId);
+ Map<Integer, Configuration> getPluginConfigurationMapForGroupUpdate(Subject
subject,
+ Integer groupPluginConfigurationUpdateId);
/**
* The purpose of this method is really to clean up requests when we detect
commit c433f882c4d966a9e876d95bb08b5017459a4cc4
Merge: cc8fc60... 9fb84ad...
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 1 16:04:20 2011 -0500
Merge commit 'origin/master' into group-config-history
commit cc8fc603342b7b3acd9f69965c1934ea4d960cff
Merge: 68206c8... 8b3cd4e...
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 1 13:12:06 2011 -0500
Merge commit 'origin/master' into group-config-history
commit 68206c8f090db0124c2be476442cc4f13f7e6a36
Merge: 41c1e1f... f1f4426...
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 1 10:40:42 2011 -0500
Merge commit 'origin/master' into group-config-history
commit 41c1e1ff0358ba46be80defce3ede2bd5c385e3f
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Feb 28 15:36:23 2011 -0500
rename view class so it is consistent with the names of the group/indiv
resource/plugin config edit views
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 9b2ad10..a137250 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
@@ -55,7 +55,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.CurrentGroupPluginConfigurationView;
+import
org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.inventory.GroupPluginConfigurationEditView;
import
org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.inventory.HistoryGroupPluginConfigurationView;
import
org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.inventory.MembersView;
import
org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.monitoring.schedules.SchedulesView;
@@ -337,7 +337,7 @@ public class ResourceGroupDetailView extends
AbstractTwoLevelTabSetView<Resource
true, new ViewFactory() {
@Override
public Canvas createView() {
- return new
CurrentGroupPluginConfigurationView(inventoryConn.extendLocatorId("View"),
+ return new
GroupPluginConfigurationEditView(inventoryConn.extendLocatorId("View"),
groupComposite);
}
});
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/CurrentGroupPluginConfigurationView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/CurrentGroupPluginConfigurationView.java
deleted file mode 100644
index f64b74e..0000000
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/CurrentGroupPluginConfigurationView.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * 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.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.message.Message.Severity;
-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 current plugin configuration.
- *
- * @author Ian Springer
- * @author John Mazzitelli
- */
-public class CurrentGroupPluginConfigurationView 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;
-
- private boolean refreshing = false;
-
- public CurrentGroupPluginConfigurationView(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.setExtraSpace(10);
- toolStrip.setMembersMargin(5);
- toolStrip.setLayoutMargin(5);
-
- this.saveButton = new LocatableIButton(this.extendLocatorId("Save"),
MSG.common_button_save());
- this.saveButton.setTooltip(MSG.view_group_pluginConfig_edit_saveTooltip());
- 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(MSG.view_group_pluginConfig_edit_noperm(),
Message.Severity.Info, EnumSet.of(
- Message.Option.Transient, Message.Option.Sticky));
- CoreGUI.getMessageCenter().notify(message);
- }
- }
-
- @Override
- public void refresh() {
- if (this.refreshing) {
- return; // we are already in the process of refreshing, don't do it
again
- }
-
- this.refreshing = true;
- 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.setEditorTitle(MSG.view_group_pluginConfig_edit_currentGroupProperties());
- this.editor.setOverflow(Overflow.AUTO);
- this.editor.addPropertyValueChangeListener(this);
- this.editor.setReadOnly(!this.resourcePermission.isConfigureWrite());
- addMember(this.editor);
- this.refreshing = false;
- }
- }
-
- 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) {
- refreshing = false;
- if
(caught.getMessage().contains("ConfigurationUpdateStillInProgressException")) {
- CoreGUI.getMessageCenter().notify(
- new
Message(MSG.view_group_pluginConfig_members_fetchFailureConnInProgress(), caught,
- Severity.Info));
- } else {
- CoreGUI.getErrorHandler().handleError(
-
MSG.view_group_pluginConfig_members_fetchFailureConn(group.toString()), 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) {
- String typeName = group.getResourceType().getName();
- CoreGUI.getErrorHandler().handleError(
- MSG.view_group_pluginConfig_edit_saveFailure(typeName,
group.getName()), caught);
- }
-
- public void onSuccess(Void result) {
- CoreGUI.getMessageCenter().notify(
- new
Message(MSG.view_group_pluginConfig_edit_saveInitiated_concise(), MSG
-
.view_group_pluginConfig_edit_saveInitiated_full(group.getResourceType().getName(), 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(MSG.view_group_pluginConfig_edit_valid(),
Message.Severity.Info, EnumSet.of(
- Message.Option.Transient, Message.Option.Sticky));
- } else {
- this.saveButton.disable();
- message = new
Message(MSG.view_group_pluginConfig_edit_invalid(invalidPropertyNames.toString()),
- 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/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..973c371
--- /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,249 @@
+/*
+ * 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.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.message.Message.Severity;
+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 current plugin configuration.
+ *
+ * @author Ian Springer
+ * @author John Mazzitelli
+ */
+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;
+
+ private boolean refreshing = false;
+
+ 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.setExtraSpace(10);
+ toolStrip.setMembersMargin(5);
+ toolStrip.setLayoutMargin(5);
+
+ this.saveButton = new LocatableIButton(this.extendLocatorId("Save"),
MSG.common_button_save());
+ this.saveButton.setTooltip(MSG.view_group_pluginConfig_edit_saveTooltip());
+ 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(MSG.view_group_pluginConfig_edit_noperm(),
Message.Severity.Info, EnumSet.of(
+ Message.Option.Transient, Message.Option.Sticky));
+ CoreGUI.getMessageCenter().notify(message);
+ }
+ }
+
+ @Override
+ public void refresh() {
+ if (this.refreshing) {
+ return; // we are already in the process of refreshing, don't do it
again
+ }
+
+ this.refreshing = true;
+ 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.setEditorTitle(MSG.view_group_pluginConfig_edit_currentGroupProperties());
+ this.editor.setOverflow(Overflow.AUTO);
+ this.editor.addPropertyValueChangeListener(this);
+ this.editor.setReadOnly(!this.resourcePermission.isConfigureWrite());
+ addMember(this.editor);
+ this.refreshing = false;
+ }
+ }
+
+ 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) {
+ refreshing = false;
+ if
(caught.getMessage().contains("ConfigurationUpdateStillInProgressException")) {
+ CoreGUI.getMessageCenter().notify(
+ new
Message(MSG.view_group_pluginConfig_members_fetchFailureConnInProgress(), caught,
+ Severity.Info));
+ } else {
+ CoreGUI.getErrorHandler().handleError(
+
MSG.view_group_pluginConfig_members_fetchFailureConn(group.toString()), 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) {
+ String typeName = group.getResourceType().getName();
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_group_pluginConfig_edit_saveFailure(typeName,
group.getName()), caught);
+ }
+
+ public void onSuccess(Void result) {
+ CoreGUI.getMessageCenter().notify(
+ new
Message(MSG.view_group_pluginConfig_edit_saveInitiated_concise(), MSG
+
.view_group_pluginConfig_edit_saveInitiated_full(group.getResourceType().getName(), 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(MSG.view_group_pluginConfig_edit_valid(),
Message.Severity.Info, EnumSet.of(
+ Message.Option.Transient, Message.Option.Sticky));
+ } else {
+ this.saveButton.disable();
+ message = new
Message(MSG.view_group_pluginConfig_edit_invalid(invalidPropertyNames.toString()),
+ Message.Severity.Error, EnumSet.of(Message.Option.Transient,
Message.Option.Sticky));
+ }
+ messageCenter.notify(message);
+ } else {
+ this.saveButton.enable();
+ }
+ }
+}