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@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@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@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@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@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@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(); + } + } +}