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/ResourceCompositeSearchView.java | 105 ++-------- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java | 1 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java | 70 ++++-- 4 files changed, 93 insertions(+), 104 deletions(-)
New commits: commit f3c5218d16aa49a744d6df68f7cbbf87575dc03c 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) (cherry picked from commit 7f74d068c450a65502c07975c2942d9e9a8b2f67)
Conflicts:
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java
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 2fb7802..2a33d98 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); @@ -293,12 +302,13 @@ public class ResourceTypeRepository { Log.info("Loading " + typesNeeded.size() + ((metadataTypes != null) ? (" types: " + metadataTypes) : ""));
- if ((topLevelServerAndServiceTypes == null) && (metadataTypes != null) && - metadataTypes.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. - loadTopLevelServerAndServiceTypes(callback, metadataTypes, criteria, cachedTypes); + // 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, metadataTypes, criteria, cachedTypes); } @@ -309,21 +319,34 @@ public class ResourceTypeRepository { 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 0d4efdc85ef65f6cdcf7954766cd28186a36ab63 Author: Ian Springer ian.springer@redhat.com Date: Mon Aug 1 14:09:29 2011 -0400
[BZ 720456] fix so all child types are shown in manual-add dropdown on Inventory>Child Resources view (https://bugzilla.redhat.com/show_bug.cgi?id=720456) (cherry picked from commit d47438f7a5a56de5539f8635a44aed53833837dc)
Conflicts:
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceCompositeSearchView.java modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceCompositeSearchView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceCompositeSearchView.java index e5ec18a..b23e733 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceCompositeSearchView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceCompositeSearchView.java @@ -22,13 +22,8 @@ */ package org.rhq.enterprise.gui.coregui.client.inventory.resource;
-import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; -import java.util.TreeSet;
import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.data.Criteria; @@ -133,98 +128,50 @@ public class ResourceCompositeSearchView extends ResourceSearchView { super.configureTable(); }
- @SuppressWarnings("unchecked") private void addImportButton() { ResourceType parentType = parentResourceComposite.getResource().getResourceType();
// manual import type menu - Set<ResourceType> importableChildTypes = getImportableChildTypes(parentType); - if (!importableChildTypes.isEmpty()) { - Map<String, ResourceType> displayNames = getDisplayNames(importableChildTypes); - LinkedHashMap<String, ResourceType> importTypeValueMap = new LinkedHashMap<String, ResourceType>(displayNames); + // TODO: Use TreeMap instead, so the types will be sorted by name. + LinkedHashMap<String, ResourceType> importTypeValueMap = new LinkedHashMap<String, ResourceType>();
+ for (ResourceType childType : parentType.getChildResourceTypes()) { + if (childType.isSupportsManualAdd()) { + importTypeValueMap.put(childType.getName(), childType); + } + } + if (!importTypeValueMap.isEmpty()) { addTableAction(extendLocatorId("Import"), MSG.common_button_import(), null, importTypeValueMap, - new AbstractTableAction(TableActionEnablement.ALWAYS) { - public void executeAction(ListGridRecord[] selection, Object actionValue) { - ResourceFactoryImportWizard.showImportWizard(parentResourceComposite.getResource(), - (ResourceType) actionValue); - // we can refresh the table buttons immediately since the wizard is a dialog, the - // user can't access enabled buttons anyway. - ResourceCompositeSearchView.this.refreshTableInfo(); - } - }); + new AbstractTableAction(TableActionEnablement.ALWAYS) { + + public void executeAction(ListGridRecord[] selection, Object actionValue) { + ResourceFactoryImportWizard.showImportWizard(parentResourceComposite.getResource(), + (ResourceType) actionValue); + } + }); }
// creatable child type menu - Set<ResourceType> creatableChildTypes = getCreatableChildTypes(parentType); - if (!creatableChildTypes.isEmpty()) { - Map<String, ResourceType> displayNames = getDisplayNames(creatableChildTypes); - LinkedHashMap<String, ResourceType> createTypeValueMap = new LinkedHashMap<String, ResourceType>(displayNames); + // TODO: Use TreeMap instead, so the types will be sorted by name. + LinkedHashMap<String, ResourceType> createTypeValueMap = new LinkedHashMap<String, ResourceType>();
- addTableAction(extendLocatorId("CreateChild"), MSG.common_button_create_child(), null, createTypeValueMap, - new AbstractTableAction(TableActionEnablement.ALWAYS) { + for (ResourceType childType : parentType.getChildResourceTypes()) { + if (childType.isCreatable()) { + createTypeValueMap.put(childType.getName(), childType); + } + } + if (!createTypeValueMap.isEmpty()) { + addTableAction(extendLocatorId("CreateChild"), MSG.common_button_create_child(), null, + createTypeValueMap, new AbstractTableAction(TableActionEnablement.ALWAYS) {
public void executeAction(ListGridRecord[] selection, Object actionValue) { ResourceFactoryCreateWizard.showCreateWizard(parentResourceComposite.getResource(), - (ResourceType) actionValue); - // we can refresh the table buttons immediately since the wizard is a dialog, the - // user can't access enabled buttons anyway. - ResourceCompositeSearchView.this.refreshTableInfo(); + (ResourceType) actionValue); } }); } }
- private static Set<ResourceType> getImportableChildTypes(ResourceType type) { - Set<ResourceType> results = new TreeSet<ResourceType>(); - Set<ResourceType> childTypes = type.getChildResourceTypes(); - for (ResourceType childType : childTypes) { - if (childType.isSupportsManualAdd()) { - results.add(childType); - } - } - return results; - } - - private static Set<ResourceType> getCreatableChildTypes(ResourceType type) { - Set<ResourceType> results = new TreeSet<ResourceType>(); - Set<ResourceType> childTypes = type.getChildResourceTypes(); - for (ResourceType childType : childTypes) { - if (childType.isCreatable()) { - results.add(childType); - } - } - return results; - } - - private static Map<String, ResourceType> getDisplayNames(Set<ResourceType> types) { - Set<String> allNames = new HashSet<String>(); - Set<String> repeatedNames = new HashSet<String>(); - for (ResourceType type : types) { - String typeName = type.getName(); - if (allNames.contains(typeName)) { - repeatedNames.add(typeName); - } else { - allNames.add(typeName); - } - } - Map<String, ResourceType> results = new TreeMap<String, ResourceType>(); - for (ResourceType type : types) { - String displayName = type.getName(); - if (repeatedNames.contains(type.getName())) { - displayName += " (" + type.getPlugin() + " plugin)"; - } - results.put(displayName, type); - } - return results; - } - - protected void onUninventorySuccess() { - // refresh the entire gui so it encompasses any relevant tree view. Don't call this.refresh() - // because CoreGUI.refresh is more comprehensive. - CoreGUI.refresh(); - } - public ResourceComposite getParentResourceComposite() { return parentResourceComposite; } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java index 44f3b90..d2cfb26 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java @@ -548,6 +548,7 @@ public class ResourceTreeView extends LocatableVLayout { } importChildMenu.setSubmenu(importChildSubMenu); } + resourceContextMenu.addItem(importChildMenu); } } 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..2fb7802 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 @@ -290,22 +290,24 @@ public class ResourceTypeRepository {
criteria.setPageControl(PageControl.getUnlimitedInstance());
- Log.info("Loading [" + typesNeeded.size() + "] types with facets=[" + metadataTypesNeeded + "]..."); + Log.info("Loading " + typesNeeded.size() + + ((metadataTypes != null) ? (" types: " + metadataTypes) : ""));
- if ((topLevelServerAndServiceTypes == null) && (metadataTypesNeeded != null) - && metadataTypesNeeded.contains(MetadataType.children)) { + if ((topLevelServerAndServiceTypes == null) && (metadataTypes != null) && + metadataTypes.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. - loadTopLevelServerAndServiceTypes(callback, metadataTypesNeeded, criteria, cachedTypes); + loadTopLevelServerAndServiceTypes(callback, metadataTypes, criteria, cachedTypes); } else { - loadRequestedTypes(callback, metadataTypesNeeded, criteria, cachedTypes); + loadRequestedTypes(callback, metadataTypes, criteria, cachedTypes); } }
private void loadTopLevelServerAndServiceTypes(final TypesLoadedCallback callback, - final EnumSet<MetadataType> metadataTypes, final ResourceTypeCriteria criteria, - final Map<Integer, ResourceType> cachedTypes) { + final EnumSet<MetadataType> metadataTypes, + final ResourceTypeCriteria criteria, final Map<Integer, + ResourceType> cachedTypes) { ResourceTypeCriteria topLevelCriteria = new ResourceTypeCriteria(); topLevelCriteria.fetchParentResourceTypes(true); resourceTypeService.findResourceTypesByCriteria(topLevelCriteria, new AsyncCallback<PageList<ResourceType>>() { @@ -317,8 +319,8 @@ public class ResourceTypeRepository { public void onSuccess(PageList<ResourceType> types) { topLevelServerAndServiceTypes = new HashSet<ResourceType>(); for (ResourceType type : types) { - if ((type.getCategory() != ResourceCategory.PLATFORM) - && (type.getParentResourceTypes() == null || type.getParentResourceTypes().isEmpty())) { + if ((type.getCategory() != ResourceCategory.PLATFORM) && + (type.getParentResourceTypes() == null || type.getParentResourceTypes().isEmpty())) { topLevelServerAndServiceTypes.add(type); } } @@ -327,8 +329,7 @@ public class ResourceTypeRepository { }); }
- private void loadRequestedTypes(final TypesLoadedCallback callback, final EnumSet<MetadataType> metadataTypes, - ResourceTypeCriteria criteria, final Map<Integer, ResourceType> cachedTypes) { + private void loadRequestedTypes(final TypesLoadedCallback callback, final EnumSet<MetadataType> metadataTypes, ResourceTypeCriteria criteria, final Map<Integer, ResourceType> cachedTypes) { resourceTypeService.findResourceTypesByCriteria(criteria, new AsyncCallback<PageList<ResourceType>>() { public void onFailure(Throwable caught) { CoreGUI.getErrorHandler().handleError(MSG.widget_typeCache_loadFail(), caught); @@ -343,8 +344,8 @@ public class ResourceTypeRepository { switch (metadataType) { case children: Set<ResourceType> childTypes = type.getChildResourceTypes(); - if (type.getCategory() == ResourceCategory.PLATFORM - && topLevelServerAndServiceTypes != null) { + if (type.getCategory() == ResourceCategory.PLATFORM && + topLevelServerAndServiceTypes != null) { // Add server and service types with no parent types to the list of child types. // These types are implicitly children of all platform types, even though they // are not included in the platform types' childResourceTypes field. @@ -389,7 +390,7 @@ public class ResourceTypeRepository { break; default: Log.error("ERROR: metadataType " + metadataType.name() - + " not merged into cached ResourceType."); + + " not merged into cached ResourceType."); } } }
rhq-commits@lists.fedorahosted.org