SearchIssuesAction.java
/*
* This software was designed and created by Jason Carroll.
* Copyright (c) 2002, 2003, 2004 Jason Carroll.
* The author can be reached at jcarroll@cowsultants.com
* ITracker website: http://www.cowsultants.com
* ITracker forums: http://www.cowsultants.com/phpBB/index.php
*
* This program is free software; you can redistribute it and/or modify
* it only under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* 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.
*/
package org.itracker.web.actions.issuesearch;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.log4j.Logger;
import org.apache.struts.action.*;
import org.apache.struts.validator.ValidatorForm;
import org.itracker.IssueSearchException;
import org.itracker.model.Issue;
import org.itracker.model.IssueSearchQuery;
import org.itracker.model.PermissionType;
import org.itracker.model.User;
import org.itracker.services.ReportService;
import org.itracker.services.UserService;
import org.itracker.web.actions.base.ItrackerBaseAction;
import org.itracker.web.util.Constants;
import org.itracker.web.util.RequestHelper;
import org.itracker.web.util.ServletContextUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class SearchIssuesAction extends ItrackerBaseAction {
private static final Logger log = Logger
.getLogger(SearchIssuesAction.class);
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ActionMessages errors = new ActionMessages();
String pageTitleKey = "itracker.web.search.title";
String pageTitleArg = "";
request.setAttribute("pageTitleKey", pageTitleKey);
request.setAttribute("pageTitleArg", pageTitleArg);
HttpSession session = request.getSession();
User user = (User) session.getAttribute(Constants.USER_KEY);
Map<Integer, Set<PermissionType>> userPermissions = RequestHelper.getUserPermissions(session);
try {
ReportService reportService = ServletContextUtils.getItrackerServices()
.getReportService();
UserService userService = ServletContextUtils.getItrackerServices().getUserService();
request.setAttribute("rh", reportService);
request.setAttribute("uh", userService);
IssueSearchQuery isqm = (IssueSearchQuery) session
.getAttribute(Constants.SEARCH_QUERY_KEY);
if (isqm == null) {
return mapping.findForward("searchissues");
}
processQueryParameters(isqm, (ValidatorForm) form, errors);
if (errors.isEmpty()) {
List<Issue> results = ServletContextUtils.getItrackerServices().getIssueService()
.searchIssues(isqm, user, userPermissions);
if (log.isDebugEnabled()) {
log.debug("SearchIssuesAction received " + results.size()
+ " results to query.");
}
isqm.setResults(results);
log.debug("Setting search results with "
+ isqm.getResults().size() + " results");
session.setAttribute(Constants.SEARCH_QUERY_KEY, isqm);
}
} catch (IssueSearchException ise) {
if (ise.getType() == IssueSearchException.ERROR_NULL_QUERY) {
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
"itracker.web.error.nullsearch"));
} else {
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
"itracker.web.error.system"));
}
} catch (Exception e) {
log.error(e.getMessage(), e);
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
"itracker.web.error.system"));
}
if (!errors.isEmpty()) {
saveErrors(request, errors);
}
return mapping.getInputForward();
}
private IssueSearchQuery processQueryParameters(IssueSearchQuery isqm,
ValidatorForm form, ActionMessages errors) {
if (isqm == null) {
isqm = new IssueSearchQuery();
}
try {
Integer creatorValue = (Integer) PropertyUtils.getSimpleProperty(
form, "creator");
if (creatorValue != null && creatorValue.intValue() != -1) {
isqm.setCreator(ServletContextUtils.getItrackerServices().getUserService().getUser(
creatorValue));
} else {
isqm.setCreator(null);
}
Integer ownerValue = (Integer) PropertyUtils.getSimpleProperty(
form, "owner");
if (ownerValue != null && ownerValue.intValue() != -1) {
isqm.setOwner(ServletContextUtils.getItrackerServices().getUserService().getUser(
ownerValue));
} else {
isqm.setOwner(null);
}
String textValue = (String) PropertyUtils.getSimpleProperty(form,
"textphrase");
if (textValue != null && textValue.trim().length() > 0) {
isqm.setText(textValue.trim());
} else {
isqm.setText(null);
}
String resolutionValue = (String) PropertyUtils.getSimpleProperty(
form, "resolution");
if (resolutionValue != null && !resolutionValue.equals("")) {
isqm.setResolution(resolutionValue);
} else {
isqm.setResolution(null);
}
Integer[] projectsArray = (Integer[]) PropertyUtils
.getSimpleProperty(form, "projects");
List<Integer> projects = Arrays.asList(projectsArray);
if (projects == null || projects.size() == 0) {
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
"itracker.web.error.projectrequired"));
} else {
isqm.setProjects(projects);
}
Integer[] severitiesArray = (Integer[]) PropertyUtils
.getSimpleProperty(form, "severities");
if (severitiesArray != null && severitiesArray.length > 0) {
List<Integer> severities = Arrays.asList(severitiesArray);
isqm.setSeverities(severities);
} else {
isqm.setSeverities(null);
}
Integer[] statusesArray = (Integer[]) PropertyUtils
.getSimpleProperty(form, "statuses");
if (statusesArray != null && statusesArray.length > 0) {
List<Integer> statuses = Arrays.asList(statusesArray);
isqm.setStatuses(statuses);
} else {
isqm.setStatuses(null);
}
Integer[] componentsArray = (Integer[]) PropertyUtils
.getSimpleProperty(form, "components");
if (componentsArray != null && componentsArray.length > 0) {
List<Integer> components = Arrays.asList(componentsArray);
isqm.setComponents(components);
} else {
isqm.setComponents(null);
}
Integer[] versionsArray = (Integer[]) PropertyUtils
.getSimpleProperty(form, "versions");
if (versionsArray != null && versionsArray.length > 0) {
List<Integer> versions = Arrays.asList(versionsArray);
isqm.setVersions(versions);
} else {
isqm.setVersions(null);
}
Integer targetVersion = (Integer) PropertyUtils.getSimpleProperty(
form, "targetVersion");
if (targetVersion != null && targetVersion > 0) {
isqm.setTargetVersion(targetVersion);
} else {
isqm.setTargetVersion(null);
}
String orderBy = (String) PropertyUtils.getSimpleProperty(form,
"orderBy");
if (orderBy != null && !orderBy.equals("")) {
if (log.isDebugEnabled()) {
log
.debug("processQueryParameters: set orderBy: "
+ orderBy);
}
isqm.setOrderBy(orderBy);
}
Integer type = (Integer) PropertyUtils.getSimpleProperty(form,
"type");
if (type != null) {
if (log.isDebugEnabled()) {
log.debug("processQueryParameters: set type: " + type);
}
isqm.setType(type);
}
} catch (RuntimeException e) {
log.error(
"processQueryParameters: Unable to parse search query parameters: "
+ e.getMessage(), e);
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
"itracker.web.error.invalidsearchquery"));
} catch (IllegalAccessException e) {
log.error(
"processQueryParameters: Unable to parse search query parameters: "
+ e.getMessage(), e);
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
"itracker.web.error.invalidsearchquery"));
} catch (InvocationTargetException e) {
log.error(
"processQueryParameters: Unable to parse search query parameters: "
+ e.getMessage(), e);
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
"itracker.web.error.invalidsearchquery"));
} catch (NoSuchMethodException e) {
log.error(
"processQueryParameters: Unable to parse search query parameters: "
+ e.getMessage(), e);
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
"itracker.web.error.invalidsearchquery"));
}
return isqm;
}
}