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(a)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 " //