28 */ |
28 */ |
29 package de.uapcore.lightpit.modules; |
29 package de.uapcore.lightpit.modules; |
30 |
30 |
31 |
31 |
32 import de.uapcore.lightpit.*; |
32 import de.uapcore.lightpit.*; |
33 import de.uapcore.lightpit.dao.DataAccessObjects; |
33 import de.uapcore.lightpit.dao.DaoProvider; |
34 import de.uapcore.lightpit.entities.*; |
34 import de.uapcore.lightpit.entities.*; |
35 import de.uapcore.lightpit.types.WebColor; |
35 import de.uapcore.lightpit.types.WebColor; |
36 import de.uapcore.lightpit.viewmodel.*; |
36 import de.uapcore.lightpit.viewmodel.*; |
37 import de.uapcore.lightpit.viewmodel.util.IssueSorter; |
37 import de.uapcore.lightpit.viewmodel.util.IssueSorter; |
38 import org.slf4j.Logger; |
38 import org.slf4j.Logger; |
70 } catch (NumberFormatException ex) { |
70 } catch (NumberFormatException ex) { |
71 return 0; |
71 return 0; |
72 } |
72 } |
73 } |
73 } |
74 |
74 |
75 private void populate(ProjectView viewModel, PathParameters pathParameters, DataAccessObjects dao) throws SQLException { |
75 private void populate(ProjectView viewModel, PathParameters pathParameters, DaoProvider dao) throws SQLException { |
76 final var projectDao = dao.getProjectDao(); |
76 final var projectDao = dao.getProjectDao(); |
77 final var versionDao = dao.getVersionDao(); |
77 final var versionDao = dao.getVersionDao(); |
78 final var componentDao = dao.getComponentDao(); |
78 final var componentDao = dao.getComponentDao(); |
79 |
79 |
80 projectDao.list().stream().map(ProjectInfo::new).forEach(viewModel.getProjectList()::add); |
80 projectDao.list().stream().map(ProjectInfo::new).forEach(viewModel.getProjectList()::add); |
95 |
95 |
96 // Select Version |
96 // Select Version |
97 final var versionNode = pathParameters.get("version"); |
97 final var versionNode = pathParameters.get("version"); |
98 if ("no-version".equals(versionNode)) { |
98 if ("no-version".equals(versionNode)) { |
99 viewModel.setVersionFilter(ProjectView.NO_VERSION); |
99 viewModel.setVersionFilter(ProjectView.NO_VERSION); |
100 } else if ("all-versions".equals(versionNode)) { |
100 } else if ("all-versions".equals(versionNode) || versionNode == null) { |
101 viewModel.setVersionFilter(ProjectView.ALL_VERSIONS); |
101 viewModel.setVersionFilter(ProjectView.ALL_VERSIONS); |
102 } else { |
102 } else { |
103 viewModel.setVersionFilter(versionDao.findByNode(project, versionNode)); |
103 viewModel.setVersionFilter(versionDao.findByNode(project, versionNode)); |
104 } |
104 } |
105 |
105 |
106 // Select Component |
106 // Select Component |
107 final var componentNode = pathParameters.get("component"); |
107 final var componentNode = pathParameters.get("component"); |
108 if ("no-component".equals(componentNode)) { |
108 if ("no-component".equals(componentNode)) { |
109 viewModel.setComponentFilter(ProjectView.NO_COMPONENT); |
109 viewModel.setComponentFilter(ProjectView.NO_COMPONENT); |
110 } else if ("all-components".equals(componentNode)) { |
110 } else if ("all-components".equals(componentNode) || componentNode == null) { |
111 viewModel.setComponentFilter(ProjectView.ALL_COMPONENTS); |
111 viewModel.setComponentFilter(ProjectView.ALL_COMPONENTS); |
112 } else { |
112 } else { |
113 viewModel.setComponentFilter(componentDao.findByNode(project, componentNode)); |
113 viewModel.setComponentFilter(componentDao.findByNode(project, componentNode)); |
114 } |
114 } |
115 } |
115 } |
131 setNavigationMenu(req, "project-navmenu"); |
131 setNavigationMenu(req, "project-navmenu"); |
132 renderSite(req, resp); |
132 renderSite(req, resp); |
133 } |
133 } |
134 |
134 |
135 @RequestMapping(method = HttpMethod.GET) |
135 @RequestMapping(method = HttpMethod.GET) |
136 public void index(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException, ServletException, IOException { |
136 public void index(HttpServletRequest req, HttpServletResponse resp, DaoProvider dao) throws SQLException, ServletException, IOException { |
137 final var viewModel = new ProjectView(); |
137 final var viewModel = new ProjectView(); |
138 populate(viewModel, null, dao); |
138 populate(viewModel, null, dao); |
139 |
139 |
140 final var projectDao = dao.getProjectDao(); |
140 final var projectDao = dao.getProjectDao(); |
141 final var versionDao = dao.getVersionDao(); |
141 final var versionDao = dao.getVersionDao(); |
146 } |
146 } |
147 |
147 |
148 forwardView(req, resp, viewModel, "projects"); |
148 forwardView(req, resp, viewModel, "projects"); |
149 } |
149 } |
150 |
150 |
151 private void configureProjectEditor(ProjectEditView viewModel, Project project, DataAccessObjects dao) throws SQLException { |
151 private void configureProjectEditor(ProjectEditView viewModel, Project project, DaoProvider dao) throws SQLException { |
152 viewModel.setProject(project); |
152 viewModel.setProject(project); |
153 viewModel.setUsers(dao.getUserDao().list()); |
153 viewModel.setUsers(dao.getUserDao().list()); |
154 } |
154 } |
155 |
155 |
156 @RequestMapping(requestPath = "$project/edit", method = HttpMethod.GET) |
156 @RequestMapping(requestPath = "$project/edit", method = HttpMethod.GET) |
157 public void edit(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DataAccessObjects dao) throws IOException, SQLException, ServletException { |
157 public void edit(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DaoProvider dao) throws IOException, SQLException, ServletException { |
158 final var viewModel = new ProjectEditView(); |
158 final var viewModel = new ProjectEditView(); |
159 populate(viewModel, pathParams, dao); |
159 populate(viewModel, pathParams, dao); |
160 |
160 |
161 if (!viewModel.isProjectInfoPresent()) { |
161 if (!viewModel.isProjectInfoPresent()) { |
162 resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
162 resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
166 configureProjectEditor(viewModel, viewModel.getProjectInfo().getProject(), dao); |
166 configureProjectEditor(viewModel, viewModel.getProjectInfo().getProject(), dao); |
167 forwardView(req, resp, viewModel, "project-form"); |
167 forwardView(req, resp, viewModel, "project-form"); |
168 } |
168 } |
169 |
169 |
170 @RequestMapping(requestPath = "create", method = HttpMethod.GET) |
170 @RequestMapping(requestPath = "create", method = HttpMethod.GET) |
171 public void create(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException, ServletException, IOException { |
171 public void create(HttpServletRequest req, HttpServletResponse resp, DaoProvider dao) throws SQLException, ServletException, IOException { |
172 final var viewModel = new ProjectEditView(); |
172 final var viewModel = new ProjectEditView(); |
173 populate(viewModel, null, dao); |
173 populate(viewModel, null, dao); |
174 configureProjectEditor(viewModel, new Project(-1), dao); |
174 configureProjectEditor(viewModel, new Project(-1), dao); |
175 forwardView(req, resp, viewModel, "project-form"); |
175 forwardView(req, resp, viewModel, "project-form"); |
176 } |
176 } |
177 |
177 |
178 @RequestMapping(requestPath = "commit", method = HttpMethod.POST) |
178 @RequestMapping(requestPath = "commit", method = HttpMethod.POST) |
179 public void commit(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, ServletException { |
179 public void commit(HttpServletRequest req, HttpServletResponse resp, DaoProvider dao) throws IOException, ServletException { |
180 |
180 |
181 try { |
181 try { |
182 final var project = new Project(getParameter(req, Integer.class, "pid").orElseThrow()); |
182 final var project = new Project(getParameter(req, Integer.class, "pid").orElseThrow()); |
183 project.setName(getParameter(req, String.class, "name").orElseThrow()); |
183 project.setName(getParameter(req, String.class, "name").orElseThrow()); |
184 |
184 |
189 getParameter(req, String.class, "repoUrl").ifPresent(project::setRepoUrl); |
189 getParameter(req, String.class, "repoUrl").ifPresent(project::setRepoUrl); |
190 getParameter(req, Integer.class, "owner").map( |
190 getParameter(req, Integer.class, "owner").map( |
191 ownerId -> ownerId >= 0 ? new User(ownerId) : null |
191 ownerId -> ownerId >= 0 ? new User(ownerId) : null |
192 ).ifPresent(project::setOwner); |
192 ).ifPresent(project::setOwner); |
193 |
193 |
194 dao.getProjectDao().saveOrUpdate(project); |
194 final var projectDao = dao.getProjectDao(); |
|
195 if (project.getId() > 0) { |
|
196 // TODO: unused return value |
|
197 projectDao.update(project); |
|
198 } else { |
|
199 projectDao.save(project); |
|
200 } |
195 |
201 |
196 setRedirectLocation(req, "./projects/"); |
202 setRedirectLocation(req, "./projects/"); |
197 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
203 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
198 LOG.debug("Successfully updated project {}", project.getName()); |
204 LOG.debug("Successfully updated project {}", project.getName()); |
199 |
205 |
200 renderSite(req, resp); |
206 renderSite(req, resp); |
201 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
207 } catch (NoSuchElementException | IllegalArgumentException ex) { |
202 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
208 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
203 // TODO: implement - fix issue #21 |
209 // TODO: implement - fix issue #21 |
204 } |
210 } |
205 } |
211 } |
206 |
212 |
207 @RequestMapping(requestPath = "$project/$component/$version/issues/", method = HttpMethod.GET) |
213 @RequestMapping(requestPath = "$project/$component/$version/issues/", method = HttpMethod.GET) |
208 public void issues(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DataAccessObjects dao) throws SQLException, IOException, ServletException { |
214 public void issues(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DaoProvider dao) throws SQLException, IOException, ServletException { |
209 final var viewModel = new ProjectDetailsView(); |
215 final var viewModel = new ProjectDetailsView(); |
210 populate(viewModel, pathParams, dao); |
216 populate(viewModel, pathParams, dao); |
211 |
217 |
212 if (!viewModel.isEveryFilterValid()) { |
218 if (!viewModel.isEveryFilterValid()) { |
213 resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
219 resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
261 |
267 |
262 forwardView(req, resp, viewModel, "project-details"); |
268 forwardView(req, resp, viewModel, "project-details"); |
263 } |
269 } |
264 |
270 |
265 @RequestMapping(requestPath = "$project/versions/", method = HttpMethod.GET) |
271 @RequestMapping(requestPath = "$project/versions/", method = HttpMethod.GET) |
266 public void versions(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { |
272 public void versions(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { |
267 final var viewModel = new VersionsView(); |
273 final var viewModel = new VersionsView(); |
268 populate(viewModel, pathParameters, dao); |
274 populate(viewModel, pathParameters, dao); |
269 |
275 |
270 final var projectInfo = viewModel.getProjectInfo(); |
276 final var projectInfo = viewModel.getProjectInfo(); |
271 if (projectInfo == null) { |
277 if (projectInfo == null) { |
280 |
286 |
281 forwardView(req, resp, viewModel, "versions"); |
287 forwardView(req, resp, viewModel, "versions"); |
282 } |
288 } |
283 |
289 |
284 @RequestMapping(requestPath = "$project/versions/$version/edit", method = HttpMethod.GET) |
290 @RequestMapping(requestPath = "$project/versions/$version/edit", method = HttpMethod.GET) |
285 public void editVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { |
291 public void editVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { |
286 final var viewModel = new VersionEditView(); |
292 final var viewModel = new VersionEditView(); |
287 populate(viewModel, pathParameters, dao); |
293 populate(viewModel, pathParameters, dao); |
288 |
294 |
289 if (viewModel.getProjectInfo() == null || viewModel.getVersionFilter() == null) { |
295 if (viewModel.getProjectInfo() == null || viewModel.getVersionFilter() == null) { |
290 resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
296 resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
295 |
301 |
296 forwardView(req, resp, viewModel, "version-form"); |
302 forwardView(req, resp, viewModel, "version-form"); |
297 } |
303 } |
298 |
304 |
299 @RequestMapping(requestPath = "$project/create-version", method = HttpMethod.GET) |
305 @RequestMapping(requestPath = "$project/create-version", method = HttpMethod.GET) |
300 public void createVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { |
306 public void createVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { |
301 final var viewModel = new VersionEditView(); |
307 final var viewModel = new VersionEditView(); |
302 populate(viewModel, pathParameters, dao); |
308 populate(viewModel, pathParameters, dao); |
303 |
309 |
304 if (viewModel.getProjectInfo() == null) { |
310 if (viewModel.getProjectInfo() == null) { |
305 resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
311 resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
310 |
316 |
311 forwardView(req, resp, viewModel, "version-form"); |
317 forwardView(req, resp, viewModel, "version-form"); |
312 } |
318 } |
313 |
319 |
314 @RequestMapping(requestPath = "commit-version", method = HttpMethod.POST) |
320 @RequestMapping(requestPath = "commit-version", method = HttpMethod.POST) |
315 public void commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, ServletException { |
321 public void commitVersion(HttpServletRequest req, HttpServletResponse resp, DaoProvider dao) throws IOException, ServletException { |
316 |
322 |
317 try { |
323 try { |
318 final var project = dao.getProjectDao().find(getParameter(req, Integer.class, "pid").orElseThrow()); |
324 final var project = dao.getProjectDao().find(getParameter(req, Integer.class, "pid").orElseThrow()); |
319 if (project == null) { |
325 if (project == null) { |
320 // TODO: improve error handling, because not found is not correct for this POST request |
326 // TODO: improve error handling, because not found is not correct for this POST request |
327 final var node = getParameter(req, String.class, "node").orElse(null); |
333 final var node = getParameter(req, String.class, "node").orElse(null); |
328 version.setNode(sanitizeNode(node, version.getName())); |
334 version.setNode(sanitizeNode(node, version.getName())); |
329 |
335 |
330 getParameter(req, Integer.class, "ordinal").ifPresent(version::setOrdinal); |
336 getParameter(req, Integer.class, "ordinal").ifPresent(version::setOrdinal); |
331 version.setStatus(VersionStatus.valueOf(getParameter(req, String.class, "status").orElseThrow())); |
337 version.setStatus(VersionStatus.valueOf(getParameter(req, String.class, "status").orElseThrow())); |
332 dao.getVersionDao().saveOrUpdate(version, project); |
338 |
|
339 final var versionDao = dao.getVersionDao(); |
|
340 if (version.getId() > 0) { |
|
341 // TODO: use return value |
|
342 versionDao.update(version); |
|
343 } else { |
|
344 versionDao.save(version, project); |
|
345 } |
333 |
346 |
334 setRedirectLocation(req, "./projects/" + project.getNode() + "/versions/"); |
347 setRedirectLocation(req, "./projects/" + project.getNode() + "/versions/"); |
335 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
348 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
336 |
349 |
337 renderSite(req, resp); |
350 renderSite(req, resp); |
338 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
351 } catch (NoSuchElementException | IllegalArgumentException ex) { |
339 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
352 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
340 // TODO: implement - fix issue #21 |
353 // TODO: implement - fix issue #21 |
341 } |
354 } |
342 } |
355 } |
343 |
356 |
344 @RequestMapping(requestPath = "$project/components/", method = HttpMethod.GET) |
357 @RequestMapping(requestPath = "$project/components/", method = HttpMethod.GET) |
345 public void components(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { |
358 public void components(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { |
346 final var viewModel = new ComponentsView(); |
359 final var viewModel = new ComponentsView(); |
347 populate(viewModel, pathParameters, dao); |
360 populate(viewModel, pathParameters, dao); |
348 |
361 |
349 final var projectInfo = viewModel.getProjectInfo(); |
362 final var projectInfo = viewModel.getProjectInfo(); |
350 if (projectInfo == null) { |
363 if (projectInfo == null) { |
358 |
371 |
359 forwardView(req, resp, viewModel, "components"); |
372 forwardView(req, resp, viewModel, "components"); |
360 } |
373 } |
361 |
374 |
362 @RequestMapping(requestPath = "$project/components/$component/edit", method = HttpMethod.GET) |
375 @RequestMapping(requestPath = "$project/components/$component/edit", method = HttpMethod.GET) |
363 public void editComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { |
376 public void editComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { |
364 final var viewModel = new ComponentEditView(); |
377 final var viewModel = new ComponentEditView(); |
365 populate(viewModel, pathParameters, dao); |
378 populate(viewModel, pathParameters, dao); |
366 |
379 |
367 if (viewModel.getProjectInfo() == null || viewModel.getComponentFilter() == null) { |
380 if (viewModel.getProjectInfo() == null || viewModel.getComponentFilter() == null) { |
368 resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
381 resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
374 |
387 |
375 forwardView(req, resp, viewModel, "component-form"); |
388 forwardView(req, resp, viewModel, "component-form"); |
376 } |
389 } |
377 |
390 |
378 @RequestMapping(requestPath = "$project/create-component", method = HttpMethod.GET) |
391 @RequestMapping(requestPath = "$project/create-component", method = HttpMethod.GET) |
379 public void createComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { |
392 public void createComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { |
380 final var viewModel = new ComponentEditView(); |
393 final var viewModel = new ComponentEditView(); |
381 populate(viewModel, pathParameters, dao); |
394 populate(viewModel, pathParameters, dao); |
382 |
395 |
383 if (viewModel.getProjectInfo() == null) { |
396 if (viewModel.getProjectInfo() == null) { |
384 resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
397 resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
390 |
403 |
391 forwardView(req, resp, viewModel, "component-form"); |
404 forwardView(req, resp, viewModel, "component-form"); |
392 } |
405 } |
393 |
406 |
394 @RequestMapping(requestPath = "commit-component", method = HttpMethod.POST) |
407 @RequestMapping(requestPath = "commit-component", method = HttpMethod.POST) |
395 public void commitComponent(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, ServletException { |
408 public void commitComponent(HttpServletRequest req, HttpServletResponse resp, DaoProvider dao) throws IOException, ServletException { |
396 |
409 |
397 try { |
410 try { |
398 final var project = dao.getProjectDao().find(getParameter(req, Integer.class, "pid").orElseThrow()); |
411 final var project = dao.getProjectDao().find(getParameter(req, Integer.class, "pid").orElseThrow()); |
399 if (project == null) { |
412 if (project == null) { |
400 // TODO: improve error handling, because not found is not correct for this POST request |
413 // TODO: improve error handling, because not found is not correct for this POST request |
412 getParameter(req, Integer.class, "lead").map( |
425 getParameter(req, Integer.class, "lead").map( |
413 userid -> userid >= 0 ? new User(userid) : null |
426 userid -> userid >= 0 ? new User(userid) : null |
414 ).ifPresent(component::setLead); |
427 ).ifPresent(component::setLead); |
415 getParameter(req, String.class, "description").ifPresent(component::setDescription); |
428 getParameter(req, String.class, "description").ifPresent(component::setDescription); |
416 |
429 |
417 dao.getComponentDao().saveOrUpdate(component, project); |
430 final var componentDao = dao.getComponentDao(); |
|
431 if (component.getId() > 0) { |
|
432 // TODO: use return value |
|
433 componentDao.update(component); |
|
434 } else { |
|
435 componentDao.save(component, project); |
|
436 } |
418 |
437 |
419 setRedirectLocation(req, "./projects/" + project.getNode() + "/components/"); |
438 setRedirectLocation(req, "./projects/" + project.getNode() + "/components/"); |
420 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
439 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
421 |
440 |
422 renderSite(req, resp); |
441 renderSite(req, resp); |
423 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
442 } catch (NoSuchElementException | IllegalArgumentException ex) { |
424 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
443 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
425 // TODO: implement - fix issue #21 |
444 // TODO: implement - fix issue #21 |
426 } |
445 } |
427 } |
446 } |
428 |
447 |
429 private void configureIssueEditor(IssueEditView viewModel, Issue issue, DataAccessObjects dao) throws SQLException { |
448 private void configureIssueEditor(IssueEditView viewModel, Issue issue, DaoProvider dao) throws SQLException { |
430 final var project = viewModel.getProjectInfo().getProject(); |
449 final var project = viewModel.getProjectInfo().getProject(); |
431 issue.setProject(project); // automatically set current project for new issues |
450 issue.setProject(project); // automatically set current project for new issues |
432 viewModel.setIssue(issue); |
451 viewModel.setIssue(issue); |
433 viewModel.configureVersionSelectors(viewModel.getProjectInfo().getVersions()); |
452 viewModel.configureVersionSelectors(viewModel.getProjectInfo().getVersions()); |
434 viewModel.setUsers(dao.getUserDao().list()); |
453 viewModel.setUsers(dao.getUserDao().list()); |
435 viewModel.setComponents(dao.getComponentDao().list(project)); |
454 viewModel.setComponents(dao.getComponentDao().list(project)); |
436 } |
455 } |
437 |
456 |
438 @RequestMapping(requestPath = "$project/issues/$issue/view", method = HttpMethod.GET) |
457 @RequestMapping(requestPath = "$project/issues/$issue/view", method = HttpMethod.GET) |
439 public void viewIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { |
458 public void viewIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { |
440 final var viewModel = new IssueDetailView(); |
459 final var viewModel = new IssueDetailView(); |
441 populate(viewModel, pathParameters, dao); |
460 populate(viewModel, pathParameters, dao); |
442 |
461 |
443 final var projectInfo = viewModel.getProjectInfo(); |
462 final var projectInfo = viewModel.getProjectInfo(); |
444 if (projectInfo == null) { |
463 if (projectInfo == null) { |
460 forwardView(req, resp, viewModel, "issue-view"); |
479 forwardView(req, resp, viewModel, "issue-view"); |
461 } |
480 } |
462 |
481 |
463 // TODO: why should the issue editor be child of $project? |
482 // TODO: why should the issue editor be child of $project? |
464 @RequestMapping(requestPath = "$project/issues/$issue/edit", method = HttpMethod.GET) |
483 @RequestMapping(requestPath = "$project/issues/$issue/edit", method = HttpMethod.GET) |
465 public void editIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { |
484 public void editIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { |
466 final var viewModel = new IssueEditView(); |
485 final var viewModel = new IssueEditView(); |
467 populate(viewModel, pathParameters, dao); |
486 populate(viewModel, pathParameters, dao); |
468 |
487 |
469 final var projectInfo = viewModel.getProjectInfo(); |
488 final var projectInfo = viewModel.getProjectInfo(); |
470 if (projectInfo == null) { |
489 if (projectInfo == null) { |
484 |
503 |
485 forwardView(req, resp, viewModel, "issue-form"); |
504 forwardView(req, resp, viewModel, "issue-form"); |
486 } |
505 } |
487 |
506 |
488 @RequestMapping(requestPath = "$project/create-issue", method = HttpMethod.GET) |
507 @RequestMapping(requestPath = "$project/create-issue", method = HttpMethod.GET) |
489 public void createIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { |
508 public void createIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { |
490 final var viewModel = new IssueEditView(); |
509 final var viewModel = new IssueEditView(); |
491 populate(viewModel, pathParameters, dao); |
510 populate(viewModel, pathParameters, dao); |
492 |
511 |
493 final var projectInfo = viewModel.getProjectInfo(); |
512 final var projectInfo = viewModel.getProjectInfo(); |
494 if (projectInfo == null) { |
513 if (projectInfo == null) { |
502 |
521 |
503 forwardView(req, resp, viewModel, "issue-form"); |
522 forwardView(req, resp, viewModel, "issue-form"); |
504 } |
523 } |
505 |
524 |
506 @RequestMapping(requestPath = "commit-issue", method = HttpMethod.POST) |
525 @RequestMapping(requestPath = "commit-issue", method = HttpMethod.POST) |
507 public void commitIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, ServletException { |
526 public void commitIssue(HttpServletRequest req, HttpServletResponse resp, DaoProvider dao) throws IOException, ServletException { |
508 try { |
527 try { |
509 final var issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow()); |
528 final var issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow()); |
510 final var componentId = getParameter(req, Integer.class, "component"); |
529 final var componentId = getParameter(req, Integer.class, "component"); |
511 final Component component; |
530 final Component component; |
512 if (componentId.isPresent()) { |
531 if (componentId.isPresent()) { |
547 .map(Stream::of) |
566 .map(Stream::of) |
548 .map(stream -> |
567 .map(stream -> |
549 stream.map(Version::new).collect(Collectors.toList()) |
568 stream.map(Version::new).collect(Collectors.toList()) |
550 ).ifPresent(issue::setResolvedVersions); |
569 ).ifPresent(issue::setResolvedVersions); |
551 |
570 |
552 dao.getIssueDao().saveOrUpdate(issue, issue.getProject()); |
571 final var issueDao = dao.getIssueDao(); |
|
572 if (issue.getId() > 0) { |
|
573 // TODO: use return value |
|
574 issueDao.update(issue); |
|
575 } else { |
|
576 issueDao.save(issue, project); |
|
577 } |
553 |
578 |
554 // TODO: fix redirect location |
579 // TODO: fix redirect location |
555 setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/view"); |
580 setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/view"); |
556 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
581 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
557 |
582 |
558 renderSite(req, resp); |
583 renderSite(req, resp); |
559 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
584 } catch (NoSuchElementException | IllegalArgumentException ex) { |
560 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
585 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
561 // TODO: implement - fix issue #21 |
586 // TODO: implement - fix issue #21 |
562 } |
587 } |
563 } |
588 } |
564 |
589 |
565 @RequestMapping(requestPath = "commit-issue-comment", method = HttpMethod.POST) |
590 @RequestMapping(requestPath = "commit-issue-comment", method = HttpMethod.POST) |
566 public void commentIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException, IOException, ServletException { |
591 public void commentIssue(HttpServletRequest req, HttpServletResponse resp, DaoProvider dao) throws IOException, ServletException { |
567 final var issueIdParam = getParameter(req, Integer.class, "issueid"); |
592 final var issueIdParam = getParameter(req, Integer.class, "issueid"); |
568 if (issueIdParam.isEmpty()) { |
593 if (issueIdParam.isEmpty()) { |
569 resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Detected manipulated form."); |
594 resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Detected manipulated form."); |
570 return; |
595 return; |
571 } |
596 } |
582 throw new IllegalArgumentException("comment.null"); |
607 throw new IllegalArgumentException("comment.null"); |
583 } |
608 } |
584 |
609 |
585 LOG.debug("User {} is commenting on issue #{}", req.getRemoteUser(), issue.getId()); |
610 LOG.debug("User {} is commenting on issue #{}", req.getRemoteUser(), issue.getId()); |
586 if (req.getRemoteUser() != null) { |
611 if (req.getRemoteUser() != null) { |
587 dao.getUserDao().findByUsername(req.getRemoteUser()).ifPresent(issueComment::setAuthor); |
612 Optional.ofNullable(dao.getUserDao().findByUsername(req.getRemoteUser())).ifPresent(issueComment::setAuthor); |
588 } |
613 } |
589 |
614 |
590 dao.getIssueDao().saveComment(issue, issueComment); |
615 dao.getIssueDao().saveComment(issue, issueComment); |
591 |
616 |
592 // TODO: fix redirect location |
617 // TODO: fix redirect location |
593 setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/view"); |
618 setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/view"); |
594 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
619 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
595 |
620 |
596 renderSite(req, resp); |
621 renderSite(req, resp); |
597 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
622 } catch (NoSuchElementException | IllegalArgumentException ex) { |
598 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
623 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
599 // TODO: implement - fix issue #21 |
624 // TODO: implement - fix issue #21 |
600 } |
625 } |
601 } |
626 } |
602 } |
627 } |