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(a)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(a)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);