/*
* 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.Collections;
import java.util.List;
import org.richfaces.component.html.ContextMenu;
import org.richfaces.component.html.HtmlMenuGroup;
import org.richfaces.component.html.HtmlMenuItem;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.group.ClusterKey;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.gui.util.FacesContextUtility;
import org.rhq.enterprise.gui.common.tag.FunctionTagLibrary;
import org.rhq.enterprise.gui.navigation.contextmenu.MenuItemDescriptor;
import org.rhq.enterprise.gui.navigation.contextmenu.MetricMenuItemDescriptor;
import org.rhq.enterprise.gui.navigation.contextmenu.QuickLinksDescriptor;
import org.rhq.enterprise.gui.navigation.contextmenu.TreeContextMenuBase;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
import org.rhq.enterprise.server.measurement.MeasurementDefinitionManagerLocal;
import org.rhq.enterprise.server.operation.OperationManagerLocal;
import org.rhq.enterprise.server.resource.cluster.ClusterManagerLocal;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
/**
* @author Greg Hinkle
* @author Lukas Krejci
*/
public class ResourceGroupTreeContextMenuUIBean extends TreeContextMenuBase {
private ResourceGroup currentResourceGroup;
private String currentParentResourceGroupId;
private List<MenuItemDescriptor> menuItemDescriptorsForView;
private List<MetricMenuItemDescriptor> metricMenuItemDescriptorsForGraph;
private List<MenuItemDescriptor> menuItemDescriptorsForOperations;
private ResourceGroupManagerLocal groupManager = LookupUtil.getResourceGroupManager();
private ClusterManagerLocal clusterManager = LookupUtil.getClusterManager();
private OperationManagerLocal operationManager = LookupUtil.getOperationManager();
private MeasurementDefinitionManagerLocal measurementDefinitionManager = LookupUtil
.getMeasurementDefinitionManager();
@Override
protected void init() throws Exception {
Subject subject = EnterpriseFacesContextUtility.getSubject();
String clusterKeyString = FacesContextUtility.getOptionalRequestParameter("contextClusterKey");
String groupIdString = FacesContextUtility.getOptionalRequestParameter("contextGroupId");
currentParentResourceGroupId = FacesContextUtility.getOptionalRequestParameter("contextParentGroupId");
currentResourceGroup = null;
if (clusterKeyString != null) {
ClusterKey key = ClusterKey.valueOf(clusterKeyString);
currentResourceGroup = clusterManager.createAutoClusterBackingGroup(subject, key, false);
} else if (groupIdString != null) {
int groupId = Integer.parseInt(groupIdString);
currentResourceGroup = groupManager.getResourceGroupById(subject, groupId, null);
}
if (currentResourceGroup != null) {
List<MeasurementDefinition> definitions = measurementDefinitionManager
.findMeasurementDefinitionsByResourceType(subject, currentResourceGroup.getResourceType().getId(),
DataType.MEASUREMENT, null);
// operations menugroup, lazy-loaded entries because only name/id are needed for display
List<OperationDefinition> operations = operationManager.findSupportedResourceTypeOperations(subject,
currentResourceGroup.getResourceType().getId(), false);
menuItemDescriptorsForView = createViewMenuItemDescriptors(currentResourceGroup, definitions);
metricMenuItemDescriptorsForGraph = createGraphMenuItemDescriptors(currentResourceGroup, definitions);
menuItemDescriptorsForOperations = createOperationMenuItemDescriptors(currentResourceGroup.getId(),
currentParentResourceGroupId, operations);
} else {
menuItemDescriptorsForView = null;
metricMenuItemDescriptorsForGraph = null;
menuItemDescriptorsForOperations = null;
}
}
@Override
protected List<String> getMenuHeaders() {
return Collections.singletonList(currentResourceGroup.getName());
}
@Override
protected QuickLinksDescriptor getMenuQuickLinks() {
QuickLinksDescriptor descriptor = new QuickLinksDescriptor();
descriptor.setMenuItemId("menu_groupQuickLinks_" + currentResourceGroup.getId());
String attributes = "groupId=" + currentResourceGroup.getId();
if (currentParentResourceGroupId != null) {
attributes += "&parentGroupId=" + currentParentResourceGroupId;
}
descriptor.setMonitoringUrl("/rhq/group/monitor/graphs.xhtml?" + attributes);
descriptor.setInventoryUrl("/rhq/group/inventory/view.xhtml?" + attributes);
descriptor.setAlertsUrl("/rhq/group/alert/listGroupAlertDefinitions.xhtml?" + attributes);
descriptor.setConfigurationUrl("/rhq/group/configuration/viewCurrent.xhtml?" + attributes);
descriptor.setOperationUrl("/rhq/group/operation/groupOperationScheduleNew.xhtml?" + attributes);
descriptor.setEventUrl("/rhq/group/events/history.xhtml?" + attributes);
return descriptor;
}
@Override
protected List<MenuItemDescriptor> getViewChartsMenuItems() {
return menuItemDescriptorsForView;
}
@Override
protected List<MetricMenuItemDescriptor> getGraphToViewMenuItems() {
return metricMenuItemDescriptorsForGraph;
}
@Override
protected List<MenuItemDescriptor> getOperationsMenuItems() {
return menuItemDescriptorsForOperations;
}
@Override
protected int getResourceTypeId() {
return currentResourceGroup.getResourceType().getId();
}
@Override
protected boolean shouldCreateMenu() {
return currentResourceGroup != null && currentResourceGroup.getResourceType() != null;
}
@Override
protected void addAdditionalMenuItems(ContextMenu menu) {
List<Resource> resources = null;
if (currentResourceGroup.getClusterKey() != null) {
resources = clusterManager.getAutoClusterResources(EnterpriseFacesContextUtility.getSubject(), ClusterKey
.valueOf(currentResourceGroup.getClusterKey()));
} else {
resources = groupManager.findResourcesForResourceGroup(EnterpriseFacesContextUtility.getSubject(),
currentResourceGroup.getId(), null);
}
HtmlMenuGroup membersMenuItem = new HtmlMenuGroup();
membersMenuItem.setValue("Members");
membersMenuItem.setId("menu_groupMembers_" + currentResourceGroup.getId());
membersMenuItem.setStyle("color: black;");
for (Resource res : resources) {
HtmlMenuItem menuItem = new HtmlMenuItem();
menuItem.setValue(res.getName());
menuItem.setId("groupMember_" + res.getId());
String url = FunctionTagLibrary.getDefaultResourceTabURL() + "?id=" + res.getId();
menuItem.setSubmitMode("none");
menuItem.setOnclick("document.location.href='" + url + "'");
membersMenuItem.getChildren().add(menuItem);
}
menu.getChildren().add(membersMenuItem);
}
private List<MetricMenuItemDescriptor> createGraphMenuItemDescriptors(ResourceGroup group,
List<MeasurementDefinition> definitions) {
List<MetricMenuItemDescriptor> ret = new ArrayList<MetricMenuItemDescriptor>();
for (MeasurementDefinition definition : definitions) {
MetricMenuItemDescriptor descriptor = new MetricMenuItemDescriptor();
fillBasicMetricMenuItemDescriptor(descriptor, group.getId(), "measurementGraphMenuItem_", definition);
descriptor.setMetricToken("cg," + group.getId() + "," + definition.getId());
ret.add(descriptor);
}
return ret;
}
private List<MenuItemDescriptor> createViewMenuItemDescriptors(ResourceGroup group,
List<MeasurementDefinition> definitions) {
List<MenuItemDescriptor> ret = new ArrayList<MenuItemDescriptor>();
for (MeasurementDefinition definition : definitions) {
MenuItemDescriptor descriptor = new MenuItemDescriptor();
fillBasicMetricMenuItemDescriptor(descriptor, group.getId(), "measurementChartMenuItem_", definition);
ret.add(descriptor);
}
return ret;
}
private List<MenuItemDescriptor> createOperationMenuItemDescriptors(int groupId, String parentGroupId,
List<OperationDefinition> operations) {
List<MenuItemDescriptor> ret = new ArrayList<MenuItemDescriptor>();
for (OperationDefinition def : operations) {
MenuItemDescriptor descriptor = new MenuItemDescriptor();
descriptor.setMenuItemId("operation_" + def.getId());
descriptor.setName(def.getDisplayName());
String url = "/rhq/group/operation/groupOperationScheduleNew.xhtml";
url += "?opId=" + def.getId();
url += "&groupId=" + groupId;
if (parentGroupId != null) {
url += "&parentGroupId=" + parentGroupId;
}
descriptor.setUrl(url);
ret.add(descriptor);
}
return ret;
}
private void fillBasicMetricMenuItemDescriptor(MenuItemDescriptor descriptor, int groupId, String idPrefix,
MeasurementDefinition definition) {
descriptor.setMenuItemId(idPrefix + definition.getId());
descriptor.setName(definition.getDisplayName());
String url = "/resource/common/monitor/Visibility.do";
url += "?mode=chartSingleMetricSingleResource";
url += "&m=" + definition.getId();
url += "&groupId=" + groupId;
descriptor.setUrl(url);
}
}