/*
* 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.util;
import java.util.Arrays;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.common.EntityContext;
import org.rhq.core.domain.util.OrderingField;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageOrdering;
import org.rhq.core.gui.util.FacesContextUtility;
import org.rhq.enterprise.gui.legacy.DefaultConstants;
import org.rhq.enterprise.gui.legacy.ParamConstants;
import org.rhq.enterprise.gui.legacy.WebUser;
import org.rhq.enterprise.gui.legacy.exception.ParameterNotFoundException;
import org.rhq.enterprise.gui.legacy.util.SessionUtils;
/**
* Utilities for the web tier. Named such so as not to clash with
* {@link org.rhq.enterprise.gui.legacy.util.RequestUtils}.
*
* @author Greg Hinkle
* @author Ian Springer
*/
public abstract class WebUtility {
private static final Log LOG = LogFactory.getLog(WebUtility.class.getName());
public static Integer getResourceId(ServletRequest request) {
String resourceIdString = request.getParameter(ParamConstants.CURRENT_RESOURCE_ID_PARAM);
if (resourceIdString == null || resourceIdString.equals("")) {
resourceIdString = request.getParameter(ParamConstants.RESOURCE_ID_PARAM);
}
Integer resourceId = null;
if (resourceIdString != null && !resourceIdString.equals("")) {
resourceId = Integer.parseInt(resourceIdString);
}
return resourceId;
}
public static Integer getResourceGroupId(ServletRequest request) {
String groupIdString = request.getParameter(ParamConstants.GROUP_ID_PARAM);
Integer groupId = null;
if (groupIdString != null && !groupIdString.equals("")) {
groupId = Integer.parseInt(groupIdString);
}
return groupId;
}
public static int[] getResourceIds(ServletRequest request) {
String[] resourceIdStrings = request.getParameterValues(ParamConstants.RESOURCE_ID_PARAM);
int[] ids;
if (resourceIdStrings == null) {
ids = new int[0];
} else {
ids = new int[resourceIdStrings.length];
for (int i = 0; i < resourceIdStrings.length; i++) {
ids[i] = Integer.parseInt(resourceIdStrings[i]);
}
}
return ids;
}
public static PageControl getPageControl(ServletRequest request) {
return getPageControl(request, null);
}
public static PageControl getPageControl(ServletRequest request, String postfix) {
// TODO GH: Add a mechanism to persist these settings in user preferences and default from there
if (postfix == null) {
postfix = "";
}
int pageNumber = getOptionalIntRequestParameter(request, ParamConstants.PAGENUM_PARAM + postfix,
DefaultConstants.PAGENUM_DEFAULT);
int pageSize = getOptionalIntRequestParameter(request, ParamConstants.PAGESIZE_PARAM + postfix,
DefaultConstants.PAGESIZE_DEFAULT);
// Make sure the user doesn't go around us and create huge pages
pageSize = Math.min(pageSize, PageControl.SIZE_MAX);
String sortOrderString = request.getParameter(ParamConstants.SORTORDER_PARAM + postfix);
PageOrdering sortOrder = PageOrdering.ASC;
if ((sortOrderString != null) && (sortOrderString.length() > 0)) {
try {
sortOrder = PageOrdering.valueOf(sortOrderString.toUpperCase());
} catch (RuntimeException e) {
throw new RuntimeException("Request parameter '" + ParamConstants.SORTORDER_PARAM + postfix
+ "' has an invalid value ('" + sortOrderString
+ "') - valid values are 'asc' or 'desc' (case-insensitive).");
}
}
String sortColumn = getOptionalRequestParameter(request, ParamConstants.SORTCOL_PARAM + postfix, null);
if (sortColumn != null) {
if (sortColumn.contains(" ") && !sortColumn.toLowerCase().endsWith(" desc")) {
throw new RuntimeException("This app is not vulnerable to SQL-injection attacks. Thanks for playing.");
}
}
return new PageControl(pageNumber, pageSize, new OrderingField(sortColumn, sortOrder));
}
public static int getResourceTypeId(HttpServletRequest request) throws ParameterNotFoundException {
return getRequiredIntRequestParameter(request, ParamConstants.RESOURCE_TYPE_ID_PARAM);
}
public static int getChildResourceTypeId(HttpServletRequest request) throws ParameterNotFoundException {
return getRequiredIntRequestParameter(request, ParamConstants.CHILD_RESOURCE_TYPE_ID_PARAM);
}
public static String getRequiredRequestParameter(ServletRequest request, String name) {
logWarningIfParameterHasMultipleValues(request, name);
String value = request.getParameter(name);
if (value == null) {
throw new ParameterNotFoundException("Required request parameter '" + name + "' does not exist.");
}
return value;
}
public static String getOptionalRequestParameter(ServletRequest request, String name, String defaultValue) {
logWarningIfParameterHasMultipleValues(request, name);
String value = request.getParameter(name);
return (value == null) ? defaultValue : value;
}
public static int getRequiredIntRequestParameter(ServletRequest request, String name) {
String value = getRequiredRequestParameter(request, name);
if (value.length() == 0) {
throw new ParameterNotFoundException("Required request parameter '" + name + "' has an empty value.");
}
int intValue;
try {
intValue = Integer.parseInt(value);
} catch (NumberFormatException e) {
throw new ParameterNotFoundException("Request parameter '" + name + "' has value '" + value
+ "', which is not a valid integer.");
}
return intValue;
}
public static int getOptionalIntRequestParameter(ServletRequest request, String name, int defaultValue) {
String value = request.getParameter(name);
return ((value != null) && (value.length() > 0)) ? Integer.parseInt(value) : defaultValue;
}
private static void logWarningIfParameterHasMultipleValues(ServletRequest request, String name) {
if ((request.getParameterValues(name) != null) && (request.getParameterValues(name).length > 1)) {
LOG.warn("More than one '" + name + "' request parameter exists - exactly one is required (values are "
+ Arrays.asList(request.getParameterValues(name)) + ").");
}
}
/**
* Return the subject of the current request
*
* @param request
*
* @return
*/
public static Subject getSubject(HttpServletRequest request) {
WebUser user = SessionUtils.getWebUser(request.getSession());
Subject subject = user.getSubject();
return subject;
}
/**
* Return the current {@link MetricsDisplayMode} for this request. We need this to as actions often need to call
* different code depending on the kind of metrics (single resource, compatible group, autogroup or definitions)
* they are working on
*
* @param request
*
* @return
*/
public static MetricsDisplayMode getMetricsDisplayMode(HttpServletRequest request) {
int resourceId = getOptionalIntRequestParameter(request, ParamConstants.RESOURCE_ID_PARAM, -1);
int groupId = getOptionalIntRequestParameter(request, ParamConstants.GROUP_ID_PARAM, -1);
int resourceTypeId = getOptionalIntRequestParameter(request, ParamConstants.RESOURCE_TYPE_ID_PARAM, -1);
int parent = getOptionalIntRequestParameter(request, "parent", -1);
// Find out what we want to configure
MetricsDisplayMode mode;
if (groupId > 0) {
mode = MetricsDisplayMode.COMPGROUP;
} else if ((resourceTypeId > 0) && (parent == -1)) {
mode = MetricsDisplayMode.RESOURCE_DEFAULT;
} else if (resourceId > 0) {
mode = MetricsDisplayMode.RESOURCE;
} else if ((resourceTypeId > 0) && (parent > 0)) {
mode = MetricsDisplayMode.AUTOGROUP;
} else {
mode = MetricsDisplayMode.UNSET;
if (LOG.isDebugEnabled())
LOG.debug("Unknown input parameter combination - we can't go on");
}
return mode;
}
public static EntityContext getEntityContext() {
HttpServletRequest request = FacesContextUtility.getRequest();
return getEntityContext(request);
}
public static EntityContext getEntityContext(HttpServletRequest request) {
int resourceId = WebUtility.getOptionalIntRequestParameter(request, ParamConstants.RESOURCE_ID_PARAM, -1);
int groupId = WebUtility.getOptionalIntRequestParameter(request, ParamConstants.GROUP_ID_PARAM, -1);
int parentResourceId = WebUtility.getOptionalIntRequestParameter(request,
ParamConstants.PARENT_RESOURCE_ID_PARAM, -1);
int resourceTypeId = WebUtility.getOptionalIntRequestParameter(request, ParamConstants.RESOURCE_TYPE_ID_PARAM,
-1);
return new EntityContext(resourceId, groupId, parentResourceId, resourceTypeId);
}
}