SearchIssuesFormAction.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.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.struts.action.*;
import org.itracker.model.IssueSearchQuery;
import org.itracker.model.PermissionType;
import org.itracker.model.Project;
import org.itracker.model.UserPreferences;
import org.itracker.model.util.IssueUtilities;
import org.itracker.model.util.UserUtilities;
import org.itracker.services.ProjectService;
import org.itracker.services.ReportService;
import org.itracker.services.UserService;
import org.itracker.web.actions.base.ItrackerBaseAction;
import org.itracker.web.forms.SearchForm;
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.util.*;
public class SearchIssuesFormAction extends ItrackerBaseAction {
private static final Logger log = Logger.getLogger(SearchIssuesFormAction.class);
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
ActionMessages errors = new ActionMessages();
HttpSession session = request.getSession();
try {
ProjectService projectService = ServletContextUtils.getItrackerServices().getProjectService();
ReportService reportService = ServletContextUtils.getItrackerServices().getReportService();
UserService userService = ServletContextUtils.getItrackerServices().getUserService();
request.setAttribute("rh", reportService);
request.setAttribute("uh", userService);
String projectId = request.getParameter("projectId");
UserPreferences userPrefs = (UserPreferences) session.getAttribute(Constants.PREFERENCES_KEY);
Map<Integer, Set<PermissionType>> userPermissions = RequestHelper.getUserPermissions(session);
String action = (String) PropertyUtils.getSimpleProperty(form, "action");
SearchForm searchForm = (SearchForm) form;
if (searchForm == null) {
searchForm = new SearchForm();
}
boolean newQuery = false;
IssueSearchQuery query = (IssueSearchQuery) session.getAttribute(Constants.SEARCH_QUERY_KEY);
log.debug("projectid = " + projectId);
log.debug("query type = " + (query == null ? "NULL" : query.getType().toString()));
log.debug("query projectid = " + (query == null ? "NULL" : query.getProjectId().toString()));
if (query == null || query.getType() == null || "reset".equalsIgnoreCase(action) || (userPrefs != null && !userPrefs.getRememberLastSearch())) {
log.debug("New search query. No existing query, reset forced, or saved querys not allowed.");
query = new IssueSearchQuery();
query.setType(IssueSearchQuery.TYPE_FULL);
newQuery = true;
} else if (query.getType().intValue() == IssueSearchQuery.TYPE_FULL.intValue() && projectId != null) {
log.debug("New search query. Previous query FULL, new query PROJECT.");
query = new IssueSearchQuery();
query.setType(IssueSearchQuery.TYPE_PROJECT);
newQuery = true;
} else if (query.getType().intValue() == IssueSearchQuery.TYPE_PROJECT.intValue()) {
if (projectId == null || projectId.equals("")) {
log.debug("New search query. Previous query PROJECT, new query FULL.");
query = new IssueSearchQuery();
query.setType(IssueSearchQuery.TYPE_FULL);
newQuery = true;
} else if (!projectId.equals(query.getProjectId().toString())) {
log.debug("New search query. Requested project (" + projectId + ") different from previous query (" + query.getProjectId().toString() + ")");
query = new IssueSearchQuery();
query.setType(IssueSearchQuery.TYPE_PROJECT);
newQuery = true;
}
}
query.setAvailableProjects(null);
List<Project> projects = projectService.getAllAvailableProjects();
List<Project> availableProjectsList = new ArrayList<Project>();
List<Integer> selectedProjectsList = new ArrayList<Integer>();
for (Project project : projects) {
if (!UserUtilities.hasPermission(userPermissions, project.getId(), PermissionType.ISSUE_VIEW_ALL) &&
!UserUtilities.hasPermission(userPermissions, project.getId(), PermissionType.ISSUE_VIEW_USERS)) {
continue;
}
log.debug("Adding project " + project.getId() + " to list of available projects.");
availableProjectsList.add(project);
if (projectId != null && StringUtils.equals(String.valueOf(project.getId()), projectId)) {
query.setType(IssueSearchQuery.TYPE_PROJECT);
query.setProject(project);
String pageTitleKey = "itracker.web.search.project.title";
String pageTitleArg = project.getName();
request.setAttribute("pageTitleKey", pageTitleKey);
request.setAttribute("pageTitleArg", pageTitleArg);
break;
} else {
if (query.getProjects().contains(project.getId())) {
selectedProjectsList.add(project.getId());
}
}
}
if (!availableProjectsList.isEmpty()) {
log.debug("Issue Search has " + availableProjectsList.size() + " available projects.");
Collections.sort(availableProjectsList, new Project.ProjectComparator());
query.setAvailableProjects(availableProjectsList);
if (query.getType().equals(IssueSearchQuery.TYPE_PROJECT)) {
searchForm.setProject(query.getProjectId());
}
if (newQuery) {
log.debug("New search query. Clearing results and setting defaults.");
query.setResults(null);
List<Integer> selectedStatusesIntegerList = new ArrayList<Integer>();
for (int i = 0; i < IssueUtilities.getStatuses().size(); i++) {
try {
int statusNumber = Integer.parseInt(IssueUtilities.getStatuses().get(i).getValue());
if (statusNumber < IssueUtilities.STATUS_CLOSED) {
selectedStatusesIntegerList.add(statusNumber);
}
} catch (Exception e) {
log.debug("Invalid status entry: " + IssueUtilities.getStatuses().get(i));
}
}
Integer[] statusesArray = new Integer[selectedStatusesIntegerList.size()];
selectedStatusesIntegerList.toArray(statusesArray);
searchForm.setStatuses(statusesArray);
List<Integer> selectedSeverities = new ArrayList<Integer>();
for (int i = 1; i <= IssueUtilities.getNumberSeverities(); i++) {
selectedSeverities.add(i);
}
Integer[] severitiesArray = new Integer[selectedSeverities.size()];
selectedSeverities.toArray(severitiesArray);
searchForm.setSeverities(severitiesArray);
} else {
List<Integer> selectedProjects;
selectedProjects = selectedProjectsList;
query.setProjects(selectedProjects);
searchForm.setComponents(null);
if (null != query.getComponents() && query.getComponents().size() > 0) {
Integer[] componentsArray = new Integer[query.getComponents().size()];
query.getComponents().toArray(componentsArray);
searchForm.setComponents(componentsArray);
}
searchForm.setCreator(null);
if (null != query.getCreator()) {
searchForm.setCreator(query.getCreator().getId());
}
searchForm.setOwner(null);
if (null != query.getOwner()) {
searchForm.setOwner(query.getOwner().getId());
}
searchForm.setOrderBy(query.getOrderBy());
searchForm.setProject(query.getProjectId());
searchForm.setProjects(null);
if (null != query.getProjects() && query.getProjects().size() > 0) {
Integer[] projectsArray = new Integer[query.getProjects().size()];
query.getProjects().toArray(projectsArray);
searchForm.setProjects(projectsArray);
}
searchForm.setResolution(query.getResolution());
searchForm.setSeverities(null);
if (null != query.getSeverities() && query.getSeverities().size() > 0) {
Integer[] severitiesArray = new Integer[query.getSeverities().size()];
query.getSeverities().toArray(severitiesArray);
searchForm.setSeverities(severitiesArray);
}
searchForm.setStatuses(null);
if (null != query.getStatuses() && query.getStatuses().size() > 0) {
Integer[] statusesArray = new Integer[query.getStatuses().size()];
query.getStatuses().toArray(statusesArray);
searchForm.setStatuses(statusesArray);
}
searchForm.setTargetVersion(query.getTargetVersion());
searchForm.setTextphrase(query.getText());
searchForm.setVersions(null);
if (query.getVersions() != null && query.getVersions().size() > 0) {
Integer[] versionsArray = new Integer[query.getVersions().size()];
query.getVersions().toArray(versionsArray);
searchForm.setVersions(versionsArray);
}
}
request.setAttribute("searchForm", searchForm);
session.setAttribute(Constants.SEARCH_QUERY_KEY, query);
} else {
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("itracker.web.error.noprojects"));
}
if (errors.isEmpty()) {
return mapping.getInputForward();
}
} catch (Exception e) {
log.error("Exception while creating search issues form.", e);
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("itracker.web.error.system"));
}
if (!errors.isEmpty()) {
saveErrors(request, errors);
}
return mapping.findForward("error");
}
}