modules/core/client-api/src/main/resources/rhq-configuration.xsd | 4 modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java | 5 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java | 38 ++--- modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java | 76 +++------- 4 files changed, 48 insertions(+), 75 deletions(-)
New commits: commit 9fbcd2eddff6d70f6df3f0dce7a4d50e8df685f0 Merge: 1caea4f ce216a9 Author: Stefan Negrea snegrea@redhat.com Date: Tue Sep 27 15:52:10 2011 -0500
Merge branch 'master' into as7plugin
commit ce216a9370e354bfd6089d929504b98be73e7e7b Author: Ian Springer ian.springer@redhat.com Date: Tue Sep 27 13:58:28 2011 -0400
[BZ 739529] fix a regression that was causing the group Configuration tab to never be displayed (https://bugzilla.redhat.com/show_bug.cgi?id=739529)
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 103acdd..1ecd83f 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 @@ -76,7 +76,7 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/** - * Right panel of the Resource Group view (#ResourceGroup/*). + * The right panel of a Resource Group view (#ResourceGroup/* or #Resource/AutoGroup/*). * * @author Jay Shaughnessy * @author Ian Springer @@ -247,8 +247,6 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource protected void updateTabContent(ResourceGroupComposite groupComposite) { try { this.groupComposite = groupComposite; - ResourceGroup group = groupComposite.getResourceGroup(); - int groupId = group.getId(); getTitleBar().setGroup(groupComposite);
// wipe the canvas views for the current set of subtabs. @@ -258,13 +256,13 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource Set<ResourceTypeFacet> facets = groupComposite.getResourceFacets().getFacets();
updateSummaryTab(); - updateMonitoringTab(groupId, groupCategory, facets); - updateInventoryTab(groupId, facets); + updateInventoryTab(facets); + updateAlertsTab(groupCategory); + updateMonitoringTab(facets); + updateEventsTab(groupCategory, facets); updateOperationsTab(groupCategory, facets); - updateAlertsTab(groupComposite, groupCategory); - updateConfigurationTab(groupId, groupCategory, facets); - updateDriftTab(groupComposite, groupCategory, facets); - updateEventsTab(groupComposite, groupCategory, facets); + updateConfigurationTab(groupCategory, facets); + updateDriftTab(groupCategory, facets);
this.show(); markForRedraw(); @@ -285,12 +283,13 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource // TODO (ips): Add Timeline subtab? }
- private void updateMonitoringTab(final int groupId, GroupCategory groupCategory, Set<ResourceTypeFacet> facets) { + private void updateMonitoringTab(Set<ResourceTypeFacet> facets) { ViewFactory viewFactory; // TODO: Once we add an Availability subtab, the Monitoring tab will always be visible, even for groups with // no metrics. boolean visible = hasMetricsOfType(this.groupComposite, null); if (updateTab(this.monitoringTab, visible, true)) { + final int groupId = groupComposite.getResourceGroup().getId(); visible = hasMetricsOfType(this.groupComposite, DataType.MEASUREMENT); viewFactory = (!visible) ? null : new ViewFactory() { @Override @@ -352,14 +351,15 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource } }
- private void updateInventoryTab(final int groupId, Set<ResourceTypeFacet> facets) { + private void updateInventoryTab(Set<ResourceTypeFacet> facets) { // Inventory tab is always visible and enabled. final boolean canModifyMembers = (!isAutoGroup() && !isAutoCluster() && globalPermissions .contains(Permission.MANAGE_INVENTORY)); updateSubTab(this.inventoryTab, this.inventoryMembers, true, true, new ViewFactory() { @Override public Canvas createView() { - return new MembersView(inventoryMembers.extendLocatorId("View"), groupId, canModifyMembers); + return new MembersView(inventoryMembers.extendLocatorId("View"), + groupComposite.getResourceGroup().getId(), canModifyMembers); } }); updateSubTab(this.inventoryTab, this.inventoryConn, facets.contains(ResourceTypeFacet.PLUGIN_CONFIGURATION), @@ -398,7 +398,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource } }
- private void updateAlertsTab(final ResourceGroupComposite groupComposite, GroupCategory groupCategory) { + private void updateAlertsTab(GroupCategory groupCategory) { // alerts tab is always visible, even for mixed groups if (updateTab(this.alertsTab, true, true)) { // alert history is always available @@ -420,7 +420,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource } }
- private void updateConfigurationTab(final int groupId, GroupCategory groupCategory, Set<ResourceTypeFacet> facets) { + private void updateConfigurationTab(GroupCategory groupCategory, Set<ResourceTypeFacet> facets) { boolean visible = (groupCategory == GroupCategory.COMPATIBLE && facets .contains(ResourceTypeFacet.CONFIGURATION)); Set<Permission> groupPermissions = this.groupComposite.getResourcePermission().getPermissions(); @@ -434,15 +434,14 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource updateSubTab(this.configurationTab, this.configHistory, true, true, new ViewFactory() { @Override public Canvas createView() { - return new HistoryGroupResourceConfigurationView(inventoryConnHistory.extendLocatorId("View"), + return new HistoryGroupResourceConfigurationView(configHistory.extendLocatorId("View"), groupComposite); } }); } }
- private void updateEventsTab(final ResourceGroupComposite groupComposite, GroupCategory groupCategory, - Set<ResourceTypeFacet> facets) { + private void updateEventsTab(GroupCategory groupCategory, Set<ResourceTypeFacet> facets) { // allow mixed groups to show events from supporting resources boolean visible = (groupCategory == GroupCategory.MIXED || (groupCategory == GroupCategory.COMPATIBLE && facets .contains(ResourceTypeFacet.EVENT))); @@ -456,12 +455,11 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource } }
- private void updateDriftTab(final ResourceGroupComposite resourceComposite, GroupCategory groupCategory, - Set<ResourceTypeFacet> facets) { + private void updateDriftTab(GroupCategory groupCategory, Set<ResourceTypeFacet> facets) { boolean visible = (groupCategory == GroupCategory.COMPATIBLE && facets.contains(ResourceTypeFacet.DRIFT)); Set<Permission> groupPermissions = this.groupComposite.getResourcePermission().getPermissions();
- if (updateTab(this.configurationTab, visible, visible && groupPermissions.contains(Permission.MANAGE_DRIFT))) { + if (updateTab(this.driftTab, visible, visible && groupPermissions.contains(Permission.MANAGE_DRIFT))) {
updateSubTab(this.driftTab, this.driftHistory, true, true, new ViewFactory() { @Override
commit 1026cd0039574ee628929c0140b6ce452b0db822 Author: Ian Springer ian.springer@redhat.com Date: Tue Sep 27 11:38:03 2011 -0400
[BZ 736517] remove unnecessary loading of grandchildren Resources in ResourceManagerBean.getResourceLineageAndSiblings() and further optimize performance of that method (https://bugzilla.redhat.com/show_bug.cgi?id=736517)
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java index de415f4..1eb495e 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java @@ -291,13 +291,14 @@ import org.rhq.core.domain.util.Summary; + " FROM Resource res " // + " WHERE res.parentResource = :parent " // + " AND res.id IN (SELECT rr.id FROM Resource rr JOIN rr.implicitGroups g JOIN g.roles r JOIN r.subjects s WHERE s = :subject)" - + " AND res.resourceType.category = :category " + " AND res.inventoryStatus = :status "), + + " AND res.inventoryStatus = :status " // + + " AND (res.resourceType.category = :category OR :category is null)"), @NamedQuery(name = Resource.QUERY_FIND_CHILDREN_BY_CATEGORY_AND_INVENTORY_STATUS_ADMIN, query = "" // + "SELECT res " // + " FROM Resource res " // + " WHERE res.parentResource = :parent " // + " AND res.inventoryStatus = :status " // - + " AND res.resourceType.category = :category "), + + " AND (res.resourceType.category = :category OR :category is null)"), @NamedQuery(name = Resource.QUERY_FIND_BY_CATEGORY_AND_INVENTORY_STATUS, query = "" // + "SELECT res " // + " FROM Resource res " // diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java index 16fd8e6..6a10c30 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java @@ -750,74 +750,44 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage }
public List<ResourceLineageComposite> getResourceLineageAndSiblings(Subject subject, int resourceId) { - boolean isInventoryManager = authorizationManager.isInventoryManager(subject); - - // get the raw resource lineage up to the platform. We'll check the auth below + // Get the raw resource lineage up to the platform. We'll check the auth below. List<Resource> rawResourceLineage = getResourceLineage(resourceId); int depth = rawResourceLineage.size(); Resource parent = (depth > 1) ? rawResourceLineage.get(depth - 2) : null;
- // record which of the raw ancestry is locked from view - List<ResourceLineageComposite> resourceLineage = new ArrayList<ResourceLineageComposite>(rawResourceLineage - .size()); + // Build up a list of composite Resources for the ancestry that includes which ancestors, if any, should be + // locked from view. + boolean isInventoryManager = authorizationManager.isInventoryManager(subject); + List<ResourceLineageComposite> resourceLineage = new ArrayList<ResourceLineageComposite>(rawResourceLineage.size()); for (Resource resource : rawResourceLineage) { - resourceLineage.add(new ResourceLineageComposite(resource, !authorizationManager.canViewResource(subject, - resource.getId()))); + boolean isLocked = !(isInventoryManager || authorizationManager.canViewResource(subject, resource.getId())); + ResourceLineageComposite composite = new ResourceLineageComposite(resource, isLocked); + resourceLineage.add(composite); }
- // fill out the tree, including only the direct ancestors and all viewable relations + // Build up the result list, including only the direct ancestors of the Resource and all viewable siblings of + // the ancestors. The list will represent a tree, rooted at the platform, in depth-first order. List<ResourceLineageComposite> result = new LinkedList<ResourceLineageComposite>();
for (ResourceLineageComposite ancestor : resourceLineage) { - // always include a direct ancestor + // Always include a direct ancestor. result.add(ancestor);
- // if the ancestor is not locked, include relevant children. Also, always show viewable - // siblings of the target resource. + // If the ancestor is not locked, include viewable children. if (!ancestor.isLocked() || ancestor.getResource() == parent) { - - // get children - Set<Resource> children = ancestor.getResource().getChildResources(); - // remove any that are in the ancestry to avoid repeated handling + // Get all viewable committed children. + PageList<Resource> children = findChildResourcesByCategoryAndInventoryStatus(subject, + ancestor.getResource(), null, InventoryStatus.COMMITTED, PageControl.getUnlimitedInstance()); + // Remove any that are in the lineage to avoid repeated handling. children.removeAll(rawResourceLineage); - // only add the viewable children - List<Resource> viewableChildren = new ArrayList<Resource>(children.size()); for (Resource child : children) { - boolean isCommitted = (child.getInventoryStatus() == InventoryStatus.COMMITTED); - boolean isViewable = (isInventoryManager || authorizationManager.canViewResource(subject, child - .getId())); - if (isCommitted && isViewable) { - // if not a direct ancestor add to the list (direct ancestors already added by default) - if (!rawResourceLineage.contains(child)) { - // ensure we have the parent in the entity - child.getParentResource().getId(); - ResourceLineageComposite composite = new ResourceLineageComposite(child, false); - result.add(composite); - } - viewableChildren.add(child); - } - } - - // get grandchildren - for (Resource child : viewableChildren) { - // This ensures Hibernate actually fetches the parent Resource. - // ensure we have the parent + // Ensure the parentResource field is fetched. + //noinspection ConstantConditions child.getParentResource().getId(); - Set<Resource> grandChildren = child.getChildResources(); - for (Resource grandChild : grandChildren) { - boolean isCommitted = (grandChild.getInventoryStatus() == InventoryStatus.COMMITTED); - boolean isViewable = (isInventoryManager || authorizationManager.canViewResource(subject, - grandChild.getId())); - if (isCommitted && isViewable) { - // if not a direct ancestor add to the list (direct ancestors already added by default) - if (!rawResourceLineage.contains(grandChild)) { - // ensure we have the parent in the entity - grandChild.getParentResource().getId(); - ResourceLineageComposite composite = new ResourceLineageComposite(grandChild, false); - result.add(composite); - } - } - } + // The query only returned viewable children, so the composite should not be locked. + boolean isLocked = false; + ResourceLineageComposite composite = new ResourceLineageComposite(child, isLocked); + result.add(composite); } } } @@ -1070,7 +1040,7 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage
@SuppressWarnings("unchecked") public PageList<Resource> findChildResourcesByCategoryAndInventoryStatus(Subject user, Resource parent, - ResourceCategory category, InventoryStatus status, PageControl pageControl) { + @Nullable ResourceCategory category, InventoryStatus status, PageControl pageControl) { pageControl.initDefaultOrderingField("res.name");
Query queryCount;
commit c14cbc4b9afa6a1f223f54b29af47c011941cbb0 Merge: 14ef47f 8ada3a7 Author: John Mazzitelli mazz@redhat.com Date: Tue Sep 27 11:37:39 2011 -0400
Merge commit 'origin/master'
commit 14ef47fc976d72d69c41b21cc2de329c15ba03e8 Author: John Mazzitelli mazz@redhat.com Date: Tue Sep 27 11:35:36 2011 -0400
[BZ 741691] make sure the plugin XML descriptor accepts all units that the code can support this adds: petabytes, epoch_seconds, jiffys, microseconds
diff --git a/modules/core/client-api/src/main/resources/rhq-configuration.xsd b/modules/core/client-api/src/main/resources/rhq-configuration.xsd index b038ec1..4b706d8 100644 --- a/modules/core/client-api/src/main/resources/rhq-configuration.xsd +++ b/modules/core/client-api/src/main/resources/rhq-configuration.xsd @@ -590,8 +590,12 @@ <xs:enumeration value="megabytes"/> <xs:enumeration value="gigabytes"/> <xs:enumeration value="terabytes"/> + <xs:enumeration value="petabytes" /> <xs:enumeration value="epoch_milliseconds"/> + <xs:enumeration value="epoch_seconds"/> + <xs:enumeration value="jiffys"/> <xs:enumeration value="nanoseconds"/> + <xs:enumeration value="microseconds"/> <xs:enumeration value="milliseconds"/> <xs:enumeration value="seconds"/> <xs:enumeration value="minutes"/>
rhq-commits@lists.fedorahosted.org