modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGroupGWTService.java | 23 + modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java | 38 ++ modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeView.java | 111 ++++---- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/ResourceGroupMembershipView.java | 129 ++++++++++ modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/ResourceGroupResourceSelector.java | 45 +++ modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/OverviewView.java | 9 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateStep.java | 50 --- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateWizard.java | 17 - modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupMembersStep.java | 7 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java | 4 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java | 9 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 3 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java | 4 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGroupGWTServiceImpl.java | 64 +++- modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/cluster/ClusterManagerBean.java | 45 +-- modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java | 45 ++- modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerLocal.java | 26 +- 17 files changed, 420 insertions(+), 209 deletions(-)
New commits: commit c7986f9c539a6f93002eb02a846692ed09ddcc10 Author: Jay Shaughnessy jshaughn@redhat.com Date: Fri Sep 17 17:44:30 2010 -0400
Work on Group CRUD - Group category now determined on the fly, a la group def calculation, by group membership. This means a manually group can change category in its lifetime by editing the membership. That may be less important than the fact that it simplifies initial creation and users really only have to care about adding members. - Added basic support for mixed-group tree/detail view. Just enough to get us moving. - Added Inventory->Membership subtab for changing group members. - Changed ResourceManagerLocal.ensureMembershipMatches() to .setMembership() The name is cleaner and in line with naming for a series of new calls that simply syncs associated data to be the set passed in. Also, optionally can reset the group's category based on the membership change. - A couple of locatorId fixes in touched files -
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGroupGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGroupGWTService.java index c4a4bca..333427f 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGroupGWTService.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGroupGWTService.java @@ -34,23 +34,26 @@ import org.rhq.core.domain.util.PageList; @RemoteServiceRelativePath("ResourceGroupGWTService") public interface ResourceGroupGWTService extends RemoteService {
- PageList<ResourceGroup> findResourceGroupsByCriteria(ResourceGroupCriteria criteria); + GroupDefinition createGroupDefinition(GroupDefinition groupDefinition);
- PageList<ResourceGroupComposite> findResourceGroupCompositesByCriteria(ResourceGroupCriteria criteria); + ResourceGroup createResourceGroup(ResourceGroup group, int[] resourceIds);
- PageList<GroupDefinition> findGroupDefinitionsByCriteria(ResourceGroupDefinitionCriteria criteria); + void deleteGroupDefinitions(int[] groupDefinitionIds);
- void ensureMembershipMatches(int groupId, int[] resourceIds); + void deleteResourceGroups(int[] groupIds);
- ResourceGroup createResourceGroup(ResourceGroup group, int[] resourceIds); + PageList<GroupDefinition> findGroupDefinitionsByCriteria(ResourceGroupDefinitionCriteria criteria);
- void deleteResourceGroups(int[] groupIds); + PageList<ResourceGroup> findResourceGroupsByCriteria(ResourceGroupCriteria criteria);
- void updateResourceGroup(ResourceGroup group); + PageList<ResourceGroupComposite> findResourceGroupCompositesByCriteria(ResourceGroupCriteria criteria); + + void setMembership(int groupId, int[] resourceIds, boolean setType);
void updateGroupDefinition(GroupDefinition groupDefinition);
- void deleteGroupDefinitions(int[] groupDefinitionIds); + void updateResourceGroup(ResourceGroup group);
- GroupDefinition createGroupDefinition(GroupDefinition groupDefinition); -} + void updateResourceGroup(ResourceGroup group, boolean updateMembership); + +} \ No newline at end of file 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 128dff8..6603a00 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 @@ -45,6 +45,7 @@ import org.rhq.enterprise.gui.coregui.client.components.tab.TwoLevelTab; 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.inventory.ResourceGroupMembershipView; import org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.monitoring.schedules.SchedulesView; import org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.monitoring.traits.TraitsView; import org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.summary.OverviewView; @@ -52,10 +53,9 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSearchVi import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
/** - * Right panel of the group view. + * Be able to view members as a resource list, or edit members via selector. * - * @author Greg Hinkle - * @author Ian Springer + * @author Jay Shaughnessy */ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<ResourceGroupComposite, ResourceGroupTitleBar> { private static final String BASE_VIEW_PATH = "ResourceGroup"; @@ -83,6 +83,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource private SubTab monitorCallTime; private SubTab inventoryMembers; private SubTab inventoryConn; + private SubTab inventoryMembership; private SubTab opHistory; private SubTab opSched; private SubTab alertHistory; @@ -91,12 +92,24 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource private SubTab configHistory; private SubTab eventHistory;
+ private String currentTab; + private String currentSubTab; + public ResourceGroupDetailView(String locatorId) { super(locatorId, BASE_VIEW_PATH); }
@Override public Integer getSelectedItemId() { + // if moving from membership subtab then re-load the detail view as the membership and + // group type may have changed. + if (this.inventoryTab.getTitle().equals(currentTab) + && this.inventoryMembership.getTitle().equals(currentSubTab)) { + this.currentTab = null; + this.currentSubTab = null; + this.groupId = null; + } + return this.groupId; }
@@ -130,7 +143,8 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource "/images/icons/Inventory_grey_16.png"); inventoryMembers = new SubTab(inventoryTab.extendLocatorId("Members"), "Members", null); inventoryConn = new SubTab(inventoryTab.extendLocatorId("ConnectionSettings"), "Connection Settings", null); - inventoryTab.registerSubTabs(this.inventoryMembers, this.inventoryConn); + inventoryMembership = new SubTab(inventoryTab.extendLocatorId("Membership"), "Membership", null); + inventoryTab.registerSubTabs(this.inventoryMembers, this.inventoryConn, this.inventoryMembership); tabs.add(inventoryTab);
operationsTab = new TwoLevelTab(getTabSet().extendLocatorId("Operations"), "Operations", @@ -184,9 +198,12 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource this.monitorSched.setCanvas(new SchedulesView(this.monitoringTab.extendLocatorId("SchedulesView"), groupId)); this.monitorCallTime.setCanvas(new FullHTMLPane("/rhq/group/monitor/response-plain.xhtml?groupId=" + groupId));
- this.inventoryMembers.setCanvas(ResourceSearchView.getMembersOf(groupId)); + this.inventoryMembers.setCanvas(ResourceSearchView.getMembersOf(this.inventoryTab + .extendLocatorId("MembersView"), groupId)); // TODO: Uncomment this once the group config component is done. //this.inventoryConn.setCanvas(new GroupPluginConfigurationEditView(this.group.getId(), this.group.getResourceType().getId(), ConfigurationEditor.ConfigType.plugin)); + this.inventoryMembership.setCanvas(new ResourceGroupMembershipView(this.inventoryTab + .extendLocatorId("MembershipView"), groupId));
this.opHistory.setCanvas(new FullHTMLPane("/rhq/group/operation/groupOperationHistory-plain.xhtml?groupId=" + groupId)); @@ -290,6 +307,9 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource }); } }); + } else { + updateTabContent(groupComposite); + selectTab(getTabName(), getSubTabName(), viewPath); } }
@@ -305,4 +325,12 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource } return false; } + + @Override + public void selectTab(String tabTitle, String subtabTitle, ViewPath viewPath) { + currentTab = tabTitle; + currentSubTab = subtabTitle; + super.selectTab(tabTitle, subtabTitle, viewPath); + } + } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeView.java index aa2ee61..ba57920 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeView.java @@ -43,6 +43,7 @@ import com.smartgwt.client.widgets.tree.events.NodeContextClickHandler; import org.rhq.core.domain.criteria.ResourceGroupCriteria; import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.resource.group.ClusterKey; +import org.rhq.core.domain.resource.group.GroupCategory; import org.rhq.core.domain.resource.group.ResourceGroup; import org.rhq.core.domain.resource.group.composite.ClusterFlyweight; import org.rhq.core.domain.resource.group.composite.ClusterKeyFlyweight; @@ -89,14 +90,11 @@ public class ResourceGroupTreeView extends VLayout implements BookmarkableView { treeGrid.setSortField("name"); treeGrid.setShowHeader(false);
- addMember(this.treeGrid);
- contextMenu = new ResourceGroupTreeContextMenu(); treeGrid.setContextMenu(contextMenu);
- treeGrid.addSelectionChangedHandler(new SelectionChangedHandler() { @Override public void onSelectionChanged(SelectionEvent selectionEvent) { @@ -141,17 +139,29 @@ public class ResourceGroupTreeView extends VLayout implements BookmarkableView { criteria.fetchResourceType(true);
GWTServiceLookup.getResourceGroupService().findResourceGroupsByCriteria(criteria, - new AsyncCallback<PageList<ResourceGroup>>() { - @Override - public void onFailure(Throwable caught) { - CoreGUI.getErrorHandler().handleError("Failed to load group", caught); - } - - @Override - public void onSuccess(PageList<ResourceGroup> result) { - ResourceGroup group = result.get(0); - ResourceGroupTreeView.this.selectedGroup = group; + new AsyncCallback<PageList<ResourceGroup>>() { + @Override + public void onFailure(Throwable caught) { + CoreGUI.getErrorHandler().handleError("Failed to load group", caught); + }
+ @Override + public void onSuccess(PageList<ResourceGroup> result) { + ResourceGroup group = result.get(0); + ResourceGroupTreeView.this.selectedGroup = group; + + if (GroupCategory.MIXED == group.getGroupCategory()) { + ResourceGroupTreeView.this.rootResourceGroup = group; + ResourceGroupTreeView.this.rootGroupId = rootResourceGroup.getId(); + TreeNode fakeRoot = new TreeNode("fakeRootNode"); + TreeNode rootNode = new TreeNode(rootResourceGroup.getName()); + rootNode.setID(String.valueOf(rootResourceGroup.getId())); //getClusterKey().toString()); + fakeRoot.setChildren(new TreeNode[] { rootNode }); + Tree tree = new Tree(); + tree.setRoot(fakeRoot); + treeGrid.setData(tree); + treeGrid.markForRedraw(); + } else { if (group.getClusterResourceGroup() == null) { ResourceGroupTreeView.this.rootResourceGroup = group; // This is a straight up group @@ -164,12 +174,12 @@ public class ResourceGroupTreeView extends VLayout implements BookmarkableView {
loadGroup(rootGroup.getId()); } - } - });
- } + } + });
+ }
private void loadGroup(int groupId) {
@@ -193,19 +203,17 @@ public class ResourceGroupTreeView extends VLayout implements BookmarkableView { treeGrid.selectRecord(selectedNode); }
- } else { this.rootGroupId = groupId; - GWTServiceLookup.getClusterService().getClusterTree(groupId, - new AsyncCallback<ClusterFlyweight>() { - public void onFailure(Throwable caught) { - CoreGUI.getErrorHandler().handleError("Failed to load tree", caught); - } + GWTServiceLookup.getClusterService().getClusterTree(groupId, new AsyncCallback<ClusterFlyweight>() { + public void onFailure(Throwable caught) { + CoreGUI.getErrorHandler().handleError("Failed to load tree", caught); + }
- public void onSuccess(ClusterFlyweight result) { - loadTreeTypes(result); - } - }); + public void onSuccess(ClusterFlyweight result) { + loadTreeTypes(result); + } + }); }
} @@ -215,60 +223,54 @@ public class ResourceGroupTreeView extends VLayout implements BookmarkableView { typeIds.add(this.rootResourceGroup.getResourceType().getId()); getTreeTypes(root, typeIds);
- ResourceTypeRepository.Cache.getInstance().getResourceTypes( - typeIds.toArray(new Integer[typeIds.size()]), - new ResourceTypeRepository.TypesLoadedCallback() { - @Override - public void onTypesLoaded(HashMap<Integer, ResourceType> types) { - ResourceGroupTreeView.this.typeMap = types; - loadTree(root); - } + ResourceTypeRepository.Cache.getInstance().getResourceTypes(typeIds.toArray(new Integer[typeIds.size()]), + new ResourceTypeRepository.TypesLoadedCallback() { + @Override + public void onTypesLoaded(HashMap<Integer, ResourceType> types) { + ResourceGroupTreeView.this.typeMap = types; + loadTree(root); } - ); + }); }
- private void selectClusterGroup(ClusterKey key) {
GWTServiceLookup.getClusterService().createAutoClusterBackingGroup(key, true, - new AsyncCallback<ResourceGroup>() { - @Override - public void onFailure(Throwable caught) { - CoreGUI.getErrorHandler().handleError("Failed to create or update auto cluster group", caught); - } + new AsyncCallback<ResourceGroup>() { + @Override + public void onFailure(Throwable caught) { + CoreGUI.getErrorHandler().handleError("Failed to create or update auto cluster group", caught); + }
- @Override - public void onSuccess(ResourceGroup result) { - int groupId = result.getId(); - History.newItem("ResourceGroup/" + groupId); - } - }); + @Override + public void onSuccess(ResourceGroup result) { + int groupId = result.getId(); + History.newItem("ResourceGroup/" + groupId); + } + });
}
private void loadTree(ClusterFlyweight root) { TreeNode fakeRoot = new TreeNode("fakeRootNode");
- TreeNode rootNode = new TreeNode(rootResourceGroup.getName()); rootNode.setID(String.valueOf(root.getGroupId())); //getClusterKey().toString()); + ResourceType rootResourceType = typeMap.get(rootResourceGroup.getResourceType().getId()); rootNode.setAttribute("resourceType", rootResourceType); String icon = "types/" + rootResourceType.getCategory().getDisplayName() + "_up_16.png"; rootNode.setIcon(icon);
- fakeRoot.setChildren(new TreeNode[]{rootNode}); + fakeRoot.setChildren(new TreeNode[] { rootNode });
ClusterKey rootKey = new ClusterKey(root.getGroupId()); loadTree(rootNode, root, rootKey);
- - Tree tree = new Tree();
tree.setRoot(fakeRoot);
- treeGrid.setData(tree); treeGrid.markForRedraw(); } @@ -286,7 +288,8 @@ public class ResourceGroupTreeView extends VLayout implements BookmarkableView { TreeNode node = new TreeNode(child.getName());
ClusterKeyFlyweight keyFlyweight = child.getClusterKey(); - ClusterKey key = new ClusterKey(parentKey, keyFlyweight.getResourceTypeId(), keyFlyweight.getResourceKey()); + ClusterKey key = new ClusterKey(parentKey, keyFlyweight.getResourceTypeId(), keyFlyweight + .getResourceKey());
ResourceType type = this.typeMap.get(keyFlyweight.getResourceTypeId());
@@ -294,7 +297,6 @@ public class ResourceGroupTreeView extends VLayout implements BookmarkableView {
node.setIcon(icon);
- node.setID(key.getKey()); node.setAttribute("key", key); node.setAttribute("resourceType", type); @@ -317,7 +319,6 @@ public class ResourceGroupTreeView extends VLayout implements BookmarkableView { setSelectedGroup(groupId); }
- private void getTreeTypes(ClusterFlyweight clusterFlyweight, Set<Integer> typeIds) { if (clusterFlyweight.getClusterKey() != null) { typeIds.add(clusterFlyweight.getClusterKey().getResourceTypeId()); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/ResourceGroupMembershipView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/ResourceGroupMembershipView.java new file mode 100644 index 0000000..e08b57d --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/ResourceGroupMembershipView.java @@ -0,0 +1,129 @@ +/* + * 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.HashSet; + +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.smartgwt.client.types.Overflow; +import com.smartgwt.client.widgets.IButton; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.layout.LayoutSpacer; +import com.smartgwt.client.widgets.toolbar.ToolStrip; + +import org.rhq.core.domain.criteria.ResourceGroupCriteria; +import org.rhq.core.domain.resource.group.ResourceGroup; +import org.rhq.core.domain.util.PageList; +import org.rhq.enterprise.gui.coregui.client.CoreGUI; +import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; +import org.rhq.enterprise.gui.coregui.client.util.message.Message; +import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIButton; +import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout; + +/** + * @author Jay Shaughnessy + */ +public class ResourceGroupMembershipView extends LocatableVLayout { + + private int resourceGroupId; + private ResourceGroup resourceGroup; + private ResourceGroupResourceSelector selector; + + public ResourceGroupMembershipView(String locatorId, int resourceGroupId) { + super(locatorId); + + this.resourceGroupId = resourceGroupId; + } + + @Override + protected void onDraw() { + super.onDraw(); + + build(); + } + + public void build() { + ToolStrip toolStrip = new ToolStrip(); + toolStrip.setWidth100(); + + toolStrip.addMember(new LayoutSpacer()); + + IButton saveButton = new LocatableIButton(this.extendLocatorId("Save"), "Save"); + saveButton.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent clickEvent) { + save(); + } + }); + + toolStrip.addMember(saveButton); + this.addMember(toolStrip); + + ResourceGroupCriteria c = new ResourceGroupCriteria(); + c.addFilterId(this.resourceGroupId); + c.fetchExplicitResources(true); + GWTServiceLookup.getResourceGroupService().findResourceGroupsByCriteria(c, + new AsyncCallback<PageList<ResourceGroup>>() { + public void onFailure(Throwable caught) { + CoreGUI.getErrorHandler().handleError("Failed to fetch Resource Group", caught); + } + + public void onSuccess(PageList<ResourceGroup> result) { + ResourceGroupMembershipView.this.resourceGroup = result.get(0); + ResourceGroupMembershipView.this.selector = new ResourceGroupResourceSelector( + ResourceGroupMembershipView.this.getLocatorId(), ResourceGroupMembershipView.this.resourceGroup + .getExplicitResources()); + ResourceGroupMembershipView.this.selector.setOverflow(Overflow.AUTO); + + addMember(ResourceGroupMembershipView.this.selector); + } + }); + } + + private void save() { + int[] resourceIds = getSelectedResourceIds(); + + GWTServiceLookup.getResourceGroupService().setMembership(this.resourceGroup.getId(), resourceIds, true, + new AsyncCallback<Void>() { + public void onFailure(Throwable caught) { + CoreGUI.getErrorHandler().handleError("Failed to update configuration", caught); + } + + public void onSuccess(Void result) { + CoreGUI.getMessageCenter().notify( + new Message("Group membership updated for [" + + ResourceGroupMembershipView.this.resourceGroup.getName() + "]", Message.Severity.Info)); + CoreGUI.refresh(); + } + }); + } + + private int[] getSelectedResourceIds() { + int[] selection = new int[this.selector.getSelection().size()]; + HashSet<Integer> selectedIds = this.selector.getSelection(); + int i = 0; + for (Integer id : selectedIds) { + selection[i++] = id; + } + + return selection; + } + +} \ No newline at end of file diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/ResourceGroupResourceSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/ResourceGroupResourceSelector.java new file mode 100644 index 0000000..6bc96fb --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/ResourceGroupResourceSelector.java @@ -0,0 +1,45 @@ +/* + * 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, version 2, as + * published by the Free Software Foundation, and/or the GNU Lesser + * General Public License, version 2.1, also as published by the Free + * Software Foundation. + * + * 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 and the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * and the GNU Lesser General Public License along with this program; + * if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.inventory; + +import java.util.Collection; + +import com.smartgwt.client.widgets.grid.ListGridRecord; + +import org.rhq.core.domain.resource.Resource; +import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDatasource; +import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.ResourceSelector; + +/** + * @author Jay Shaughnessy + */ +public class ResourceGroupResourceSelector extends ResourceSelector { + + public ResourceGroupResourceSelector(String locatorId, Collection<Resource> resources) { + super(locatorId); + if (null != resources) { + ListGridRecord[] data = (new ResourceDatasource()).buildRecords(resources); + setAssigned(data); + } + } +} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/OverviewView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/OverviewView.java index 41aff20..2c3f364 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/OverviewView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/OverviewView.java @@ -91,7 +91,7 @@ public class OverviewView extends LocatableVLayout { return; } group.setName(newName); - OverviewView.this.resourceGroupService.updateResourceGroup(group, new AsyncCallback<Void>() { + OverviewView.this.resourceGroupService.updateResourceGroup(group, false, new AsyncCallback<Void>() { public void onFailure(Throwable caught) { CoreGUI.getErrorHandler().handleError( "Failed to change name of Resource group with id " + group.getId() + " from "" @@ -141,7 +141,7 @@ public class OverviewView extends LocatableVLayout { return; } group.setDescription(newDescription); - OverviewView.this.resourceGroupService.updateResourceGroup(group, new AsyncCallback<Void>() { + OverviewView.this.resourceGroupService.updateResourceGroup(group, false, new AsyncCallback<Void>() { public void onFailure(Throwable caught) { CoreGUI.getErrorHandler().handleError( "Failed to change description of Resource group with id " + group.getId() + " from "" @@ -177,7 +177,7 @@ public class OverviewView extends LocatableVLayout { return; } group.setLocation(newLocation); - OverviewView.this.resourceGroupService.updateResourceGroup(group, new AsyncCallback<Void>() { + OverviewView.this.resourceGroupService.updateResourceGroup(group, false, new AsyncCallback<Void>() { public void onFailure(Throwable caught) { CoreGUI.getErrorHandler().handleError( "Failed to change location of Resource group with id " + group.getId() + " from "" @@ -224,7 +224,8 @@ public class OverviewView extends LocatableVLayout { StaticTextItem groupDefinitionItem = new StaticTextItem("groupDefinition", "Group Definition"); GroupDefinition groupDefinition = group.getGroupDefinition(); String groupDefinitionUrl = LinkManager.getGroupDefinitionLink(groupDefinition.getId()); - groupDefinitionItem.setValue("<a href="" + groupDefinitionUrl + "">" + groupDefinition.getName() + "</a>"); + groupDefinitionItem + .setValue("<a href="" + groupDefinitionUrl + "">" + groupDefinition.getName() + "</a>"); formItems.add(groupDefinitionItem); }
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateStep.java index f06f6ae..6b4664a 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateStep.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateStep.java @@ -22,22 +22,16 @@ */ package org.rhq.enterprise.gui.coregui.client.inventory.groups.wizard;
-import java.util.LinkedHashMap; - import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.ValuesManager; import com.smartgwt.client.widgets.form.fields.AutoFitTextAreaItem; import com.smartgwt.client.widgets.form.fields.CheckboxItem; -import com.smartgwt.client.widgets.form.fields.IPickTreeItem; import com.smartgwt.client.widgets.form.fields.TextAreaItem; import com.smartgwt.client.widgets.form.fields.TextItem;
-import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.resource.group.ResourceGroup; -import org.rhq.enterprise.gui.coregui.client.components.form.RadioGroupWithComponentsItem; import org.rhq.enterprise.gui.coregui.client.components.wizard.AbstractWizardStep; -import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypePluginTreeDataSource; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
/** @@ -68,42 +62,14 @@ public class GroupCreateStep extends AbstractWizardStep {
CheckboxItem recursive = new CheckboxItem("recursive", "Recursive");
- LinkedHashMap<String, Canvas> options = new LinkedHashMap<String, Canvas>(); - options.put("Mixed", null); - - IPickTreeItem typeSelectItem = new IPickTreeItem("type", "Type"); - typeSelectItem.setDataSource(new ResourceTypePluginTreeDataSource()); - typeSelectItem.setValueField("id"); - typeSelectItem.setCanSelectParentItems(true); - typeSelectItem.setLoadDataOnDemand(false); - typeSelectItem.setEmptyMenuMessage("Loading..."); - typeSelectItem.setShowIcons(true); - - DynamicForm form2 = new LocatableDynamicForm("TypeTree"); - form2.setValuesManager(form.getValuesManager()); - form2.setFields(typeSelectItem); - options.put("Compatible", form2); - - RadioGroupWithComponentsItem kind = new RadioGroupWithComponentsItem("groupType", "Group Type", options, - form); - kind.setValue("Mixed"); - form.setFields(name, description, location, recursive, kind); - + form.setFields(name, description, location, recursive); } + return form; }
public boolean nextPage() { - boolean valid = form.validate(); - if (valid) { - RadioGroupWithComponentsItem kind = (RadioGroupWithComponentsItem) form.getField("groupType"); - if ("Compatible".equals(kind.getSelected())) { - DynamicForm form2 = (DynamicForm) kind.getSelectedComponent(); - valid = (null != form2.getValue("type")); - } - } - - return valid; + return form.validate(); }
public String getName() { @@ -116,16 +82,6 @@ public class GroupCreateStep extends AbstractWizardStep { group.setLocation(form.getValueAsString("location")); group.setRecursive(form.getValue("recursive") != null ? true : false);
- RadioGroupWithComponentsItem kind = (RadioGroupWithComponentsItem) form.getField("groupType"); - if ("Compatible".equals(kind.getSelected())) { - DynamicForm form2 = (DynamicForm) kind.getSelectedComponent(); - if (null != form2.getValue("type")) { - ResourceType rt = new ResourceType(); - rt.setId(Integer.parseInt(form2.getValueAsString("type"))); - group.setResourceType(rt); - } - } - return group; } } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateWizard.java index a55b334..fbbf71e 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateWizard.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateWizard.java @@ -28,7 +28,6 @@ import java.util.List; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.widgets.IButton;
-import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.resource.group.ResourceGroup; import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.components.wizard.AbstractWizard; @@ -67,23 +66,11 @@ public class GroupCreateWizard extends AbstractWizard { }
public String getSubtitle() { - return null; // TODO: Implement this method. + return null; }
public List<IButton> getCustomButtons(int step) { - return null; // TODO: Implement this method. - } - - /** - * @return only the rt id is set - */ - public ResourceType getCompatibleGroupResourceType() { - ResourceGroup rg = createStep.getGroup(); - ResourceType rt = null; - if (null != rg) { - rt = rg.getResourceType(); - } - return rt; + return null; }
public void cancel() { diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupMembersStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupMembersStep.java index 3a3048d..2e3e9c7 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupMembersStep.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupMembersStep.java @@ -26,7 +26,6 @@ import java.util.HashSet;
import com.smartgwt.client.widgets.Canvas;
-import org.rhq.core.domain.resource.ResourceType; import org.rhq.enterprise.gui.coregui.client.components.wizard.AbstractWizardStep; import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.ResourceSelector;
@@ -37,18 +36,14 @@ public class GroupMembersStep extends AbstractWizardStep {
private GroupCreateWizard wizard = null; private ResourceSelector selector = null; - private ResourceType requireType = null;
public GroupMembersStep(GroupCreateWizard wizard) { this.wizard = wizard; }
public Canvas getCanvas() { - ResourceType rt = wizard.getCompatibleGroupResourceType(); - if ((selector == null) || (rt != requireType)) { + if (selector == null) { selector = new ResourceSelector(getName()); - requireType = rt; - selector.setRequireType(rt); } return selector; } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java index faa406e..ed442b2 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java @@ -57,8 +57,8 @@ public class InventoryView extends LocatableHLayout implements BookmarkableView private static final String SECTION_GROUPS = "Groups"; private static final String SECTION_RESOURCES = "Resources";
- private static final String SUBSECTION_RESOURCE_INVENTORY = "Resource Inventory"; - private static final String SUBSECTION_GROUP_INVENTORY = "Group Inventory"; + private static final String SUBSECTION_RESOURCE_INVENTORY = "Resources"; + private static final String SUBSECTION_GROUP_INVENTORY = "Groups"; private static final String SUBSECTION_SAVED_SEARCHES = "Saved Searches";
private static final String PAGE_ADQ = "Discovery Manager"; diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java index 9817819..71f1996 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java @@ -182,14 +182,13 @@ public class ResourceSearchView extends Table {
// -------- Static Utility loaders ------------
- public static ResourceSearchView getChildrenOf(int resourceId) { - return new ResourceSearchView("ResourceSearchChildren", new Criteria("parentId", String.valueOf(resourceId)), + public static ResourceSearchView getChildrenOf(String locatorId, int resourceId) { + return new ResourceSearchView(locatorId, new Criteria("parentId", String.valueOf(resourceId)), "Child Resources"); }
- public static ResourceSearchView getMembersOf(int groupId) { - return new ResourceSearchView("ResourceSearchMemberOf", new Criteria("groupId", String.valueOf(groupId)), - "Member Resources"); + public static ResourceSearchView getMembersOf(String locatorId, int groupId) { + return new ResourceSearchView(locatorId, new Criteria("groupId", String.valueOf(groupId)), "Member Resources"); }
} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java index 2edb50f..e80be32 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java @@ -207,7 +207,8 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo this.monitorCallTime.setCanvas(new FullHTMLPane("/rhq/resource/monitor/response-plain.xhtml?id=" + resource.getId()));
- this.inventoryChildren.setCanvas(ResourceSearchView.getChildrenOf(resource.getId())); + this.inventoryChildren.setCanvas(ResourceSearchView.getChildrenOf(this.extendLocatorId("Children"), resource + .getId())); this.inventoryConn.setCanvas(new PluginConfigurationEditView(this.extendLocatorId("PluginConfig"), resource));
// comment out GWT-based operation history until... diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java index e9f773d..b1ad07f 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java @@ -49,8 +49,8 @@ public class ResourceSelector extends AbstractSelector<Resource> {
private ResourceType requireType;
- public ResourceSelector(String id) { - super(id); + public ResourceSelector(String locatorId) { + super(locatorId); }
public ResourceType getRequireType() { diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGroupGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGroupGWTServiceImpl.java index b2ec813..b9642d6 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGroupGWTServiceImpl.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGroupGWTServiceImpl.java @@ -18,6 +18,7 @@ */ package org.rhq.enterprise.gui.coregui.server.gwt;
+import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.criteria.ResourceGroupCriteria; import org.rhq.core.domain.criteria.ResourceGroupDefinitionCriteria; import org.rhq.core.domain.resource.group.GroupDefinition; @@ -36,34 +37,57 @@ import org.rhq.enterprise.server.util.LookupUtil; */ public class ResourceGroupGWTServiceImpl extends AbstractGWTServiceImpl implements ResourceGroupGWTService {
+ private static final long serialVersionUID = 1L; + private ResourceGroupManagerLocal groupManager = LookupUtil.getResourceGroupManager(); private GroupDefinitionManagerLocal definitionManager = LookupUtil.getGroupDefinitionManager();
public PageList<ResourceGroup> findResourceGroupsByCriteria(ResourceGroupCriteria criteria) { - return SerialUtility.prepare(groupManager.findResourceGroupsByCriteria(getSessionSubject(), criteria), - "ResourceGroupService.findResourceGroupsByCriteria"); + try { + PageList<ResourceGroup> groups = groupManager.findResourceGroupsByCriteria(getSessionSubject(), criteria); + return SerialUtility.prepare(groups, "ResourceGroupService.findResourceGroupsByCriteria"); + } catch (Throwable t) { + throw new RuntimeException(ThrowableUtil.getAllMessages(t)); + } }
public PageList<ResourceGroupComposite> findResourceGroupCompositesByCriteria(ResourceGroupCriteria criteria) { - return SerialUtility.prepare(groupManager.findResourceGroupCompositesByCriteria(getSessionSubject(), criteria), - "ResourceGroupService.findResourceGroupCompositesByCriteria"); + try { + PageList<ResourceGroupComposite> composites = groupManager.findResourceGroupCompositesByCriteria( + getSessionSubject(), criteria); + return SerialUtility.prepare(composites, "ResourceGroupService.findResourceGroupCompositesByCriteria"); + } catch (Throwable t) { + throw new RuntimeException(ThrowableUtil.getAllMessages(t)); + } }
public PageList<GroupDefinition> findGroupDefinitionsByCriteria(ResourceGroupDefinitionCriteria criteria) { - return SerialUtility.prepare(definitionManager.findGroupDefinitionsByCriteria(getSessionSubject(), criteria), - "ResourceGroupService.findGroupDefinitionsByCriteria"); + try { + PageList<GroupDefinition> definitions = definitionManager.findGroupDefinitionsByCriteria( + getSessionSubject(), criteria); + return SerialUtility.prepare(definitions, "ResourceGroupService.findGroupDefinitionsByCriteria"); + } catch (Throwable t) { + throw new RuntimeException(ThrowableUtil.getAllMessages(t)); + } }
- public void ensureMembershipMatches(int groupId, int[] resourceIds) { - groupManager.ensureMembershipMatches(getSessionSubject(), groupId, resourceIds); + public void setMembership(int groupId, int[] resourceIds, boolean setType) { + try { + groupManager.setMembership(getSessionSubject(), groupId, resourceIds, setType); + } catch (Throwable t) { + throw new RuntimeException(ThrowableUtil.getAllMessages(t)); + } }
public ResourceGroup createResourceGroup(ResourceGroup group, int[] resourceIds) { - group = groupManager.createResourceGroup(getSessionSubject(), group); - - ensureMembershipMatches(group.getId(), resourceIds); - - return SerialUtility.prepare(group, "ResourceGroupService.createResourceGroup"); + try { + Subject user = getSessionSubject(); + group = groupManager.createResourceGroup(user, group); + groupManager.setMembership(user, group.getId(), resourceIds, true); + return SerialUtility.prepare(group, "ResourceGroupService.createResourceGroup"); + } catch (Throwable t) { + throw new RuntimeException(ThrowableUtil.getAllMessages(t)); + } }
public void deleteResourceGroups(int[] groupIds) { @@ -75,7 +99,19 @@ public class ResourceGroupGWTServiceImpl extends AbstractGWTServiceImpl implemen }
public void updateResourceGroup(ResourceGroup group) { - groupManager.updateResourceGroup(getSessionSubject(), group); + try { + groupManager.updateResourceGroup(getSessionSubject(), group); + } catch (Throwable t) { + throw new RuntimeException(ThrowableUtil.getAllMessages(t)); + } + } + + public void updateResourceGroup(ResourceGroup group, boolean updateMembership) { + try { + groupManager.updateResourceGroup(getSessionSubject(), group, null, updateMembership); + } catch (Throwable t) { + throw new RuntimeException(ThrowableUtil.getAllMessages(t)); + } }
public GroupDefinition createGroupDefinition(GroupDefinition groupDefinition) { diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/cluster/ClusterManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/cluster/ClusterManagerBean.java index 10611fa..4aaf7ca 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/cluster/ClusterManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/cluster/ClusterManagerBean.java @@ -48,7 +48,6 @@ import org.rhq.enterprise.server.authz.AuthorizationManagerLocal; import org.rhq.enterprise.server.authz.PermissionException; import org.rhq.enterprise.server.resource.group.ResourceGroupAlreadyExistsException; import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal; -import org.rhq.enterprise.server.resource.group.ResourceGroupUpdateException;
/** * @@ -139,9 +138,9 @@ public class ClusterManagerBean implements ClusterManagerLocal, ClusterManagerRe try { // You are allowed to cause the creation of an auto cluster backing group as long as you can // view the parent group. (That check was done above) - resourceGroupManager.ensureMembershipMatches(subjectManager.getOverlord(), autoClusterBackingGroup - .getId(), resourceIds); - } catch (ResourceGroupUpdateException e) { + resourceGroupManager.setMembership(subjectManager.getOverlord(), autoClusterBackingGroup.getId(), + resourceIds, false); + } catch (Exception e) { log.error("Could not add resources to group:" + e); } } @@ -177,11 +176,10 @@ public class ClusterManagerBean implements ClusterManagerLocal, ClusterManagerRe }
public ClusterFlyweight getClusterTree(Subject subject, int groupId) { - Query query = entityManager.createQuery( - "SELECT r.id, r.resourceType.id, r.parentResource.id, r.resourceKey, r.name, " + - "(SELECT count(r2) FROM Resource r2 join r2.explicitGroups g2 WHERE g2.id = :groupId and r2.id = r.id) " + - "FROM Resource r join r.implicitGroups g " + - "WHERE g.id = :groupId"); + Query query = entityManager + .createQuery("SELECT r.id, r.resourceType.id, r.parentResource.id, r.resourceKey, r.name, " + + "(SELECT count(r2) FROM Resource r2 join r2.explicitGroups g2 WHERE g2.id = :groupId and r2.id = r.id) " + + "FROM Resource r join r.implicitGroups g " + "WHERE g.id = :groupId");
query.setParameter("groupId", groupId); List<Object[]> rs = query.getResultList(); @@ -203,7 +201,6 @@ public class ClusterManagerBean implements ClusterManagerLocal, ClusterManagerRe } }
- ClusterFlyweight key = new ClusterFlyweight(groupId);
buildTree(groupId, key, explicitResources, dataMap); @@ -211,7 +208,8 @@ public class ClusterManagerBean implements ClusterManagerLocal, ClusterManagerRe return key; }
- private void buildTree(int groupId, ClusterFlyweight parent, Set<Integer> parentIds, Map<Integer,List<Object[]>> data) { + private void buildTree(int groupId, ClusterFlyweight parent, Set<Integer> parentIds, + Map<Integer, List<Object[]>> data) {
for (Integer parentId : parentIds) {
@@ -219,32 +217,29 @@ public class ClusterManagerBean implements ClusterManagerLocal, ClusterManagerRe Map<ClusterKeyFlyweight, Set<Integer>> members = new HashMap<ClusterKeyFlyweight, Set<Integer>>();
if (data.get(parentId) != null) { - for (Object[] child : data.get(parentId)) { - ClusterKeyFlyweight n = new ClusterKeyFlyweight((Integer)child[1], (String)child[3]); + for (Object[] child : data.get(parentId)) { + ClusterKeyFlyweight n = new ClusterKeyFlyweight((Integer) child[1], (String) child[3]); ClusterFlyweight flyweight = children.get(n); - Set<Integer> memberList = members.get(n); - if (flyweight == null) { - flyweight = new ClusterFlyweight(n); - children.put(n, flyweight); - memberList = new HashSet<Integer>(); - members.put(n, memberList); + Set<Integer> memberList = members.get(n); + if (flyweight == null) { + flyweight = new ClusterFlyweight(n); + children.put(n, flyweight); + memberList = new HashSet<Integer>(); + members.put(n, memberList); + } + flyweight.addResource((String) child[4]); + memberList.add((Integer) child[0]); } - flyweight.addResource((String)child[4]); - memberList.add((Integer) child[0]); - } }
parent.setChildren(new ArrayList<ClusterFlyweight>(children.values()));
- for (ClusterFlyweight child : children.values()) { buildTree(groupId, child, members.get(child.getClusterKey()), data); } } }
- - private String getClusterKeyQuery(ClusterKey clusterKey) { if (null == clusterKey) return null; diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java index 04dd614..28ae218 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java @@ -171,8 +171,19 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso }
@RequiredPermission(Permission.MANAGE_INVENTORY) - public ResourceGroup updateResourceGroup(Subject user, ResourceGroup group, RecursivityChangeType changeType) + public ResourceGroup updateResourceGroup(Subject subject, ResourceGroup group) throws ResourceGroupUpdateException { + return updateResourceGroup(subject, group, null, true); + } + + @RequiredPermission(Permission.MANAGE_INVENTORY) + public ResourceGroup updateResourceGroup(Subject subject, ResourceGroup group, RecursivityChangeType changeType) throws ResourceGroupUpdateException { + return updateResourceGroup(subject, group, null, true); + } + + @RequiredPermission(Permission.MANAGE_INVENTORY) + public ResourceGroup updateResourceGroup(Subject user, ResourceGroup group, RecursivityChangeType changeType, + boolean updateMembership) throws ResourceGroupUpdateException {
int groupId = group.getId(); ResourceGroup attachedGroup = entityManager.find(ResourceGroup.class, groupId); @@ -198,6 +209,11 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso } }
+ if (!updateMembership) { + group.setExplicitResources(attachedGroup.getExplicitResources()); + group.setImplicitResources(attachedGroup.getImplicitResources()); + } + group.setMtime(System.currentTimeMillis()); group.setModifiedBy(user.getName());
@@ -320,7 +336,9 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso try { operationManager.unscheduleGroupOperation(overlord, schedule.getJobId().toString(), group.getId()); } catch (UnscheduleException e) { - log.warn("Failed to unschedule job [" + schedule + "] for a group being deleted [" + group + "]", e); + log + .warn("Failed to unschedule job [" + schedule + "] for a group being deleted [" + group + "]", + e); } } } catch (Exception e) { @@ -759,8 +777,8 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso * to this method, we can just do simple RHQ_RESOURCE_GROUP_RES_IMP_MAP table insertions */ String insertImplicitQueryString = JDBCUtil.transformQueryForMultipleInParameters( - ResourceGroup.QUERY_NATIVE_ADD_RESOURCES_TO_GROUP_IMPLICIT, "@@RESOURCE_IDS@@", - resourceIdsToAdd.size()); + ResourceGroup.QUERY_NATIVE_ADD_RESOURCES_TO_GROUP_IMPLICIT, "@@RESOURCE_IDS@@", resourceIdsToAdd + .size()); insertImplicitStatement = conn.prepareStatement(insertImplicitQueryString); insertImplicitStatement.setInt(1, implicitRecursiveGroupId); JDBCUtil.bindNTimes(insertImplicitStatement, ArrayUtils.unwrapCollection(resourceIdsToAdd), 2); @@ -822,9 +840,9 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso ResourceGroup group = getResourceGroupById(subject, groupId, category); Set<Resource> res = group.getExplicitResources(); if (res != null && res.size() > 0) { - List<Resource> resources = PersistenceUtility.getHibernateSession(entityManager) - .createFilter(res, "where this.inventoryStatus = :inventoryStatus") - .setParameter("inventoryStatus", InventoryStatus.COMMITTED).list(); + List<Resource> resources = PersistenceUtility.getHibernateSession(entityManager).createFilter(res, + "where this.inventoryStatus = :inventoryStatus").setParameter("inventoryStatus", + InventoryStatus.COMMITTED).list();
return resources; } else { @@ -1278,7 +1296,8 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso return groupIds; }
- public void ensureMembershipMatches(Subject subject, int groupId, int[] resourceIds) { + public void setMembership(Subject subject, int groupId, int[] resourceIds, boolean setType) + throws ResourceGroupDeleteException { //throws ResourceGroupUpdateException { List<Integer> currentMembers = resourceManager.findExplicitResourceIdsByResourceGroup(groupId);
@@ -1293,6 +1312,11 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso if (extraMembers.size() > 0) { removeResourcesFromGroup(subject, groupId, ArrayUtils.unwrapCollection(extraMembers)); } + + // As a result of the membership change ensure that the group type is set correctly. + if (setType) { + setResourceType(groupId); + } }
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -1402,11 +1426,6 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso : RecursivityChangeType.RemovedRecursion); }
- @RequiredPermission(Permission.MANAGE_INVENTORY) - public ResourceGroup updateResourceGroup(Subject subject, ResourceGroup group) throws ResourceGroupUpdateException { - return updateResourceGroup(subject, group, null); - } - @SuppressWarnings("unchecked") public PageList<ResourceGroup> findResourceGroupsByCriteria(Subject subject, ResourceGroupCriteria criteria) { CriteriaQueryGenerator generator = new CriteriaQueryGenerator(subject, criteria); diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerLocal.java index 2919879..45f7cc4 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerLocal.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerLocal.java @@ -42,9 +42,6 @@ import org.rhq.core.domain.util.PageList; @Local public interface ResourceGroupManagerLocal {
- ResourceGroup updateResourceGroup(Subject user, ResourceGroup group, RecursivityChangeType changeType) - throws ResourceGroupAlreadyExistsException, ResourceGroupUpdateException; - ResourceGroup getResourceGroupById(Subject user, int id, GroupCategory category) throws ResourceGroupNotFoundException;
@@ -108,10 +105,30 @@ public interface ResourceGroupManagerLocal {
List<Integer> findDeletedResourceGroupIds(int[] groupIds);
- void ensureMembershipMatches(Subject subject, int groupId, int[] resourceIds) throws ResourceGroupUpdateException; + /** + * This method ensures that the explicit group membership is set to the specified resources. Members + * will be added or removed as necessary. Make sure you pass the correct value for the <setType> + * parameter. + * + * @param subject + * @param groupId + * @param resourceIds + * @param setType Set to false if the specified resourceIds will not alter the group type (compatible or + * mixed). Set true to have the group type (re)set automatically, based on the new group membership. + * @throws ResourceGroupUpdateException + * @throws ResourceGroupDeleteException + */ + void setMembership(Subject subject, int groupId, int[] resourceIds, boolean setType) + throws ResourceGroupUpdateException, ResourceGroupDeleteException;
void uninventoryMembers(Subject subject, int groupId);
+ ResourceGroup updateResourceGroup(Subject user, ResourceGroup group, RecursivityChangeType changeType) + throws ResourceGroupAlreadyExistsException, ResourceGroupUpdateException; + + ResourceGroup updateResourceGroup(Subject user, ResourceGroup group, RecursivityChangeType changeType, + boolean updateMembership) throws ResourceGroupAlreadyExistsException, ResourceGroupUpdateException; + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // // The following are shared with the Remote Interface @@ -141,5 +158,4 @@ public interface ResourceGroupManagerLocal { ResourceGroup updateResourceGroup(Subject subject, ResourceGroup group);
PageList<ResourceGroup> findResourceGroupsByCriteria(Subject subject, ResourceGroupCriteria criteria); - } \ No newline at end of file
rhq-commits@lists.fedorahosted.org