modules/core/domain/src/main/java/org/rhq/core/domain/resource/flyweight/FlyweightCache.java | 7 modules/core/domain/src/main/java/org/rhq/core/domain/resource/flyweight/ResourceTypeFlyweight.java | 9 modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/navigation/group/ResourceGroupTreeModelUIBean.java | 2 modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/navigation/resource/ResourceTreeModelUIBean.java | 197 ++++------ modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java | 7 5 files changed, 104 insertions(+), 118 deletions(-)
New commits: commit 98d7db9e8be3aa960292ca6b9072c1010a35a3d9 Author: Lukas Krejci lkrejci@redhat.com Date: Fri Apr 30 14:57:29 2010 +0200
BZ 587325 - Singletons are no longer autogrouped in the resource and group left navigation trees.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/flyweight/FlyweightCache.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/flyweight/FlyweightCache.java index a68b1bf..c9b3eac 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/flyweight/FlyweightCache.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/flyweight/FlyweightCache.java @@ -205,10 +205,11 @@ public class FlyweightCache { int id = original.getId(); String name = original.getName(); String plugin = original.getPlugin(); + boolean singleton = original.isSingleton(); ResourceCategory category = original.getCategory(); ResourceSubCategory subCategory = original.getSubCategory();
- return constructResourceType(id, name, plugin, category, subCategory != null ? subCategory.getId() : null); + return constructResourceType(id, name, plugin, singleton, category, subCategory != null ? subCategory.getId() : null); }
/** @@ -223,12 +224,13 @@ public class FlyweightCache { * @param id the resource type id * @param name the resource type name * @param plugin the resource type plugin + * @param singleton true if the resource type is a singleton * @param category the resource type category * @param subCategory the id of the resource type sub category or null * @param cache the flyweight cache * @return */ - public ResourceTypeFlyweight constructResourceType(int id, String name, String plugin, ResourceCategory category, + public ResourceTypeFlyweight constructResourceType(int id, String name, String plugin, boolean singleton, ResourceCategory category, Integer subCategory) {
ResourceTypeFlyweight ret = getResourceTypes().get(id); @@ -241,6 +243,7 @@ public class FlyweightCache { ret.setId(id); ret.setName(name); ret.setPlugin(plugin); + ret.setSingleton(singleton); ret.setCategory(category); if (subCategory != null) { ret.setSubCategory(getSubCategories().get(subCategory)); diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/flyweight/ResourceTypeFlyweight.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/flyweight/ResourceTypeFlyweight.java index 3accee8..cae0efe 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/flyweight/ResourceTypeFlyweight.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/flyweight/ResourceTypeFlyweight.java @@ -39,6 +39,7 @@ public class ResourceTypeFlyweight implements Serializable { private int id; private String name; private String plugin; + private boolean singleton; private ResourceCategory category; private ResourceSubCategoryFlyweight subCategory;
@@ -86,6 +87,14 @@ public class ResourceTypeFlyweight implements Serializable { this.subCategory = subCategory; }
+ public boolean isSingleton() { + return singleton; + } + + public void setSingleton(boolean singleton) { + this.singleton = singleton; + } + @Override public boolean equals(Object obj) { if (this == obj) diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/navigation/group/ResourceGroupTreeModelUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/navigation/group/ResourceGroupTreeModelUIBean.java index 97ff9a8..66ef285 100644 --- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/navigation/group/ResourceGroupTreeModelUIBean.java +++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/navigation/group/ResourceGroupTreeModelUIBean.java @@ -100,7 +100,7 @@ public class ResourceGroupTreeModelUIBean { Set<ResourceTreeNode> memberNodes = new HashSet<ResourceTreeNode>();
for (Integer member : members) { - memberNodes.add(ResourceTreeModelUIBean.load(member.intValue(), resources, true)); + memberNodes.add(ResourceTreeModelUIBean.load(member.intValue(), resources)); }
ResourceGroupTreeNode root = new ResourceGroupTreeNode(group, null); diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/navigation/resource/ResourceTreeModelUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/navigation/resource/ResourceTreeModelUIBean.java index 794dc61..2f1bd6f 100644 --- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/navigation/resource/ResourceTreeModelUIBean.java +++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/navigation/resource/ResourceTreeModelUIBean.java @@ -90,13 +90,13 @@ public class ResourceTreeModelUIBean {
start = System.currentTimeMillis(); monitorId = HibernatePerformanceMonitor.get().start(); - rootNode = load(rootResource.getId(), resources, true); + rootNode = load(rootResource.getId(), resources); end = System.currentTimeMillis(); HibernatePerformanceMonitor.get().stop(monitorId, "ResourceTree tree construction"); log.debug("Constructed tree in " + (end - start)); }
- public static ResourceTreeNode load(int rootId, List<ResourceFlyweight> resources, boolean alwaysGroup) { + public static ResourceTreeNode load(int rootId, List<ResourceFlyweight> resources) { ResourceFlyweight found = null; for (ResourceFlyweight res : resources) { if (res.getId() == rootId) { @@ -105,12 +105,11 @@ public class ResourceTreeModelUIBean { } ResourceTreeNode root = new ResourceTreeNode(found); long start = System.currentTimeMillis(); - load(root, alwaysGroup); + load(root); return root; }
- public static void load(ResourceTreeNode parentNode, boolean alwaysGroup) { - + public static void load(ResourceTreeNode parentNode) { if (parentNode.getData() instanceof ResourceFlyweight) { ResourceFlyweight parentResource = (ResourceFlyweight) parentNode.getData();
@@ -119,76 +118,51 @@ public class ResourceTreeModelUIBean { if (res.getResourceType().getSubCategory() != null) { // These are children that have subcategories // Split them by if they are a sub-sub category or just a category - if (res.getResourceType().getSubCategory().getParentSubCategory() == null) { - if (children.containsKey(res.getResourceType().getSubCategory())) { - children.get(res.getResourceType().getSubCategory()).add(res); - } else { - ArrayList<ResourceFlyweight> list = new ArrayList<ResourceFlyweight>(); - list.add(res); - children.put(res.getResourceType().getSubCategory(), list); - } - } else if (res.getResourceType().getSubCategory().getParentSubCategory() != null) { - if (children.containsKey(res.getResourceType().getSubCategory().getParentSubCategory())) { - children.get(res.getResourceType().getSubCategory().getParentSubCategory()).add(res); - } else { - ArrayList<ResourceFlyweight> list = new ArrayList<ResourceFlyweight>(); - list.add(res); - children.put(res.getResourceType().getSubCategory().getParentSubCategory(), list); - } + ResourceSubCategoryFlyweight categoryKey = res.getResourceType().getSubCategory().getParentSubCategory(); + if (categoryKey == null) { + categoryKey = res.getResourceType().getSubCategory(); } + addToList(children, categoryKey, res); } else { // These are children without categories of the parent resource // - Add them into groupings by their resource type - if (children.containsKey(res.getResourceType())) { - children.get(res.getResourceType()).add(res); - } else { - ArrayList<ResourceFlyweight> list = new ArrayList<ResourceFlyweight>(); - list.add(res); - children.put(res.getResourceType(), list); - } + addToList(children, res.getResourceType(), res); }
} - - Set<String> dupResourceTypeNames = getDuplicateResourceTypeNames(children, alwaysGroup); - - for (Object rsc : children.keySet()) { - if (rsc != null - && (rsc instanceof ResourceSubCategoryFlyweight || children.get(rsc).size() > 1 || (alwaysGroup && children - .get(rsc).size() == 1))) { - double avail = 0; - List<ResourceFlyweight> entries = children.get(rsc); - for (ResourceFlyweight res : entries) { - avail += res.getCurrentAvailability().getAvailabilityType() == AvailabilityType.UP ? 1 : 0; - } - avail = avail / entries.size(); - - AutoGroupCompositeFlyweight agc = null; - if (rsc instanceof ResourceSubCategoryFlyweight) { - agc = new AutoGroupCompositeFlyweight(avail, parentResource, (ResourceSubCategoryFlyweight) rsc, entries.size()); - } else if (rsc instanceof ResourceTypeFlyweight) { - boolean isDupResourceTypeName = dupResourceTypeNames.contains(((ResourceTypeFlyweight) rsc).getName()); - agc = new AutoGroupCompositeFlyweight(avail, parentResource, (ResourceTypeFlyweight) rsc, entries.size(), + + Set<String> dupResourceTypeNames = getDuplicateResourceTypeNames(children); + + for(Map.Entry<Object, List<ResourceFlyweight>> entry : children.entrySet()) { + Object key = entry.getKey(); + List<ResourceFlyweight> resources = entry.getValue(); + + double avail = 0; + for (ResourceFlyweight res : resources) { + avail += res.getCurrentAvailability().getAvailabilityType() == AvailabilityType.UP ? 1 : 0; + } + avail = avail / resources.size(); + + Object nodeData = null; + if (key instanceof ResourceSubCategoryFlyweight) { + nodeData = new AutoGroupCompositeFlyweight(avail, parentResource, (ResourceSubCategoryFlyweight) key, resources.size()); + } else if (key instanceof ResourceTypeFlyweight) { + ResourceTypeFlyweight typeKey = (ResourceTypeFlyweight) key; + + if (typeKey.isSingleton()) { + nodeData = resources.get(0); + } else { + boolean isDupResourceTypeName = dupResourceTypeNames.contains(typeKey.getName()); + nodeData = new AutoGroupCompositeFlyweight(avail, parentResource, typeKey, resources.size(), isDupResourceTypeName); } - ResourceTreeNode node = new ResourceTreeNode(agc, parentNode); - load(node, alwaysGroup); - - if (!recursivelyLocked(node)) { - parentNode.getChildren().add(node); - } - } else { - List<ResourceFlyweight> entries = children.get(rsc); - for (ResourceFlyweight res : entries) { - ResourceTreeNode node = new ResourceTreeNode(res, parentNode); - - load(node, alwaysGroup); - if (!recursivelyLocked(node)) { - parentNode.getChildren().add(node); - } - } } + ResourceTreeNode node = new ResourceTreeNode(nodeData, parentNode); + load(node);
+ if (!recursivelyLocked(node)) { + parentNode.getChildren().add(node); + } } } else { // ##################################################################################### @@ -207,72 +181,62 @@ public class ResourceTreeModelUIBean { && compositeParent.getParentResource().equals(res.getParentResource())) {
// A subSubCategory in a subcategory - if (children.containsKey(res.getResourceType().getSubCategory())) { - children.get(res.getResourceType().getSubCategory()).add(res); - } else { - ArrayList<ResourceFlyweight> list = new ArrayList<ResourceFlyweight>(); - list.add(res); - children.put(res.getResourceType().getSubCategory(), list); - } + addToList(children, res.getResourceType().getSubCategory(), res); } else if (compositeParent.getSubcategory().equals(res.getResourceType().getSubCategory()) && compositeParent.getParentResource().equals(res.getParentResource())) { // Direct entries in a subcategory... now group them by autogroup (type) - if (children.containsKey(res.getResourceType())) { - children.get(res.getResourceType()).add(res); - } else { - ArrayList<ResourceFlyweight> list = new ArrayList<ResourceFlyweight>(); - list.add(res); - children.put(res.getResourceType(), list); - } + addToList(children, res.getResourceType(), res); } } else if (compositeParent.getResourceType() != null) { if (compositeParent.getResourceType().equals(res.getResourceType()) && compositeParent.getParentResource().getId() == res.getParentResource().getId()) { - if (children.containsKey(res.getResourceType())) { - children.get(res.getResourceType()).add(res); - } else { - ArrayList<ResourceFlyweight> list = new ArrayList<ResourceFlyweight>(); - list.add(res); - children.put(res.getResourceType(), list); - } + + addToList(children, res.getResourceType(), res); } } } }
- for (Object rsc : children.keySet()) { - if (rsc != null - && (rsc instanceof ResourceSubCategoryFlyweight || ((children.get(rsc).size() > 1 || (alwaysGroup && children - .get(rsc).size() == 1)) && ((AutoGroupCompositeFlyweight) parentNode.getData()).getSubcategory() != null))) { + AutoGroupCompositeFlyweight compositeParentNode = (AutoGroupCompositeFlyweight) parentNode.getData(); + + for (Map.Entry<Object, List<ResourceFlyweight>> entry : children.entrySet()) { + Object key = entry.getKey(); + List<ResourceFlyweight> resources = entry.getValue(); + + if (compositeParentNode.getSubcategory() != null) { double avail = 0; - List<ResourceFlyweight> entries = children.get(rsc); - for (ResourceFlyweight res : entries) { + for (ResourceFlyweight res : resources) { avail += res.getCurrentAvailability().getAvailabilityType() == AvailabilityType.UP ? 1 : 0; } - avail = avail / entries.size(); - - AutoGroupCompositeFlyweight agc = null; - if (rsc instanceof ResourceSubCategoryFlyweight) { - agc = new AutoGroupCompositeFlyweight(avail, compositeParent.getParentResource(), - (ResourceSubCategoryFlyweight) rsc, entries.size()); - } else if (rsc instanceof ResourceTypeFlyweight) { - agc = new AutoGroupCompositeFlyweight(avail, compositeParent.getParentResource(), (ResourceTypeFlyweight) rsc, - entries.size(), false); + avail = avail / resources.size(); + + Object nodeData = null; + if (key instanceof ResourceSubCategoryFlyweight) { + nodeData = new AutoGroupCompositeFlyweight(avail, compositeParent.getParentResource(), + (ResourceSubCategoryFlyweight) key, resources.size()); + } else if (key instanceof ResourceTypeFlyweight) { + ResourceTypeFlyweight typeKey = (ResourceTypeFlyweight) key; + if (typeKey.isSingleton()) { + nodeData = resources.get(0); + } else { + nodeData = new AutoGroupCompositeFlyweight(avail, compositeParent.getParentResource(), typeKey, + resources.size(), false); + } } - ResourceTreeNode node = new ResourceTreeNode(agc, parentNode); - load(node, alwaysGroup); + ResourceTreeNode node = new ResourceTreeNode(nodeData, parentNode); + load(node); + if (!recursivelyLocked(node)) { parentNode.getChildren().add(node); } } else { - List<ResourceFlyweight> entries = children.get(rsc); - for (ResourceFlyweight res : entries) { + for (ResourceFlyweight res : resources) { ResourceTreeNode node = new ResourceTreeNode(res, parentNode); - load(node, alwaysGroup); + load(node); if (!recursivelyLocked(node)) { parentNode.getChildren().add(node); } - } + } } } } @@ -316,13 +280,11 @@ public class ResourceTreeModelUIBean { this.nodeTitle = nodeTitle; }
- private static Set<String> getDuplicateResourceTypeNames(Map<Object, List<ResourceFlyweight>> children, boolean alwaysGroup) { - Set<String> resourceTypeNames = new HashSet(); - Set<String> dupResourceTypeNames = new HashSet(); + private static Set<String> getDuplicateResourceTypeNames(Map<Object, List<ResourceFlyweight>> children) { + Set<String> resourceTypeNames = new HashSet<String>(); + Set<String> dupResourceTypeNames = new HashSet<String>(); for (Object rsc : children.keySet()) { - if (rsc != null - && (rsc instanceof ResourceTypeFlyweight && (children.get(rsc).size() > 1 || (alwaysGroup && children.get(rsc) - .size() == 1)))) { + if (rsc instanceof ResourceTypeFlyweight) { String resourceTypeName = ((ResourceTypeFlyweight) rsc).getName(); if (resourceTypeNames.contains(resourceTypeName)) { dupResourceTypeNames.add(resourceTypeName); @@ -332,4 +294,15 @@ public class ResourceTreeModelUIBean { } return dupResourceTypeNames; } + + private static <K, V> void addToList(Map<K, List<V>> mapOfLists, K key, V value) { + List<V> list = mapOfLists.get(key); + + if (list == null) { + list = new ArrayList<V>(); + mapOfLists.put(key, list); + } + + list.add(value); + } } 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 687585b..5fbbaa6 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 @@ -1759,7 +1759,7 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage + " SELECT res.id, res.uuid, res.name, res.resourceKey, " // + " parent.id, parent.name, " // + " currentAvail.availabilityType, " // - + " type.id, type.name, type.plugin, type.category, " // + + " type.id, type.name, type.plugin, type.singleton, type.category, " // + " subCategory.id, subCategory.name, " // + " parentSubCategory.id, parentSubCategory.name " // + " FROM Resource res " // @@ -1829,6 +1829,7 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage Integer typeId = (Integer) prefetched[i++]; String typeName = (String) prefetched[i++]; String typePlugin = (String) prefetched[i++]; + Boolean typeSingleton = (Boolean) prefetched[i++]; ResourceCategory typeCategory = (ResourceCategory) prefetched[i++];
Integer subCategoryId = (Integer) prefetched[i++]; @@ -1843,7 +1844,7 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage }
//we don't need the resource type reference here, only in the cache - flyweightCache.constructResourceType(typeId, typeName, typePlugin, typeCategory, subCategoryId); + flyweightCache.constructResourceType(typeId, typeName, typePlugin, typeSingleton, typeCategory, subCategoryId);
ResourceFlyweight resourceFlyweight = flyweightCache.constructResource( resourceId, resourceName, resourceUuid, resourceKey, parentId, typeId, availType); @@ -1863,7 +1864,7 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage + " SELECT res.id, res.uuid, res.name, res.resourceKey, " // + " parent.id, parent.name, " // + " currentAvail.availabilityType, " // - + " type.id, type.name, type.plugin, type.category, " // + + " type.id, type.name, type.plugin, type.singleton, type.category, " // + " subCategory.id, subCategory.name, " // + " parentSubCategory.id, parentSubCategory.name " // + " FROM Resource res " //