View Javadoc

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 		// setup project-scripts
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 	 * Setup the title for the Project-Form Action
296 	 * @param request -  the servlet request
297 	 * @param form - must be a ProjectForm
298 	 * @param projectService - project-service
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 }