/*
* 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.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.common.EntityContext;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.resource.ResourceAncestryFormat;
import org.rhq.core.domain.resource.ResourceType;
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.coregui.client.CoreGUI;
import org.rhq.coregui.client.LinkManager;
import org.rhq.coregui.client.components.buttons.BackButton;
import org.rhq.coregui.client.components.configuration.GroupConfigurationEditor;
import org.rhq.coregui.client.components.configuration.GroupMemberConfiguration;
import org.rhq.coregui.client.gwt.GWTServiceLookup;
import org.rhq.coregui.client.inventory.resource.type.ResourceTypeRepository;
import org.rhq.coregui.client.util.enhanced.EnhancedVLayout;
import org.rhq.coregui.client.util.message.Message;
import org.rhq.coregui.client.util.message.Message.Severity;
/**
* 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 EnhancedVLayout {
private final ResourceGroup group;
private final ResourcePermission groupPerms;
private final int groupUpdateId;
private ConfigurationDefinition configurationDefinition;
private List<GroupMemberConfiguration> memberConfigurations;
private GroupConfigurationEditor editor;
public HistoryGroupResourceConfigurationSettings(ResourceGroupComposite groupComposite, int updateId) {
super();
this.group = groupComposite.getResourceGroup();
this.groupPerms = groupComposite.getResourcePermission();
this.groupUpdateId = updateId;
setMargin(5);
setMembersMargin(5);
String backPath = LinkManager.getGroupResourceConfigurationUpdateHistoryLink(
EntityContext.forGroup(this.group), null);
BackButton backButton = new 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.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<Map<Integer, Configuration>>() {
public void onFailure(Throwable caught) {
handleLoadFailure(caught);
}
public void onSuccess(final Map<Integer, Configuration> configMap) {
final Integer[] resourceIds = configMap.keySet().toArray(new Integer[configMap.size()]);
GWTServiceLookup.getResourceService().getResourcesAncestry(resourceIds,
ResourceAncestryFormat.EXTENDED, new AsyncCallback<Map<Integer, String>>() {
public void onFailure(Throwable caught) {
handleLoadFailure(caught);
}
public void onSuccess(Map<Integer, String> labelMap) {
memberConfigurations = new ArrayList<GroupMemberConfiguration>(configMap.size());
for (Integer resourceId : resourceIds) {
String label = labelMap.get(resourceId);
Configuration configuration = configMap.get(resourceId);
GroupMemberConfiguration memberConfiguration = new GroupMemberConfiguration(
resourceId, label, configuration);
if (configuration == null || configuration.getProperties().isEmpty()) {
throw new RuntimeException(
"The server did not return the configuration for one or more member resources.");
}
memberConfigurations.add(memberConfiguration);
}
initEditor();
}
});
}
});
}
private void handleLoadFailure(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);
}
}
}