View Javadoc

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  		//  TODO: Action Cleanup
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  //		TODO verify this code.
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  			//User owner = issue.getOwner();
100 			//User creator = issue.getCreator();
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 		 * Get issue history, sort on create date.
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 		 * Get attachments of issue, and sort attachments on created date
132 		 */
133 		List<IssueAttachment> attachments = issue.getAttachments();
134 		Collections.sort(attachments, IssueAttachment.CREATE_DATE_COMPARATOR);
135 		/*
136 		 * Get the issue status name to display.
137 		 */
138 		String issueStatusName = IssueUtilities.getStatusName(issue.getStatus(), locale);
139 		/* Get issue severity name
140 		 *
141 		 */
142 		String issueSeverityName = IssueUtilities.getSeverityName(issue.getSeverity(), locale);
143 		/*
144 		 * Create Project field map
145 		 */
146 		EditIssueActionUtil.setupProjectFieldsMapJspEnv(project.getCustomFields(), issue.getFields(), request);
147 
148 		/*
149 		 * Set the objects in request that are required for ui render
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 }