420 return ResponseType.HTML; |
420 return ResponseType.HTML; |
421 } |
421 } |
422 |
422 |
423 private void configureIssueEditor(IssueEditView viewModel, Issue issue, DataAccessObjects dao) throws SQLException { |
423 private void configureIssueEditor(IssueEditView viewModel, Issue issue, DataAccessObjects dao) throws SQLException { |
424 final var project = viewModel.getProjectInfo().getProject(); |
424 final var project = viewModel.getProjectInfo().getProject(); |
425 issue.setProject(project); |
425 issue.setProject(project); // automatically set current project for new issues |
426 viewModel.setIssue(issue); |
426 viewModel.setIssue(issue); |
427 viewModel.configureVersionSelectors(viewModel.getProjectInfo().getVersions()); |
427 viewModel.configureVersionSelectors(viewModel.getProjectInfo().getVersions()); |
428 viewModel.setUsers(dao.getUserDao().list()); |
428 viewModel.setUsers(dao.getUserDao().list()); |
429 viewModel.setComponents(dao.getComponentDao().list(project)); |
429 viewModel.setComponents(dao.getComponentDao().list(project)); |
430 if (issue.getId() >= 0) { |
430 } |
431 viewModel.setComments(dao.getIssueDao().listComments(issue)); |
431 |
432 } |
432 @RequestMapping(requestPath = "$project/issues/$issue/view", method = HttpMethod.GET) |
433 } |
433 public ResponseType viewIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { |
434 |
434 final var viewModel = new IssueDetailView(); |
|
435 populate(viewModel, pathParameters, dao); |
|
436 |
|
437 final var projectInfo = viewModel.getProjectInfo(); |
|
438 if (projectInfo == null) { |
|
439 resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
|
440 return ResponseType.NONE; |
|
441 } |
|
442 |
|
443 final var issueDao = dao.getIssueDao(); |
|
444 final var issue = issueDao.find(Functions.parseIntOrZero(pathParameters.get("issue"))); |
|
445 if (issue == null) { |
|
446 resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
|
447 return ResponseType.NONE; |
|
448 } |
|
449 |
|
450 issueDao.joinVersionInformation(issue); |
|
451 viewModel.setIssue(issue); |
|
452 viewModel.setComments(issueDao.listComments(issue)); |
|
453 |
|
454 return forwardView(req, viewModel, "issue-view"); |
|
455 } |
|
456 |
|
457 // TODO: why should the issue editor be child of $project? |
435 @RequestMapping(requestPath = "$project/issues/$issue/edit", method = HttpMethod.GET) |
458 @RequestMapping(requestPath = "$project/issues/$issue/edit", method = HttpMethod.GET) |
436 public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { |
459 public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { |
437 final var viewModel = new IssueEditView(); |
460 final var viewModel = new IssueEditView(); |
438 populate(viewModel, pathParameters, dao); |
461 populate(viewModel, pathParameters, dao); |
439 |
462 |
520 stream.map(Version::new).collect(Collectors.toList()) |
543 stream.map(Version::new).collect(Collectors.toList()) |
521 ).ifPresent(issue::setResolvedVersions); |
544 ).ifPresent(issue::setResolvedVersions); |
522 |
545 |
523 dao.getIssueDao().saveOrUpdate(issue, issue.getProject()); |
546 dao.getIssueDao().saveOrUpdate(issue, issue.getProject()); |
524 |
547 |
525 // TODO: fix issue #14 |
548 // TODO: fix redirect location |
526 setRedirectLocation(req, "./projects/" + issue.getProject().getNode() + "/all-components/all-versions/issues/"); |
549 setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/view"); |
527 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
550 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
528 |
551 |
529 return ResponseType.HTML; |
552 return ResponseType.HTML; |
530 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
553 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
531 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
554 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
559 dao.getUserDao().findByUsername(req.getRemoteUser()).ifPresent(issueComment::setAuthor); |
582 dao.getUserDao().findByUsername(req.getRemoteUser()).ifPresent(issueComment::setAuthor); |
560 } |
583 } |
561 |
584 |
562 dao.getIssueDao().saveComment(issueComment); |
585 dao.getIssueDao().saveComment(issueComment); |
563 |
586 |
564 // TODO: fix redirect location (e.g. after fixing #24) |
587 // TODO: fix redirect location |
565 setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/edit"); |
588 setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/view"); |
566 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
589 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
567 |
590 |
568 return ResponseType.HTML; |
591 return ResponseType.HTML; |
569 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
592 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
570 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
593 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |