1 package org.itracker.web.actions.admin.project;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.Date;
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 import java.util.TreeSet;
12
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpSession;
15
16 import org.apache.log4j.Logger;
17 import org.apache.struts.action.ActionForward;
18 import org.apache.struts.action.ActionMapping;
19 import org.itracker.model.Component;
20 import org.itracker.model.CustomField;
21 import org.itracker.model.NameValuePair;
22 import org.itracker.model.PermissionType;
23 import org.itracker.model.Project;
24 import org.itracker.model.ProjectScript;
25 import org.itracker.model.Status;
26 import org.itracker.model.User;
27 import org.itracker.model.Version;
28 import org.itracker.services.ITrackerServices;
29 import org.itracker.services.ProjectService;
30 import org.itracker.services.UserService;
31 import org.itracker.services.util.CustomFieldUtilities;
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.forms.ProjectForm;
36 import org.itracker.web.ptos.ProjectScriptPTO;
37 import org.itracker.web.util.Constants;
38 import org.itracker.web.util.LoginUtilities;
39 import org.itracker.web.util.RequestHelper;
40 import org.itracker.web.util.ServletContextUtils;
41
42 public class EditProjectFormActionUtil {
43 private static final Logger log = Logger.getLogger(EditProjectFormActionUtil.class);
44
45 public class CustomFieldInfo {
46 private int id;
47 private String name;
48 private String type;
49
50 public CustomFieldInfo(Integer id, String customFieldName, String string) {
51 this.id = id; this.name = customFieldName; this.type = string;
52 }
53
54 public int getId() {
55 return id;
56 }
57 public void setId(int id) {
58 this.id = id;
59 }
60 public String getName() {
61 return name;
62 }
63 public void setName(String name) {
64 this.name = name;
65 }
66 public String getType() {
67 return type;
68 }
69 public void setType(String type) {
70 this.type = type;
71 }
72 }
73 public class VersionInfo {
74 private int id;
75 private String number;
76 private String description;
77 private Date lastModifiedDate;
78 private Long countIssuesByVersion;
79
80 public VersionInfo(int id, String number, String description,
81 Date lastModifiedDate, Long countIssuesByVersion) {
82 this.id = id;
83 this.number = number;
84 this.description = description;
85 this.lastModifiedDate = lastModifiedDate;
86 this.countIssuesByVersion = countIssuesByVersion;
87 }
88 public int getId() {
89 return id;
90 }
91 public void setId(int id) {
92 this.id = id;
93 }
94 public String getNumber() {
95 return number;
96 }
97 public void setNumber(String number) {
98 this.number = number;
99 }
100 public String getDescription() {
101 return description;
102 }
103 public void setDescription(String description) {
104 this.description = description;
105 }
106 public Date getDate() {
107 return lastModifiedDate;
108 }
109 public void setDate(Date lastModifiedDate) {
110 this.lastModifiedDate = lastModifiedDate;
111 }
112 public Long getCount() {
113 return countIssuesByVersion;
114 }
115 public void setCount(Long countIssuesByVersion) {
116 this.countIssuesByVersion = countIssuesByVersion;
117 }
118
119 }
120 public class ComponentInfo {
121 private int id;
122 private String name;
123 private String description;
124 private Date lastModifiedDate;
125 private Long countIssuesByComponent;
126
127 public ComponentInfo(Integer id, String name, String description,
128 Date lastModifiedDate, Long countIssuesByComponent) {
129 this.id = id;
130 this.name = name;
131 this.description = description;
132 this.lastModifiedDate = lastModifiedDate;
133 this.countIssuesByComponent = countIssuesByComponent;
134 }
135 public int getId() {
136 return id;
137 }
138 public void setId(int id) {
139 this.id = id;
140 }
141 public String getName() {
142 return name;
143 }
144 public void setName(String name) {
145 this.name = name;
146 }
147 public String getDescription() {
148 return description;
149 }
150 public void setDescription(String description) {
151 this.description = description;
152 }
153 public Date getDate() {
154 return lastModifiedDate;
155 }
156 public void setDate(Date date) {
157 this.lastModifiedDate = date;
158 }
159 public Long getCount() {
160 return countIssuesByComponent;
161 }
162 public void setCount(Long countIssuesByComponent) {
163 this.countIssuesByComponent = countIssuesByComponent;
164 }
165
166 }
167
168 public ActionForward init(ActionMapping mapping, HttpServletRequest request, ProjectForm form){
169 ITrackerServices itrackerServices = ServletContextUtils.getItrackerServices();
170 ProjectService projectService = itrackerServices.getProjectService();
171 UserService userService = itrackerServices.getUserService();
172
173 HttpSession session = request.getSession(true);
174 User user = (User) session.getAttribute(Constants.USER_KEY);
175 Boolean allowPermissionUpdate = userService.allowPermissionUpdates(user, null, UserUtilities.AUTH_TYPE_UNKNOWN, UserUtilities.REQ_SOURCE_WEB);
176
177
178 final Map<Integer, Set<PermissionType>> permissions = RequestHelper
179 .getUserPermissions(session);
180 Project project = (Project) session.getAttribute(Constants.PROJECT_KEY);
181 boolean isUpdate;
182
183 if (project == null) {
184 log.info("EditProjectAction: Forward: unauthorized");
185 return mapping.findForward("unauthorized");
186 }
187 else {
188 isUpdate = false;
189 if (!project.isNew()) {
190 isUpdate = true;
191 }
192 }
193 request.setAttribute("isUpdate", isUpdate);
194
195 setupTitle(request, form, projectService);
196
197
198 List<NameValuePair> statuses = new ArrayList<NameValuePair>();
199 statuses.add(new NameValuePair(ProjectUtilities.getStatusName(Status.ACTIVE, LoginUtilities.getCurrentLocale(request)), Integer.toString(Status.ACTIVE.getCode())));
200 statuses.add(new NameValuePair(ProjectUtilities.getStatusName(Status.VIEWABLE, LoginUtilities.getCurrentLocale(request)), Integer.toString(Status.VIEWABLE.getCode())));
201 statuses.add(new NameValuePair(ProjectUtilities.getStatusName(Status.LOCKED, LoginUtilities.getCurrentLocale(request)), Integer.toString(Status.LOCKED.getCode())));
202 request.setAttribute("statuses", statuses);
203
204 Set<User> owners = new TreeSet<User>(User.NAME_COMPARATOR);
205 if (!project.isNew()) {
206 owners.addAll(userService.getUsersWithProjectPermission(project.getId(), UserUtilities.PERMISSION_VIEW_ALL));
207 } else {
208 owners.addAll(userService.getSuperUsers());
209 }
210 owners.addAll(project.getOwners());
211 request.setAttribute("owners", owners);
212
213 boolean allowPermissionUpdateOption = allowPermissionUpdate == null?false
214 :allowPermissionUpdate && UserUtilities.hasPermission(permissions, new Integer(-1), UserUtilities.PERMISSION_USER_ADMIN);
215 request.setAttribute("allowPermissionUpdateOption", allowPermissionUpdateOption);
216
217 if (project.isNew()) {
218 List<User> users = new ArrayList<User>();
219 List<User> activeUsers = userService.getActiveUsers();
220 Collections.sort(activeUsers, User.NAME_COMPARATOR);
221 for (int i = 0; i < activeUsers.size(); i++) {
222 if (owners.contains(activeUsers.get(i))) {
223 continue;
224 }
225 users.add(activeUsers.get(i));
226 }
227 request.setAttribute("users", users);
228 }
229
230
231
232
233 List<NameValuePair> permissionNames = UserUtilities.getPermissionNames(LoginUtilities.getCurrentLocale(request));
234 request.setAttribute("permissions", permissionNames);
235
236 request.setAttribute("optionSupressHistoryHtml", Integer.toString(ProjectUtilities.OPTION_SURPRESS_HISTORY_HTML));
237 request.setAttribute("optionPredefinedResolutions", Integer.toString(ProjectUtilities.OPTION_PREDEFINED_RESOLUTIONS));
238 request.setAttribute("optionAllowAssignToClose", Integer.toString(ProjectUtilities.OPTION_ALLOW_ASSIGN_TO_CLOSE));
239 request.setAttribute("optionAllowSefRegisteredCreate", Integer.toString(ProjectUtilities.OPTION_ALLOW_SELF_REGISTERED_CREATE));
240 request.setAttribute("optionLiteralHistoryHtml", Integer.toString(ProjectUtilities.OPTION_LITERAL_HISTORY_HTML));
241 request.setAttribute("optionNoAttachments", Integer.toString(ProjectUtilities.OPTION_NO_ATTACHMENTS));
242 request.setAttribute("optionAllowSelfRegisteredViewAll", Integer.toString(ProjectUtilities.OPTION_ALLOW_SELF_REGISTERED_VIEW_ALL));
243
244 List<CustomField> customFields = IssueUtilities.getCustomFields();
245
246
247
248 List<CustomFieldInfo> fieldInfos = new ArrayList<CustomFieldInfo>(customFields.size());
249 Iterator<CustomField> fieldsIt = customFields.iterator();
250 CustomField ci;
251 while (fieldsIt.hasNext()) {
252 ci = (CustomField) fieldsIt.next();
253 fieldInfos.add(new CustomFieldInfo( ci.getId(),
254 CustomFieldUtilities.getCustomFieldName(ci.getId(), LoginUtilities.getCurrentLocale(request)),
255 CustomFieldUtilities.getTypeString(ci.getFieldType(), LoginUtilities.getCurrentLocale(request))));
256 }
257
258 request.setAttribute("customFields", fieldInfos);
259
260
261
262
263 List<ProjectScript> scripts = project.getScripts();
264 Collections.sort(scripts, ProjectScript.FIELD_PRIORITY_COMPARATOR);
265
266 Locale locale = LoginUtilities.getCurrentLocale(request);
267 Iterator<ProjectScript> it = scripts.iterator();
268
269 List<ProjectScriptPTO> scriptPTOs = new ArrayList<ProjectScriptPTO>(scripts.size());
270 while (it.hasNext()) {
271 ProjectScriptPTO projectScript = new ProjectScriptPTO(it.next(), locale);
272 scriptPTOs.add(projectScript);
273 }
274 request.setAttribute("projectScripts", scriptPTOs);
275
276 List<Version> versions = project.getVersions();
277 Collections.sort(versions, new Version.VersionComparator());
278 List<VersionInfo> vis = new ArrayList<VersionInfo>();
279
280 for (Version v: versions)
281 vis.add(new VersionInfo(v.getId(), v.getNumber(), v.getDescription(), v.getLastModifiedDate(), projectService.countIssuesByVersion(v.getId())));
282 request.setAttribute("versions", vis);
283
284 List<Component> components = project.getComponents();
285 Collections.sort(components);
286 List<ComponentInfo> cis = new ArrayList<ComponentInfo>();
287
288 for (Component c: components)
289 cis.add(new ComponentInfo(c.getId(), c.getName(), c.getDescription(), c.getLastModifiedDate(), projectService.countIssuesByComponent(c.getId())));
290 request.setAttribute("components", cis);
291 return null;
292 }
293
294
295
296
297
298
299
300 public void setupTitle(HttpServletRequest request, ProjectForm form, ProjectService projectService) {
301 String pageTitleKey;
302 String pageTitleArg = "";
303
304 if ("update".equals(((ProjectForm)form).getAction())) {
305 pageTitleKey = "itracker.web.admin.editproject.title.update";
306 if (form instanceof ProjectForm) {
307 Project project = projectService.getProject(((ProjectForm) form).getId());
308 if (null != project) {
309 pageTitleArg = project.getName();
310 }
311 }
312 } else {
313 ((ProjectForm)form).setAction("create");
314 pageTitleKey = "itracker.web.admin.editproject.title.create";
315 }
316 request.setAttribute("pageTitleKey", pageTitleKey);
317 request.setAttribute("pageTitleArg", pageTitleArg);
318 }
319
320 }