/*
* 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.legacy.action.resource.hub;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.LabelValueBean;
import org.apache.struts.util.MessageResources;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.plugin.Plugin;
import org.rhq.core.domain.resource.InventorySummary;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.legacy.Constants;
import org.rhq.enterprise.gui.legacy.HubConstants;
import org.rhq.enterprise.gui.legacy.Portal;
import org.rhq.enterprise.gui.legacy.WebUser;
import org.rhq.enterprise.gui.legacy.action.BaseAction;
import org.rhq.enterprise.gui.legacy.util.HubUtils;
import org.rhq.enterprise.gui.legacy.util.RequestUtils;
import org.rhq.enterprise.gui.legacy.util.SessionUtils;
import org.rhq.enterprise.gui.util.WebUtility;
import org.rhq.enterprise.server.util.LookupUtil;
/**
* An <code>Action</code> that sets up the resource hub page (ResourceHub.jsp).
*
* @author Ian Springer
*/
public class GroupHubPortalAction extends BaseAction {
private static final String ALL_PLATFORMS_KEY = "resource.hub.filter.AllPlatformTypes";
private static final String ALL_SERVERS_KEY = "resource.hub.filter.AllServerTypes";
private static final String ALL_SERVICES_KEY = "resource.hub.filter.AllServiceTypes";
public static final int SELECTOR_GROUP_COMPAT = 1;
public static final int SELECTOR_GROUP_ADHOC = 2;
protected Log log = LogFactory.getLog(GroupHubPortalAction.class);
/**
* Set up the Resource Hub portal.
*/
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
GroupHubForm hubForm = (GroupHubForm) form;
PageControl pageControl = WebUtility.getPageControl(request);
Subject subject = RequestUtils.getSubject(request);
HttpSession session = request.getSession();
WebUser user = SessionUtils.getWebUser(request.getSession());
// Setup whether we're displaying list view or chart view.
HubUtils.initView(hubForm, user);
// Find resources specified by category and potentially type.
// Collect query params and replace invalid ones with defaults.
String groupName = getGroupName(request, hubForm);
String resourceTypeName = HubConstants.ALL_RESOURCE_TYPES;
ResourceCategory resourceCategory = null;
if (hubForm.getResourceType() != null) {
/* resourceCategory and resourceType are mutually exclusive
*
* the user will either: 1) filter on a single type, 2) filter on a category (a.k.a "ALL ( Platforms | Server
* | Service ) Types") 3) or neither, meaning "All Groups" if the form's resourceType is null
*/
int typeId = 0;
try {
typeId = Integer.parseInt(hubForm.getResourceType().trim());
} catch (Exception e) {
}
if (typeId == -1) {
resourceCategory = ResourceCategory.PLATFORM;
} else if (typeId == -2) {
resourceCategory = ResourceCategory.SERVER;
} else if (typeId == -3) {
resourceCategory = ResourceCategory.SERVICE;
} else {
resourceTypeName = decode(hubForm.getResourceType());
if (resourceTypeName.equals("") || resourceTypeName.equals("ALL")) {
resourceTypeName = HubConstants.ALL_RESOURCE_TYPES;
}
}
}
String pluginName = hubForm.getPlugin();
if (pluginName != null && pluginName.trim().equals("")) {
pluginName = null;
}
if (pluginName != null) {
pluginName = decode(pluginName);
}
if (hubForm.getGroupCategory() == null) {
hubForm.setGroupCategory(HubConstants.DEFAULT_GROUP_CATEGORY);
}
GroupCategory groupCategory = GroupCategory.valueOf(hubForm.getGroupCategory());
PageList<ResourceGroupComposite> groups = getGroups(subject, groupCategory, resourceCategory, resourceTypeName,
pluginName, groupName, pageControl);
request.setAttribute(Constants.ALL_RESOURCES_ATTR, groups);
initGroupTypesPulldownMenu(request, hubForm, subject, groupCategory, groupName, resourceCategory,
resourceTypeName, pluginName);
initInventorySummary(subject, request);
SessionUtils.resetReturnPath(request.getSession());
Portal portal = Portal.createPortal("resource.hub.ResourceHubTitle", ".group.hub");
request.setAttribute(Constants.PORTAL_KEY, portal);
String navHierarchy = HubUtils.buildNavHierarchy(groupCategory.toString(), resourceTypeName);
request.setAttribute(Constants.INVENTORY_HIERARCHY_ATTR, navHierarchy);
return returnSuccess(request, mapping);
}
private void initInventorySummary(Subject user, HttpServletRequest request)
throws org.rhq.enterprise.server.auth.SessionNotFoundException,
org.rhq.enterprise.server.auth.SessionTimeoutException, java.rmi.RemoteException {
InventorySummary summary = LookupUtil.getResourceBoss().getInventorySummary(user);
request.setAttribute(Constants.RESOURCE_SUMMARY_ATTR, summary);
}
private String getGroupName(HttpServletRequest request, GroupHubForm hubForm) {
MessageResources res = getResources(request);
String jsInserted = res.getMessage("resource.hub.search.KeywordSearchText");
String groupName = hubForm.getKeywords();
if ((groupName != null) && (groupName.equals("") || groupName.equals(jsInserted))) {
groupName = HubConstants.DEFAULT_GROUP_NAME;
hubForm.setKeywords(groupName);
}
return groupName;
}
@SuppressWarnings("deprecation")
private void initGroupTypesPulldownMenu(HttpServletRequest request, GroupHubForm hubForm, Subject subject,
GroupCategory groupCategory, String nameFilter, ResourceCategory resourceCategory, String resourceTypeName,
String pluginName) throws Exception {
// Set the first entry in the menu to the label "All Group Types".
hubForm.addType(createMenuLabel(request, "resource.hub.filter.AllGroupTypes", "ALL"));
if (groupCategory == GroupCategory.COMPATIBLE) {
List<ResourceType> allResourceTypes = LookupUtil.getResourceTypeManager()
.getResourceTypesForCompatibleGroups(subject, pluginName);
Set<String> platformTypes = new TreeSet<String>();
Set<String> serverTypes = new TreeSet<String>();
Set<String> serviceTypes = new TreeSet<String>();
for (ResourceType type : allResourceTypes) {
ResourceCategory category = type.getCategory();
if (category == ResourceCategory.PLATFORM) {
platformTypes.add(type.getName());
} else if (category == ResourceCategory.SERVER) {
serverTypes.add(type.getName());
} else if (category == ResourceCategory.SERVICE) {
serviceTypes.add(type.getName());
} else {
throw new IllegalArgumentException("Unsupported ResourceCategory '" + category.name()
+ "' in GroupHubPortalAction.initGroupTypesPulldownMenu");
}
}
addResourceTypeMenuItems(hubForm, platformTypes, RequestUtils.message(request, ALL_PLATFORMS_KEY), "-1");
addResourceTypeMenuItems(hubForm, serverTypes, RequestUtils.message(request, ALL_SERVERS_KEY), "-2");
addResourceTypeMenuItems(hubForm, serviceTypes, RequestUtils.message(request, ALL_SERVICES_KEY), "-3");
hubForm.addPlugin(createMenuLabel(request, "resource.hub.filter.AllPlugins", ""));
List<Plugin> plugins = LookupUtil.getPluginManager().getPluginsByResourceTypeAndCategory(
resourceTypeName, resourceCategory);
for (Plugin plugin : plugins) {
hubForm.addPlugin(new LabelValueBean(plugin.getDisplayName(), encode(plugin.getName())));
}
}
}
public void addResourceTypeMenuItems(HubForm form, Set<String> typeNames, String headerLabel, String headerValue) {
if (!typeNames.isEmpty()) {
form.addType(new LabelValueBean("", ""));
form.addType(new LabelValueBean(headerLabel, headerValue));
for (String resourceTypeName : typeNames) {
form.addType(new LabelValueBean(resourceTypeName, encode(resourceTypeName)));
}
}
}
protected LabelValueBean createMenuLabel(HttpServletRequest req, String key, String value) {
MessageResources messages = getResources(req);
return new LabelValueBean(messages.getMessage(key), value);
}
private PageList<ResourceGroupComposite> getGroups(Subject subject, GroupCategory groupCategory,
ResourceCategory resourceCategory, String resourceTypeName, String pluginName, String nameFilter,
PageControl pageControl) throws Exception {
log.debug("Finding all " + groupCategory + "s with " + "resource category [" + resourceCategory + "] and "
+ "resource type [" + resourceTypeName + "] and " + "resource name [" + nameFilter + "]...");
PageList<ResourceGroupComposite> groups;
if ((groupCategory == GroupCategory.COMPATIBLE) || (groupCategory == GroupCategory.MIXED)) {
log.debug("getting compatible group list");
groups = LookupUtil.getResourceGroupManager().findResourceGroupComposites(subject, groupCategory,
resourceCategory, resourceTypeName, pluginName, nameFilter, null, null, pageControl);
} else {
throw new RuntimeException("ResourceHub doesn't currently support " + groupCategory.toString()
+ " groupCategory");
}
log.debug("found " + groups.size() + " groups");
return groups;
}
private String encode(String parameter) {
return parameter.replaceAll(" ", "_");
}
private String decode(String parameter) {
return parameter.replaceAll("_", " ");
}
}