modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceTypeCriteria.java | 21 +++- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 2 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java | 51 +++++++--- 3 files changed, 57 insertions(+), 17 deletions(-)
New commits: commit 7f74d068c450a65502c07975c2942d9e9a8b2f67 Author: Ian Springer ian.springer@redhat.com Date: Fri Nov 4 10:39:27 2011 -0400
[BZ 751097] various improvements to the code used to load top-level server and service ResourceTypes (hopefully this will fix https://bugzilla.redhat.com/show_bug.cgi?id=751097)
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceTypeCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceTypeCriteria.java index 7abb782..de69bae 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceTypeCriteria.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceTypeCriteria.java @@ -1,6 +1,6 @@ /* * RHQ Management Platform - * Copyright (C) 2005-2008 Red Hat, Inc. + * Copyright (C) 2005-2011 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify @@ -23,7 +23,9 @@ package org.rhq.core.domain.criteria;
import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set;
import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -59,6 +61,8 @@ public class ResourceTypeCriteria extends Criteria { // by default, we don't want to fetch resource types that // are marked deleted private Boolean filterDeleted = false; + private Set<ResourceCategory> filterCategories; // needs overrides + private Boolean filterParentResourceTypesEmpty; // needs overrides
private boolean fetchSubCategory; private boolean fetchChildResourceTypes; @@ -87,10 +91,15 @@ public class ResourceTypeCriteria extends Criteria { + " FROM ResourceType innerRt " // + " JOIN innerRt.parentResourceTypes innerParentRt " // + " WHERE innerParentRt.id IN ( ? ) )"); - filterOverrides.put("pluginName", "plugin like ?"); filterOverrides.put("ids", "id in ( ? )"); filterOverrides.put("bundleTypeId", "bundleType.id = ?"); + filterOverrides.put("categories", "category in ( ? )"); + filterOverrides.put("parentResourceTypesEmpty", "" // + + "id IN ( SELECT innerRt.id FROM ResourceType innerRt " // + + " LEFT JOIN innerRt.parentResourceTypes " // + + " WHERE ( ? = true AND innerRt.parentResourceTypes IS EMPTY ) " // + + " OR ( ? = false AND innerRt.parentResourceTypes IS NOT EMPTY ) )");
sortOverrides.put("pluginName", "plugin"); } @@ -148,6 +157,14 @@ public class ResourceTypeCriteria extends Criteria { this.filterDeleted = deleted; }
+ public void addFilterCategories(ResourceCategory... filterCategories) { + this.filterCategories = new HashSet<ResourceCategory>(Arrays.asList(filterCategories)); + } + + public void addFilterParentResourceTypesEmpty(boolean filterParentResourceTypesEmpty) { + this.filterParentResourceTypesEmpty = filterParentResourceTypesEmpty; + } + public void fetchSubCategory(boolean fetchSubCategory) { this.fetchSubCategory = fetchSubCategory; } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java index 15d7221..f7a73b07 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -37,6 +38,7 @@ import org.rhq.core.domain.resource.ResourceType; 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.util.PageOrdering; import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.Messages; import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; @@ -46,6 +48,7 @@ import org.rhq.enterprise.gui.coregui.client.gwt.ResourceTypeGWTServiceAsync; * A cache for ResourceTypes and their various fields. Fields are only fetched as needed. * * @author Greg Hinkle + * @author Ian Springer */ public class ResourceTypeRepository { static private final Messages MSG = CoreGUI.getMessages(); @@ -159,12 +162,18 @@ public class ResourceTypeRepository {
Set<Integer> types = new HashSet<Integer>(); for (ResourceGroup group : groups) { - types.add(group.getResourceType().getId()); + ResourceType type = group.getResourceType(); + if (type != null) { + types.add(type.getId()); + } } getResourceTypes(types.toArray(new Integer[types.size()]), metadataTypes, new TypesLoadedCallback() { public void onTypesLoaded(Map<Integer, ResourceType> types) { for (ResourceGroup group : groups) { - group.setResourceType(types.get(group.getResourceType().getId())); + ResourceType type = group.getResourceType(); + if (type != null) { + group.setResourceType(types.get(type.getId())); + } } if (callback != null) { callback.onResourceTypeLoaded(groups); @@ -292,11 +301,12 @@ public class ResourceTypeRepository {
Log.info("Loading [" + typesNeeded.size() + "] types with facets=[" + metadataTypesNeeded + "]...");
- if ((topLevelServerAndServiceTypes == null) && (metadataTypesNeeded != null) - && metadataTypesNeeded.contains(MetadataType.children)) { + if ((topLevelServerAndServiceTypes == null) && metadataTypesNeeded.contains(MetadataType.children)) { // Perform a one-time load of server and service types with no parent types. These types are implicitly // children of all platform types, even though they are not included in the platform types' - // childResourceTypes field. + // childResourceTypes field in the DB. After the top-level types are loaded, loadRequestedTypes() will be + // called to load the requested types. For any requested types that are platforms, the top-level + // server/service types will be added to the platform types' childResourceTypes fields. loadTopLevelServerAndServiceTypes(callback, metadataTypesNeeded, criteria, cachedTypes); } else { loadRequestedTypes(callback, metadataTypesNeeded, criteria, cachedTypes); @@ -307,21 +317,34 @@ public class ResourceTypeRepository { final EnumSet<MetadataType> metadataTypes, final ResourceTypeCriteria criteria, final Map<Integer, ResourceType> cachedTypes) { ResourceTypeCriteria topLevelCriteria = new ResourceTypeCriteria(); - topLevelCriteria.fetchParentResourceTypes(true); + topLevelCriteria.addFilterCategories(ResourceCategory.SERVER, ResourceCategory.SERVICE); + topLevelCriteria.addFilterParentResourceTypesEmpty(true); + topLevelCriteria.addSortCategory(PageOrdering.DESC); + topLevelCriteria.addSortName(PageOrdering.ASC); resourceTypeService.findResourceTypesByCriteria(topLevelCriteria, new AsyncCallback<PageList<ResourceType>>() { - public void onFailure(Throwable caught) { - CoreGUI.getErrorHandler().handleError(MSG.widget_typeCache_loadFail(), caught); - loadRequestedTypes(callback, metadataTypes, criteria, cachedTypes); - } - public void onSuccess(PageList<ResourceType> types) { - topLevelServerAndServiceTypes = new HashSet<ResourceType>(); + topLevelServerAndServiceTypes = new LinkedHashSet<ResourceType>(types.size()); for (ResourceType type : types) { - if ((type.getCategory() != ResourceCategory.PLATFORM) - && (type.getParentResourceTypes() == null || type.getParentResourceTypes().isEmpty())) { + if (cachedTypes.containsKey(type.getId())) { + ResourceType cachedType = cachedTypes.get(type.getId()); + topLevelServerAndServiceTypes.add(cachedType); + } else { + cachedTypes.put(type.getId(), type); topLevelServerAndServiceTypes.add(type); } } + if (Log.isDebugEnabled()) { + Set<String> typeNames = new LinkedHashSet<String>(topLevelServerAndServiceTypes.size()); + for (ResourceType type : topLevelServerAndServiceTypes) { + typeNames.add(type.getPlugin() + ":" + type.getName()); + } + Log.debug("Loaded " + typeNames.size() + " top-level server and service types: " + typeNames); + } + loadRequestedTypes(callback, metadataTypes, criteria, cachedTypes); + } + + public void onFailure(Throwable caught) { + CoreGUI.getErrorHandler().handleError(MSG.widget_typeCache_loadFail(), caught); loadRequestedTypes(callback, metadataTypes, criteria, cachedTypes); } });
commit f4ce4e7466c4d994b2e82b72f5920ba07cb6c402 Author: Ian Springer ian.springer@redhat.com Date: Fri Nov 4 10:31:33 2011 -0400
minor - fix typo in comment
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 416f7b0..d78eb36 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 @@ -644,7 +644,7 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo new ResourceTypeRepository.TypeLoadedCallback() { public void onTypesLoaded(ResourceType type) { // until we finish the following work we're susceptible to fast-click issues in - // tree navigation. So, wait until after it's done to notify listeners thatthe view is + // tree navigation. So, wait until after it's done to notify listeners that the view is // safely rendered. Make sure to notify even on failure. try { resourceComposite.getResource().setResourceType(type);
rhq-commits@lists.fedorahosted.org