/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.enterprise.gui.navigation.group;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.resource.flyweight.AutoGroupCompositeFlyweight;
import org.rhq.core.domain.resource.flyweight.ResourceFlyweight;
import org.rhq.core.domain.resource.group.ClusterKey;
import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.gui.util.FacesContextUtility;
import org.rhq.enterprise.gui.navigation.resource.ResourceTreeModelUIBean;
import org.rhq.enterprise.gui.navigation.resource.ResourceTreeNode;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
import org.rhq.enterprise.server.util.HibernatePerformanceMonitor;
import org.rhq.enterprise.server.util.LookupUtil;
/**
* @author Greg Hinkle
*/
public class ResourceGroupTreeModelUIBean {
private final Log log = LogFactory.getLog(ResourceGroupTreeModelUIBean.class);
private ResourceGroupTreeNode rootNode = null;
private List<ResourceGroupTreeNode> children = new ArrayList<ResourceGroupTreeNode>();
private ResourceGroupManagerLocal groupManager = LookupUtil.getResourceGroupManager();
private ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
private String nodeTitle;
private void loadTree() {
Integer parentGroupId = FacesContextUtility.getOptionalRequestParameter("parentGroupId", Integer.class);
ResourceGroup parentGroup;
if (parentGroupId != null) {
parentGroup = groupManager.getResourceGroupById(EnterpriseFacesContextUtility.getSubject(), parentGroupId,
GroupCategory.COMPATIBLE);
} else {
parentGroup = EnterpriseFacesContextUtility.getResourceGroup();
if (parentGroup.getClusterResourceGroup() != null) {
parentGroup = parentGroup.getClusterResourceGroup();
}
}
long start = System.currentTimeMillis();
long monitorId = HibernatePerformanceMonitor.get().start();
List<ResourceFlyweight> resources = resourceManager.findResourcesByCompatibleGroup(EnterpriseFacesContextUtility
.getSubject(), parentGroup.getId(), PageControl.getUnlimitedInstance());
long end = System.currentTimeMillis();
HibernatePerformanceMonitor.get().stop(monitorId, "ResourceGroupTree group resources");
log.debug("Loaded " + resources.size() + " resources by group in " + (end - start));
start = System.currentTimeMillis();
monitorId = HibernatePerformanceMonitor.get().start();
List<Integer> members = resourceManager.findExplicitResourceIdsByResourceGroup(parentGroup.getId());
end = System.currentTimeMillis();
HibernatePerformanceMonitor.get().stop(monitorId, "ResourceGroupTree group members");
log.debug("Loaded " + members.size() + " members by group in " + (end - start));
start = System.currentTimeMillis();
monitorId = HibernatePerformanceMonitor.get().start();
rootNode = load(parentGroup, resources, members);
end = System.currentTimeMillis();
HibernatePerformanceMonitor.get().stop(monitorId, "ResourceGroupTree tree construction");
log.debug("Constructed tree in " + (end - start));
}
private ResourceGroupTreeNode load(ResourceGroup group, List<ResourceFlyweight> resources, List<Integer> members) {
Set<ResourceTreeNode> memberNodes = new HashSet<ResourceTreeNode>();
for (Integer member : members) {
memberNodes.add(ResourceTreeModelUIBean.load(member.intValue(), resources));
}
ResourceGroupTreeNode root = new ResourceGroupTreeNode(group, null);
root.setClusterKey(new ClusterKey(group.getId()));
root.addMembers(memberNodes);
load(root, memberNodes);
return root;
}
private void load(ResourceGroupTreeNode parentNode, Set<ResourceTreeNode> resources) {
Map<Object, ResourceGroupTreeNode> children = new HashMap<Object, ResourceGroupTreeNode>();
for (ResourceTreeNode childNode : parentNode.getMembers()) {
for (ResourceTreeNode node : childNode.getChildren()) {
Object level = node.getData();
if (level instanceof AutoGroupCompositeFlyweight) {
AutoGroupCompositeFlyweight agc = (AutoGroupCompositeFlyweight) level;
Object key = agc.getResourceType() != null ? agc.getResourceType() : agc.getSubcategory();
ResourceGroupTreeNode childGroupNode = children.get(key);
if (childGroupNode == null) {
childGroupNode = new ResourceGroupTreeNode(level, parentNode);
children.put(key, childGroupNode);
}
childGroupNode.addMember(node);
childGroupNode.setClusterKey(parentNode.getClusterKey());
} else if (level instanceof ResourceFlyweight) {
ResourceFlyweight res = (ResourceFlyweight) level;
ClusterKey parentKey = parentNode.getClusterKey();
ClusterKey key = null;
if (parentKey == null) {
key = new ClusterKey(((ResourceGroup) parentNode.getData()).getId(), res.getResourceType()
.getId(), res.getResourceKey());
} else {
key = new ClusterKey(parentKey, res.getResourceType().getId(), res.getResourceKey());
}
ResourceGroupTreeNode childGroupNode = children.get(key);
if (childGroupNode == null) {
childGroupNode = new ResourceGroupTreeNode(key, parentNode);
childGroupNode.setClusterKey(key);
children.put(key, childGroupNode);
}
childGroupNode.addMember(node);
}
}
}
parentNode.addChildren(children.values());
for (ResourceGroupTreeNode child : children.values()) {
Set<ResourceTreeNode> childChildren = new HashSet<ResourceTreeNode>();
for (ResourceTreeNode childChild : child.getMembers()) {
childChildren.addAll(childChild.getChildren());
}
if (childChildren.size() > 0)
load(child, childChildren);
}
}
public List<ResourceGroupTreeNode> getRoots() {
if (rootNode == null) {
long start = System.currentTimeMillis();
loadTree();
log.debug("Loaded full tree in " + (System.currentTimeMillis() - start));
}
List<ResourceGroupTreeNode> roots = new ArrayList<ResourceGroupTreeNode>();
roots.add(this.rootNode);
return roots;
}
public List<ResourceGroupTreeNode> getChildren() {
return children;
}
public String getNodeTitle() {
return nodeTitle;
}
public void setNodeTitle(String nodeTitle) {
this.nodeTitle = nodeTitle;
}
}