1 package org.itracker.web.actions.project;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.List;
6 import java.util.Locale;
7 import java.util.Map;
8 import java.util.Set;
9
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12 import javax.servlet.http.HttpSession;
13
14 import org.apache.log4j.Logger;
15 import org.apache.struts.action.ActionForm;
16 import org.apache.struts.action.ActionForward;
17 import org.apache.struts.action.ActionMapping;
18 import org.apache.struts.action.ActionMessage;
19 import org.apache.struts.action.ActionMessages;
20 import org.itracker.core.resources.ITrackerResources;
21 import org.itracker.model.Component;
22 import org.itracker.model.Issue;
23 import org.itracker.model.IssueAttachment;
24 import org.itracker.model.IssueHistory;
25 import org.itracker.model.PermissionType;
26 import org.itracker.model.Project;
27 import org.itracker.model.Status;
28 import org.itracker.model.User;
29 import org.itracker.model.Version;
30 import org.itracker.services.IssueService;
31 import org.itracker.services.NotificationService;
32 import org.itracker.services.util.IssueUtilities;
33 import org.itracker.services.util.ProjectUtilities;
34 import org.itracker.services.util.UserUtilities;
35 import org.itracker.web.actions.base.ItrackerBaseAction;
36 import org.itracker.web.util.RequestHelper;
37
38 public class ViewIssueAction extends ItrackerBaseAction {
39 private static final Logger log = Logger.getLogger(ViewIssueAction.class);
40
41 public ActionForward execute(ActionMapping mapping, ActionForm form,
42 HttpServletRequest request, HttpServletResponse response)
43 throws Exception {
44
45
46 IssueService issueService = this.getITrackerServices()
47 .getIssueService();
48
49 Locale locale = getLocale(request);
50
51 String pageTitleKey = "itracker.web.viewissue.title";
52 String pageTitleArg = request.getParameter("id");
53 request.setAttribute("pageTitleKey", pageTitleKey);
54 request.setAttribute("pageTitleArg", pageTitleArg);
55 Integer issueId;
56 try {
57 issueId = Integer.valueOf(request.getParameter("id"));
58 } catch (RuntimeException re) {
59 getErrors(request).add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("itracker.web.error.noissue"));
60 saveErrors(request, getErrors(request));
61 return mapping.findForward("index");
62 }
63 EditIssueActionUtil.setupNotificationsInRequest(request, issueService
64 .getIssue(issueId),
65 getITrackerServices().getNotificationService());
66
67 HttpSession session = request.getSession();
68 final Map<Integer, Set<PermissionType>> permissions = RequestHelper
69 .getUserPermissions(session);
70 User um = RequestHelper.getCurrentUser(session);
71
72 NotificationService notificationService = getITrackerServices().getNotificationService();
73
74 Issue issue = null;
75
76 Integer currUserId = um.getId();
77
78 try {
79 issueId = new Integer((request.getParameter("id") == null ? "-1"
80 : (request.getParameter("id"))));
81 issue = issueService.getIssue(issueId);
82 } catch (Exception ex) {
83 issue = null;
84 }
85 if (issue == null) {
86 this.getErrors(request).add(ActionMessages.GLOBAL_MESSAGE,
87 new ActionMessage("itracker.web.error.noissue"));
88 log.info("ViewIssueAction: Forward: error");
89 return mapping.findForward("error");
90 }
91 Project project = issue.getProject();
92 if (project != null && project.getStatus() != Status.ACTIVE
93 && project.getStatus() != Status.VIEWABLE) {
94 this.getErrors(request).add(ActionMessages.GLOBAL_MESSAGE,
95 new ActionMessage("itracker.web.error.projectlocked"));
96 log.info("ViewIssueAction: Forward: error");
97 return mapping.findForward("error");
98 } else {
99
100
101 boolean canViewIssue = IssueUtilities.canViewIssue(issue,
102 currUserId, permissions);
103
104 if (project == null || !canViewIssue) {
105 log.info("ViewIssueAction: Forward: unauthorized");
106 return mapping.findForward("unauthorized");
107 }
108 }
109
110
111
112
113 List<IssueHistory> issueHistories = issue.getHistory();
114 List<IssueHistory> histories = new ArrayList<IssueHistory>();
115 Collections.sort(issueHistories, IssueHistory.CREATE_DATE_COMPARATOR);
116 for (IssueHistory history : issueHistories) {
117 if (history.getStatus() == IssueUtilities.HISTORY_STATUS_AVAILABLE) {
118 histories.add(history);
119 }
120 }
121 if (project.getVersions() != null) {
122 Collections.sort(project.getVersions(), Version.VERSION_COMPARATOR);
123 }
124 if (issue.getComponents() != null && issue.getComponents().size() > 0) {
125 Collections.sort(issue.getComponents(), Component.NAME_COMPARATOR);
126 }
127 if (issue.getVersions() != null && issue.getVersions().size() > 0) {
128 Collections.sort(issue.getVersions(), new Version.VersionComparator());
129 }
130
131
132
133 List<IssueAttachment> attachments = issue.getAttachments();
134 Collections.sort(attachments, IssueAttachment.CREATE_DATE_COMPARATOR);
135
136
137
138 String issueStatusName = IssueUtilities.getStatusName(issue.getStatus(), locale);
139
140
141
142 String issueSeverityName = IssueUtilities.getSeverityName(issue.getSeverity(), locale);
143
144
145
146 EditIssueActionUtil.setupProjectFieldsMapJspEnv(project.getCustomFields(), issue.getFields(), request);
147
148
149
150
151 request.setAttribute("issueId", issueId);
152 request.setAttribute("issue", issue);
153 request.setAttribute("attachments", attachments);
154 request.setAttribute("hasAttachmentOption", !ProjectUtilities
155 .hasOption(ProjectUtilities.OPTION_NO_ATTACHMENTS, project
156 .getOptions()));
157 request.setAttribute("histories", histories);
158 request.setAttribute("project", project);
159 request.setAttribute("hasIssueNotification", !notificationService.hasIssueNotification(
160 issue, currUserId));
161 request.setAttribute("canEditIssue", IssueUtilities.canEditIssue(issue,
162 currUserId, permissions));
163
164 request.setAttribute("rssFeed", "/servlets/issues/p" + project.getId() + "/i" + issue.getId());
165
166 request.setAttribute("canCreateIssue",
167 (project.getStatus() == Status.ACTIVE && UserUtilities
168 .hasPermission(permissions, project.getId(),
169 UserUtilities.PERMISSION_CREATE)));
170 request.setAttribute("issueStatusName",issueStatusName);
171 request.setAttribute("issueSeverityName",issueSeverityName);
172 request.setAttribute("issueOwnerName",(issue.getOwner() == null ? ITrackerResources.getString("itracker.web.generic.unassigned", locale) : issue.getOwner().getFirstName() + " " + issue.getOwner().getLastName()) );
173
174 log.info("ViewIssueAction: Forward: viewissue");
175 return mapping.findForward("viewissue");
176
177 }
178 }