View Javadoc

1   /*
2    * This software was designed and created by Jason Carroll.
3    * Copyright (c) 2002, 2003, 2004 Jason Carroll.
4    * The author can be reached at jcarroll@cowsultants.com
5    * ITracker website: http://www.cowsultants.com
6    * ITracker forums: http://www.cowsultants.com/phpBB/index.php
7    *
8    * This program is free software; you can redistribute it and/or modify
9    * it only under the terms of the GNU General Public License as published by
10   * the Free Software Foundation; either version 2 of the License, or
11   * (at your option) any later version.
12   *
13   * This program is distributed in the hope that it will be useful,
14   * but WITHOUT ANY WARRANTY; without even the implied warranty of
15   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   * GNU General Public License for more details.
17   */
18  
19  package org.itracker.web.actions.issuesearch;
20  
21  import java.io.IOException;
22  import java.util.ArrayList;
23  import java.util.Collections;
24  import java.util.List;
25  import java.util.Map;
26  import java.util.Set;
27  
28  import javax.servlet.ServletException;
29  import javax.servlet.http.HttpServletRequest;
30  import javax.servlet.http.HttpServletResponse;
31  import javax.servlet.http.HttpSession;
32  
33  import org.apache.commons.beanutils.PropertyUtils;
34  import org.apache.log4j.Logger;
35  import org.apache.struts.action.ActionForm;
36  import org.apache.struts.action.ActionForward;
37  import org.apache.struts.action.ActionMapping;
38  import org.apache.struts.action.ActionMessage;
39  import org.apache.struts.action.ActionMessages;
40  import org.apache.struts.validator.ValidatorForm;
41  import org.itracker.model.IssueSearchQuery;
42  import org.itracker.model.PermissionType;
43  import org.itracker.model.Project;
44  import org.itracker.model.UserPreferences;
45  import org.itracker.services.ProjectService;
46  import org.itracker.services.ReportService;
47  import org.itracker.services.UserService;
48  import org.itracker.services.util.IssueUtilities;
49  import org.itracker.services.util.UserUtilities;
50  import org.itracker.web.actions.base.ItrackerBaseAction;
51  import org.itracker.web.forms.SearchForm;
52  import org.itracker.web.util.Constants;
53  
54  public class SearchIssuesFormAction extends ItrackerBaseAction {
55  
56      private static final Logger log = Logger.getLogger(SearchIssuesFormAction.class);
57  
58      public ActionForward execute(ActionMapping mapping,
59                                   ActionForm form,
60                                   HttpServletRequest request,
61                                   HttpServletResponse response)
62              throws ServletException, IOException {
63  
64      	ActionMessages errors = new ActionMessages();
65  
66          HttpSession session = request.getSession();
67  
68          try {
69              ProjectService projectService = getITrackerServices().getProjectService();
70  
71              ReportService reportService = this.getITrackerServices().getReportService();
72              UserService userService = this.getITrackerServices().getUserService();
73              request.setAttribute("rh", reportService);
74              request.setAttribute("uh", userService);
75  
76              String pageTitleKey = "itracker.web.search.title";
77              String pageTitleArg = "";
78              request.setAttribute("pageTitleKey", pageTitleKey);
79              request.setAttribute("pageTitleArg", pageTitleArg);
80  
81              UserPreferences userPrefs = (UserPreferences) session.getAttribute(Constants.PREFERENCES_KEY);
82              Map<Integer, Set<PermissionType>> userPermissions = getUserPermissions(session);
83  
84              String projectId = request.getParameter("projectId");
85              String action = (String) PropertyUtils.getSimpleProperty((ValidatorForm) form, "action");
86  
87              SearchForm searchForm = (SearchForm) form;
88              if (searchForm == null) {
89                  searchForm = new SearchForm();
90              }
91  
92              boolean newQuery = false;
93              IssueSearchQuery query = (IssueSearchQuery) session.getAttribute(Constants.SEARCH_QUERY_KEY);
94  
95              log.debug("projectid = " + projectId);
96              log.debug("query type = " + (query == null ? "NULL" : query.getType().toString()));
97              log.debug("query projectid = " + (query == null ? "NULL" : query.getProjectId().toString()));
98  
99              if (query == null || query.getType() == null || "reset".equalsIgnoreCase(action) || (userPrefs != null && !userPrefs.getRememberLastSearch())) {
100                 log.debug("New search query.  No existing query, reset forced, or saved querys not allowed.");
101                 query = new IssueSearchQuery();
102                 query.setType(IssueSearchQuery.TYPE_FULL);
103                 newQuery = true;
104             } else if (query.getType().intValue() == IssueSearchQuery.TYPE_FULL.intValue() && projectId != null) {
105                 log.debug("New search query.  Previous query FULL, new query PROJECT.");
106                 query = new IssueSearchQuery();
107                 query.setType(IssueSearchQuery.TYPE_PROJECT);
108                 newQuery = true;
109             } else if (query.getType().intValue() == IssueSearchQuery.TYPE_PROJECT.intValue()) {
110                 if (projectId == null || projectId.equals("")) {
111                     log.debug("New search query.  Previous query PROJECT, new query FULL.");
112                     query = new IssueSearchQuery();
113                     query.setType(IssueSearchQuery.TYPE_FULL);
114                     newQuery = true;
115                 } else if (!projectId.equals(query.getProjectId().toString())) {
116                     log.debug("New search query.  Requested project (" + projectId + ") different from previous query (" + query.getProjectId().toString() + ")");
117                     query = new IssueSearchQuery();
118                     query.setType(IssueSearchQuery.TYPE_PROJECT);
119                     newQuery = true;
120                 }
121             }
122 
123             query.setAvailableProjects(null);
124 
125             List<Project> projects = projectService.getAllAvailableProjects();
126 
127             List<Project> availableProjectsList = new ArrayList<Project>();
128             List<Integer> selectedProjectsList = new ArrayList<Integer>();
129 
130             for (int i = 0; i < projects.size(); i++) {
131                 if (!UserUtilities.hasPermission(userPermissions, projects.get(i).getId(), UserUtilities.PERMISSION_VIEW_ALL) &&
132                         !UserUtilities.hasPermission(userPermissions, projects.get(i).getId(), UserUtilities.PERMISSION_VIEW_USERS)) {
133                     continue;
134                 }
135 
136                 log.debug("Adding project " + projects.get(i).getId() + " to list of available projects.");
137                 availableProjectsList.add(projects.get(i));
138 
139                 if (projectId != null && projects.get(i).getId().toString().equals(projectId)) {
140                     query.setType(IssueSearchQuery.TYPE_PROJECT);
141                     query.setProject(projects.get(i));
142                     break;
143                 } else {
144                     for (int j = 0; j < query.getProjects().size(); j++) {
145                         if (query.getProjects().get(j).equals(projects.get(i).getId())) {
146                             selectedProjectsList.add(projects.get(i).getId());
147                             break;
148                         }
149                     }
150                 }
151             }
152 
153             if (!availableProjectsList.isEmpty()) {
154                 log.debug("Issue Search has " + availableProjectsList.size() + " available projects.");
155 
156                 Collections.sort(availableProjectsList, new Project.ProjectComparator());
157                 query.setAvailableProjects(availableProjectsList);
158                 if (query.getType().equals(IssueSearchQuery.TYPE_PROJECT)) {
159                     searchForm.setProject(query.getProjectId());
160                 }
161 
162                 if (newQuery) {
163                     log.debug("New search query.  Clearing results and setting defaults.");
164                     query.setResults(null);
165                     List<Integer> selectedStatusesIntegerList = new ArrayList<Integer>();
166                     for (int i = 0; i < IssueUtilities.getStatuses().size(); i++) {
167                         try {
168                             int statusNumber = Integer.parseInt(IssueUtilities.getStatuses().get(i).getValue());
169                             if (statusNumber < IssueUtilities.STATUS_CLOSED) {
170                                 selectedStatusesIntegerList.add(statusNumber);
171                             }
172                         } catch (Exception e) {
173                             log.debug("Invalid status entry: " + IssueUtilities.getStatuses().get(i));
174                         }
175                     }
176 
177                     Integer[] statusesArray = new Integer[selectedStatusesIntegerList.size()];
178                     selectedStatusesIntegerList.toArray(statusesArray);
179                     searchForm.setStatuses(statusesArray);
180 
181                     List<Integer> selectedSeverities = new ArrayList<Integer>();
182                     for (int i = 1; i <= IssueUtilities.getNumberSeverities(); i++) {
183                         selectedSeverities.add(i);
184                     }
185 
186                     Integer[] severitiesArray = new Integer[selectedSeverities.size()];
187                     selectedSeverities.toArray(severitiesArray);
188                     searchForm.setSeverities(severitiesArray);
189                 } else {
190                     List<Integer> selectedProjects;
191                     selectedProjects = selectedProjectsList;
192                     query.setProjects(selectedProjects);
193 
194                     searchForm.setComponents(null);
195                     if (null != query.getComponents() && query.getComponents().size() > 0) {
196 	                    Integer[] componentsArray = new Integer[query.getComponents().size()];
197 	                    query.getComponents().toArray(componentsArray);
198 	                    searchForm.setComponents(componentsArray);
199                     }
200 
201                     searchForm.setCreator(null);
202                     if (null != query.getCreator()) {
203                     	searchForm.setCreator(query.getCreator().getId());
204                     }
205                     searchForm.setOwner(null);
206                     if (null != query.getOwner()) {
207                     	searchForm.setOwner(query.getOwner().getId());
208                     }
209                     searchForm.setOrderBy(query.getOrderBy());
210                     searchForm.setProject(query.getProjectId());
211 
212                     searchForm.setProjects(null);
213                     if (null != query.getProjects() && query.getProjects().size() > 0) {
214                     	Integer[] projectsArray = new Integer[query.getProjects().size()];
215                     	query.getProjects().toArray(projectsArray);
216                         searchForm.setProjects(projectsArray);
217                     }
218                     
219                     searchForm.setResolution(query.getResolution());
220 
221                     searchForm.setSeverities(null);
222                     if (null != query.getSeverities() && query.getSeverities().size() > 0) {
223 	                    Integer[] severitiesArray = new Integer[query.getSeverities().size()];
224 	                    query.getSeverities().toArray(severitiesArray);
225 	                    searchForm.setSeverities(severitiesArray);
226                     }
227 
228                     searchForm.setStatuses(null);
229                     if (null != query.getStatuses() && query.getStatuses().size() > 0) {
230 	                    Integer[] statusesArray = new Integer[query.getStatuses().size()];
231 	                    query.getStatuses().toArray(statusesArray);
232 	                    searchForm.setStatuses(statusesArray);
233                     }
234                     
235                     searchForm.setTargetVersion(query.getTargetVersion());
236                     searchForm.setTextphrase(query.getText());
237 
238                     searchForm.setVersions(null);
239                     if (query.getVersions() != null && query.getVersions().size() > 0) {
240 	                    Integer[] versionsArray = new Integer[query.getVersions().size()];
241 	                    query.getVersions().toArray(versionsArray);
242 	                    searchForm.setVersions(versionsArray);
243                     }
244 
245                 }
246 
247                 request.setAttribute("searchForm", searchForm);
248 
249                 session.setAttribute(Constants.SEARCH_QUERY_KEY, query);
250 
251             } else {
252                 errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("itracker.web.error.noprojects"));
253             }
254 
255             if (errors.isEmpty()) {
256                 return mapping.getInputForward();
257             }
258         } catch (Exception e) {
259             log.error("Exception while creating search issues form.", e);
260             errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("itracker.web.error.system"));
261         }
262 
263         if (!errors.isEmpty()) {
264         	saveErrors(request, errors);
265         }
266 
267         return mapping.findForward("error");
268     }
269 
270 }