1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 }