40 import javax.servlet.http.HttpServletRequest; |
40 import javax.servlet.http.HttpServletRequest; |
41 import javax.servlet.http.HttpServletResponse; |
41 import javax.servlet.http.HttpServletResponse; |
42 import java.io.IOException; |
42 import java.io.IOException; |
43 import java.sql.Date; |
43 import java.sql.Date; |
44 import java.sql.SQLException; |
44 import java.sql.SQLException; |
45 import java.util.ArrayList; |
|
46 import java.util.NoSuchElementException; |
45 import java.util.NoSuchElementException; |
47 import java.util.Optional; |
46 import java.util.Optional; |
48 import java.util.stream.Collectors; |
47 import java.util.stream.Collectors; |
49 import java.util.stream.Stream; |
48 import java.util.stream.Stream; |
50 |
49 |
64 private static final String PARAMETER_SELECTED_VERSION = "vid"; |
63 private static final String PARAMETER_SELECTED_VERSION = "vid"; |
65 |
64 |
66 @Override |
65 @Override |
67 protected String getResourceBundleName() { |
66 protected String getResourceBundleName() { |
68 return "localization.projects"; |
67 return "localization.projects"; |
69 } |
|
70 |
|
71 private String queryParams(Project p, Version v) { |
|
72 return String.format("pid=%d&vid=%d", |
|
73 p == null ? -1 : p.getId(), |
|
74 v == null ? -1 : v.getId() |
|
75 ); |
|
76 } |
|
77 |
|
78 /** |
|
79 * Creates the navigation menu. |
|
80 * |
|
81 * @param req the servlet request |
|
82 * @param viewModel the current view model |
|
83 */ |
|
84 private void setNavigationMenu(HttpServletRequest req, ProjectView viewModel) { |
|
85 final Project selectedProject = Optional.ofNullable(viewModel.getProjectInfo()).map(ProjectInfo::getProject).orElse(null); |
|
86 |
|
87 final var navigation = new ArrayList<MenuEntry>(); |
|
88 |
|
89 for (ProjectInfo plistInfo : viewModel.getProjectList()) { |
|
90 final var proj = plistInfo.getProject(); |
|
91 final var projEntry = new MenuEntry( |
|
92 proj.getName(), |
|
93 "projects/view?" + queryParams(proj, null) |
|
94 ); |
|
95 navigation.add(projEntry); |
|
96 if (proj.equals(selectedProject)) { |
|
97 final var projInfo = viewModel.getProjectInfo(); |
|
98 projEntry.setActive(true); |
|
99 |
|
100 // **************** |
|
101 // Versions Section |
|
102 // **************** |
|
103 { |
|
104 final var entry = new MenuEntry(1, |
|
105 new ResourceKey(getResourceBundleName(), "menu.versions"), |
|
106 "projects/view?" + queryParams(proj, null) |
|
107 ); |
|
108 navigation.add(entry); |
|
109 } |
|
110 |
|
111 final var level2 = new ArrayList<MenuEntry>(); |
|
112 { |
|
113 final var entry = new MenuEntry( |
|
114 new ResourceKey(getResourceBundleName(), "filter.none"), |
|
115 "projects/view?" + queryParams(proj, null) |
|
116 ); |
|
117 if (viewModel.getVersionFilter() == null) entry.setActive(true); |
|
118 level2.add(entry); |
|
119 } |
|
120 |
|
121 for (Version version : projInfo.getVersions()) { |
|
122 final var entry = new MenuEntry( |
|
123 version.getName(), |
|
124 "projects/view?" + queryParams(proj, version) |
|
125 ); |
|
126 if (version.equals(viewModel.getVersionFilter())) entry.setActive(true); |
|
127 level2.add(entry); |
|
128 } |
|
129 |
|
130 level2.forEach(e -> e.setLevel(2)); |
|
131 navigation.addAll(level2); |
|
132 } |
|
133 } |
|
134 |
|
135 setNavigationMenu(req, navigation); |
|
136 } |
68 } |
137 |
69 |
138 private int syncParamWithSession(HttpServletRequest req, String param, String attr) { |
70 private int syncParamWithSession(HttpServletRequest req, String param, String attr) { |
139 final var session = req.getSession(); |
71 final var session = req.getSession(); |
140 final var idParam = getParameter(req, Integer.class, param); |
72 final var idParam = getParameter(req, Integer.class, param); |
177 |
109 |
178 private ResponseType forwardView(HttpServletRequest req, ProjectView viewModel, String name) { |
110 private ResponseType forwardView(HttpServletRequest req, ProjectView viewModel, String name) { |
179 setViewModel(req, viewModel); |
111 setViewModel(req, viewModel); |
180 setContentPage(req, name); |
112 setContentPage(req, name); |
181 setStylesheet(req, "projects"); |
113 setStylesheet(req, "projects"); |
182 setNavigationMenu(req, viewModel); |
114 setNavigationMenu(req, "project-navmenu"); |
183 return ResponseType.HTML; |
115 return ResponseType.HTML; |
184 } |
116 } |
185 |
117 |
186 @RequestMapping(method = HttpMethod.GET) |
118 @RequestMapping(method = HttpMethod.GET) |
187 public ResponseType index(HttpServletRequest req, DataAccessObjects dao) throws SQLException { |
119 public ResponseType index(HttpServletRequest req, DataAccessObjects dao) throws SQLException { |
230 ownerId -> ownerId >= 0 ? new User(ownerId) : null |
162 ownerId -> ownerId >= 0 ? new User(ownerId) : null |
231 ).ifPresent(project::setOwner); |
163 ).ifPresent(project::setOwner); |
232 |
164 |
233 dao.getProjectDao().saveOrUpdate(project); |
165 dao.getProjectDao().saveOrUpdate(project); |
234 |
166 |
235 setRedirectLocation(req, "./projects/view?pid="+project.getId()); |
167 setRedirectLocation(req, "./projects/versions?pid="+project.getId()); |
236 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
168 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
237 LOG.debug("Successfully updated project {}", project.getName()); |
169 LOG.debug("Successfully updated project {}", project.getName()); |
238 |
170 |
239 return ResponseType.HTML; |
171 return ResponseType.HTML; |
240 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
172 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
268 detailView.updateDetails(issues, version); |
200 detailView.updateDetails(issues, version); |
269 |
201 |
270 return forwardView(req, viewModel, "project-details"); |
202 return forwardView(req, viewModel, "project-details"); |
271 } |
203 } |
272 |
204 |
|
205 @RequestMapping(requestPath = "versions", method = HttpMethod.GET) |
|
206 public ResponseType versions(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException { |
|
207 final var viewModel = new VersionsView(); |
|
208 populate(viewModel, req, dao); |
|
209 viewModel.setVersionFilter(null); |
|
210 |
|
211 final var projectInfo = viewModel.getProjectInfo(); |
|
212 if (projectInfo == null) { |
|
213 resp.sendError(HttpServletResponse.SC_NOT_FOUND, "No project selected."); |
|
214 return ResponseType.NONE; |
|
215 } |
|
216 |
|
217 final var issueDao = dao.getIssueDao(); |
|
218 final var issues = issueDao.list(projectInfo.getProject()); |
|
219 for (var issue : issues) issueDao.joinVersionInformation(issue); |
|
220 viewModel.update(projectInfo.getVersions(), issues); |
|
221 |
|
222 return forwardView(req, viewModel, "versions"); |
|
223 } |
|
224 |
273 @RequestMapping(requestPath = "versions/edit", method = HttpMethod.GET) |
225 @RequestMapping(requestPath = "versions/edit", method = HttpMethod.GET) |
274 public ResponseType editVersion(HttpServletRequest req, DataAccessObjects dao) throws SQLException { |
226 public ResponseType editVersion(HttpServletRequest req, DataAccessObjects dao) throws SQLException { |
275 final var viewModel = new VersionEditView(); |
227 final var viewModel = new VersionEditView(); |
276 populate(viewModel, req, dao); |
228 populate(viewModel, req, dao); |
277 |
229 |
295 getParameter(req, Integer.class, "ordinal").ifPresent(version::setOrdinal); |
247 getParameter(req, Integer.class, "ordinal").ifPresent(version::setOrdinal); |
296 version.setStatus(VersionStatus.valueOf(getParameter(req, String.class, "status").orElseThrow())); |
248 version.setStatus(VersionStatus.valueOf(getParameter(req, String.class, "status").orElseThrow())); |
297 dao.getVersionDao().saveOrUpdate(version); |
249 dao.getVersionDao().saveOrUpdate(version); |
298 |
250 |
299 // specifying the pid parameter will purposely reset the session selected version! |
251 // specifying the pid parameter will purposely reset the session selected version! |
300 setRedirectLocation(req, "./projects/view?pid=" + version.getProject().getId()); |
252 setRedirectLocation(req, "./projects/versions?pid=" + version.getProject().getId()); |
301 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
253 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
302 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
254 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
303 LOG.warn("Form validation failure: {}", ex.getMessage()); |
255 LOG.warn("Form validation failure: {}", ex.getMessage()); |
304 LOG.debug("Details:", ex); |
256 LOG.debug("Details:", ex); |
305 final var viewModel = new VersionEditView(); |
257 final var viewModel = new VersionEditView(); |