View Javadoc

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      // TODO check for other occurences for this constants and maybe place somewhere else?
39      public static final String LIST_ISSUES_PAGE_TITLE_KEY = "itracker.web.listissues.title";
40      // request attribute names
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          // get the services
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          // get the request parameters
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          // get some values
93          int status = (userPrefs.getShowClosedOnIssueList() ? IssueUtilities.STATUS_END : IssueUtilities.STATUS_CLOSED);
94  
95          // do some service calls
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         // prepare PTOs
101         List<IssuePTO> issuePTOs = new ArrayList<IssuePTO>();
102 
103         // do some more order processing
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         // start copying from Models to PTOs
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             // TODO: check from here...
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             // TODO: check to here...
203 
204             issuePTOs.add(issuePTO);
205         }
206 
207         // populate the request
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 }