1 package org.itracker.web.actions.project;
2
3 import java.net.URL;
4 import java.util.ArrayList;
5 import java.util.Collections;
6 import java.util.Iterator;
7 import java.util.List;
8 import java.util.Locale;
9 import java.util.Map;
10 import java.util.Set;
11
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpSession;
14
15 import org.apache.log4j.Logger;
16 import org.apache.struts.action.Action;
17 import org.apache.struts.action.ActionForward;
18 import org.apache.struts.action.ActionMapping;
19 import org.itracker.core.resources.ITrackerResources;
20 import org.itracker.model.Issue;
21 import org.itracker.model.PermissionType;
22 import org.itracker.model.Project;
23 import org.itracker.model.Status;
24 import org.itracker.model.User;
25 import org.itracker.model.UserPreferences;
26 import org.itracker.services.IssueService;
27 import org.itracker.services.ProjectService;
28 import org.itracker.services.util.IssueUtilities;
29 import org.itracker.services.util.UserUtilities;
30 import org.itracker.web.actions.base.ItrackerBaseAction;
31 import org.itracker.web.ptos.IssuePTO;
32 import org.itracker.web.util.RequestHelper;
33 import org.itracker.web.util.ServletContextUtils;
34
35 public class ListIssuesActionUtil {
36 private static final Logger log = Logger.getLogger(ListIssuesActionUtil.class);
37
38
39 public static final String LIST_ISSUES_PAGE_TITLE_KEY = "itracker.web.listissues.title";
40
41 public static final String ATT_NAME_PAGE_TITLE_KEY = "pageTitleKey";
42 public static final String ATT_NAME_PAGE_TITLE_ARG = "pageTitleArg";
43 public static final String ATT_NAME_HAS_ORDER_PARAM = "hasOrderParam";
44 public static final String ATT_NAME_START = "start";
45
46 public static final String ATT_NAME_ORDER_PARAM = "orderParam";
47
48 public static final String ATT_NAME_ISSUE_PTOS = "issuePTOs";
49 public static final String ATT_NAME_PROJECT = "project";
50 public static final String ATT_NAME_PROJCET_ID = "projectId";
51 public static final String ATT_NAME_HAS_ISSUES = "hasIssues";
52 public static final String ATT_NAME_HAS_VIEW_ALL = "hasViewAll";
53 public static final String ATT_NAME_NUM_VIEWABLE = "numViewable";
54 public static final String ATT_NAME_K = "k";
55 public static final String ATT_NAME_UNASSIGNED = "itracker_web_generic_unassigned";
56
57 public static final String SES_ATT_NAME_CURRENT__USER = "currUser";
58 public static final String SES_ATT_NAME_PREFERENCES = "preferences";
59 public static final String PARAM_NAME_PROJECT_ID = "projectId";
60
61
62 public static final String PARAM_NAME_START = "start";
63 public static final String PARAM_NAME_ORDER = "order";
64
65 public static final String ORDER_KEY_ID = "id";
66 public static final String ORDER_KEY_SEVERITY = "sev";
67 public static final String ORDER_KEY_STATUS = "stat";
68 public static final String ORDER_KEY_LAST_MODIFIED = "lm";
69 public static final String ORDER_KEY_OWNER_AND_STATUS = "own";
70
71
72 public static final String RES_KEY_UNASSIGNED = "itracker.web.generic.unassigned";
73 public static final String RES_KEY_UNKNOWN = "itracker.web.generic.unknown";
74
75 public static final String FWD_LIST_ISSUES = "list_issues";
76
77 public ActionForward init(Action action, ActionMapping mapping, HttpServletRequest request) {
78
79 Locale locale = ((ItrackerBaseAction) action).getLocale(request);
80
81 IssueService issueService = ServletContextUtils.getItrackerServices().getIssueService();
82 ProjectService projectService = ServletContextUtils.getItrackerServices().getProjectService();
83 User um = (User) request.getSession().getAttribute(ListIssuesActionUtil.SES_ATT_NAME_CURRENT__USER);
84 Integer currUserId = um.getId();
85 HttpSession session = request.getSession(true);
86 Map<Integer, Set<PermissionType>> userPermissions = RequestHelper.getUserPermissions(session);
87
88 UserPreferences userPrefs = (UserPreferences) request.getSession().getAttribute(ListIssuesActionUtil.SES_ATT_NAME_PREFERENCES);
89 Integer projectId = Integer.valueOf(request.getParameter(ListIssuesActionUtil.PARAM_NAME_PROJECT_ID) == null ? "-1" : (request.getParameter(ListIssuesActionUtil.PARAM_NAME_PROJECT_ID)));
90 log.info("execute: " + ListIssuesActionUtil.PARAM_NAME_PROJECT_ID + " was: " + projectId);
91
92
93 int status = (userPrefs.getShowClosedOnIssueList() ? IssueUtilities.STATUS_END : IssueUtilities.STATUS_CLOSED);
94
95
96 Project project = projectService.getProject(projectId);
97 log.info("execute: projectModel_Name: " + project.getName());
98 List<Issue> listIssues = issueService.getIssuesByProjectId(projectId, status);
99 log.info("execute: issues found for this project: " + listIssues.size());
100
101 List<IssuePTO> issuePTOs = new ArrayList<IssuePTO>();
102
103
104 boolean hasOrderParam = false;
105 String order = "";
106 String orderParam = request.getParameter(ListIssuesActionUtil.PARAM_NAME_ORDER);
107 if (orderParam == null || "".equals(orderParam)) {
108 order = userPrefs.getSortColumnOnIssueList();
109 orderParam = "";
110 } else {
111 hasOrderParam = true;
112 order = orderParam;
113 }
114
115 if (ListIssuesActionUtil.ORDER_KEY_ID.equals(order)) {
116 Collections.sort(listIssues, Issue.ID_COMPARATOR);
117 } else if (ListIssuesActionUtil.ORDER_KEY_SEVERITY.equals(order)) {
118 Collections.sort(listIssues, Issue.SEVERITY_COMPARATOR);
119 } else if (ListIssuesActionUtil.ORDER_KEY_STATUS.equals(order)) {
120 Collections.sort(listIssues, Issue.STATUS_COMPARATOR);
121 } else if (ListIssuesActionUtil.ORDER_KEY_LAST_MODIFIED.equals(order)) {
122 Collections.sort(listIssues, Collections.reverseOrder(
123 Issue.LAST_MODIFIED_DATE_COMPARATOR));
124 } else if (ListIssuesActionUtil.ORDER_KEY_OWNER_AND_STATUS.equals(order)) {
125 Collections.sort(listIssues, Issue.OWNER_AND_STATUS_COMPARATOR);
126 } else {
127 Collections.sort(listIssues, Issue.STATUS_COMPARATOR);
128 }
129
130 int start = 0;
131 String startString = request.getParameter(ListIssuesActionUtil.PARAM_NAME_START);
132 if (startString != null) {
133 try {
134 start = Integer.parseInt(startString);
135 } catch (NumberFormatException nfe) {
136 }
137 }
138 int numViewable = 0;
139 boolean hasIssues = false;
140 boolean hasViewAll = UserUtilities.hasPermission(userPermissions, project.getId(), UserUtilities.PERMISSION_VIEW_ALL);
141
142 if (hasViewAll) {
143 numViewable = listIssues.size();
144 } else {
145 for (int i = 0; i < listIssues.size(); i++) {
146 if (IssueUtilities.canViewIssue(listIssues.get(i), currUserId, userPermissions)) {
147 numViewable++;
148 }
149 }
150 }
151 int row = 0;
152 int k = 0;
153 Iterator<Issue> issuesIt = listIssues.iterator();
154
155 Issue issue;
156 IssuePTO issuePTO;
157 String statusLocalizedString, severityLocalizedString, componentsSize;
158
159 while (issuesIt.hasNext()) {
160
161 issue = issuesIt.next();
162 issuePTO = new IssuePTO(issue);
163
164 statusLocalizedString = IssueUtilities.getStatusName(issue.getStatus(), locale);
165 severityLocalizedString = IssueUtilities.getSeverityName(issue.getSeverity(), locale);
166 if (issue.getComponents().size() == 0) {
167 componentsSize = ITrackerResources.getString(
168 ListIssuesActionUtil.RES_KEY_UNKNOWN, locale);
169 } else {
170 componentsSize = issue.getComponents().get(0).getName()
171 + (issue.getComponents().size() > 1 ? " (+)" : "");
172 }
173 issuePTO.setStatusLocalizedString(statusLocalizedString);
174 issuePTO.setSeverityLocalizedString(severityLocalizedString);
175 issuePTO.setComponentsSize(componentsSize);
176 if (issue.getOwner() == null) {
177 issuePTO.setUnassigned(true);
178 }
179
180 if (project.getStatus() == Status.ACTIVE && !IssueUtilities.hasIssueNotification(issue, project, currUserId)) {
181 issuePTO.setUserHasIssueNotification(true);
182 }
183 if (project.getStatus() == Status.ACTIVE) {
184 if (IssueUtilities.canEditIssue(issue, currUserId, userPermissions)) {
185 issuePTO.setUserCanEdit(true);
186 }
187 }
188
189
190 if (!hasViewAll && !IssueUtilities.canViewIssue(issue, currUserId, userPermissions)) {
191 continue;
192 }
193 hasIssues = true;
194 if (start > 0 && k < start) {
195 k++;
196 continue;
197 }
198 if (userPrefs.getNumItemsOnIssueList() > 0 && row >= userPrefs.getNumItemsOnIssueList()) {
199 break;
200 }
201 row++;
202
203
204 issuePTOs.add(issuePTO);
205 }
206
207
208 request.setAttribute(ListIssuesActionUtil.ATT_NAME_HAS_ORDER_PARAM, new Boolean(hasOrderParam));
209 request.setAttribute(ListIssuesActionUtil.ATT_NAME_START, start);
210 request.setAttribute(ListIssuesActionUtil.ATT_NAME_ORDER_PARAM, orderParam);
211 request.setAttribute(ListIssuesActionUtil.ATT_NAME_ISSUE_PTOS, issuePTOs);
212 request.setAttribute(ListIssuesActionUtil.ATT_NAME_PROJECT, project);
213 request.setAttribute(ListIssuesActionUtil.ATT_NAME_PROJCET_ID, projectId);
214 request.setAttribute(ListIssuesActionUtil.ATT_NAME_HAS_ISSUES, hasIssues);
215 request.setAttribute(ListIssuesActionUtil.ATT_NAME_HAS_VIEW_ALL, hasViewAll);
216 request.setAttribute(ListIssuesActionUtil.ATT_NAME_NUM_VIEWABLE, numViewable);
217 request.setAttribute(ListIssuesActionUtil.ATT_NAME_K, k);
218
219
220 request.setAttribute("rssFeed", "/servlets/issues/p" + project.getId());
221
222 request.setAttribute(ListIssuesActionUtil.ATT_NAME_UNASSIGNED, ITrackerResources.getString(ListIssuesActionUtil.RES_KEY_UNASSIGNED, locale));
223 String pageTitleArg = project.getName();
224 request.setAttribute(ListIssuesActionUtil.ATT_NAME_PAGE_TITLE_KEY, ListIssuesActionUtil.LIST_ISSUES_PAGE_TITLE_KEY);
225 request.setAttribute(ListIssuesActionUtil.ATT_NAME_PAGE_TITLE_ARG, pageTitleArg);
226 final Map<Integer, Set<PermissionType>> permissions = RequestHelper.getUserPermissions(session);
227 boolean canCreateIssue = false;
228 if (project.getStatus() == Status.ACTIVE && UserUtilities.hasPermission(permissions, project.getId(), UserUtilities.PERMISSION_EDIT)) {
229 canCreateIssue = true;
230 }
231 request.setAttribute("canCreateIssue", canCreateIssue);
232
233 return null;
234 }
235
236 }