72 |
72 |
73 if (pathParameters == null) |
73 if (pathParameters == null) |
74 return; |
74 return; |
75 |
75 |
76 // Select Project |
76 // Select Project |
77 final int pid = Functions.parseIntOrZero(pathParameters.get("project")); |
77 final var project = projectDao.findByNode(pathParameters.get("project")); |
78 if (pid > 0) { |
78 if (project == null) |
79 final var project = projectDao.find(pid); |
79 return; |
80 if (project != null) { |
80 |
81 final var info = new ProjectInfo(project); |
81 final var info = new ProjectInfo(project); |
82 info.setVersions(versionDao.list(project)); |
82 info.setVersions(versionDao.list(project)); |
83 info.setComponents(componentDao.list(project)); |
83 info.setComponents(componentDao.list(project)); |
84 info.setIssueSummary(projectDao.getIssueSummary(project)); |
84 info.setIssueSummary(projectDao.getIssueSummary(project)); |
85 viewModel.setProjectInfo(info); |
85 viewModel.setProjectInfo(info); |
86 } |
|
87 } |
|
88 |
86 |
89 // Select Version |
87 // Select Version |
90 final var pathParamVersion = pathParameters.get("version"); |
88 final var versionNode = pathParameters.get("version"); |
91 if ("no-version".equals(pathParamVersion)) { |
89 if ("no-version".equals(versionNode)) { |
92 viewModel.setVersionFilter(ProjectView.NO_VERSION); |
90 viewModel.setVersionFilter(ProjectView.NO_VERSION); |
93 } else if ("all-versions".equals(pathParamVersion)) { |
91 } else if ("all-versions".equals(versionNode)) { |
94 viewModel.setVersionFilter(ProjectView.ALL_VERSIONS); |
92 viewModel.setVersionFilter(ProjectView.ALL_VERSIONS); |
95 } else { |
93 } else { |
96 final int vid = Functions.parseIntOrZero(pathParamVersion); |
94 viewModel.setVersionFilter(versionDao.findByNode(project, versionNode)); |
97 if (vid > 0) { |
|
98 viewModel.setVersionFilter(versionDao.find(vid)); |
|
99 } |
|
100 } |
95 } |
101 |
96 |
102 // Select Component |
97 // Select Component |
103 final var pathParamComponent = pathParameters.get("component"); |
98 final var componentNode = pathParameters.get("component"); |
104 if ("no-component".equals(pathParamComponent)) { |
99 if ("no-component".equals(componentNode)) { |
105 viewModel.setComponentFilter(ProjectView.NO_COMPONENT); |
100 viewModel.setComponentFilter(ProjectView.NO_COMPONENT); |
106 } else if ("all-components".equals(pathParamComponent)) { |
101 } else if ("all-components".equals(componentNode)) { |
107 viewModel.setComponentFilter(ProjectView.ALL_COMPONENTS); |
102 viewModel.setComponentFilter(ProjectView.ALL_COMPONENTS); |
108 } else { |
103 } else { |
109 final int cid = Functions.parseIntOrZero(pathParamComponent); |
104 viewModel.setComponentFilter(componentDao.findByNode(project, componentNode)); |
110 if (cid > 0) { |
105 } |
111 viewModel.setComponentFilter(componentDao.find(cid)); |
106 } |
112 } |
107 |
|
108 private static String sanitizeNode(String node, String defaultValue) { |
|
109 String result = node == null || node.isBlank() ? defaultValue : node; |
|
110 result = result.replace('/', '-'); |
|
111 if (result.equals(".") || result.equals("..")) { |
|
112 return "_"+result; |
|
113 } else { |
|
114 return result; |
113 } |
115 } |
114 } |
116 } |
115 |
117 |
116 private ResponseType forwardView(HttpServletRequest req, ProjectView viewModel, String name) { |
118 private ResponseType forwardView(HttpServletRequest req, ProjectView viewModel, String name) { |
117 setViewModel(req, viewModel); |
119 setViewModel(req, viewModel); |
168 public ResponseType commit(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { |
170 public ResponseType commit(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { |
169 |
171 |
170 try { |
172 try { |
171 final var project = new Project(getParameter(req, Integer.class, "pid").orElseThrow()); |
173 final var project = new Project(getParameter(req, Integer.class, "pid").orElseThrow()); |
172 project.setName(getParameter(req, String.class, "name").orElseThrow()); |
174 project.setName(getParameter(req, String.class, "name").orElseThrow()); |
|
175 |
|
176 final var node = getParameter(req, String.class, "node").orElse(null); |
|
177 project.setNode(sanitizeNode(node, project.getName())); |
|
178 |
173 getParameter(req, String.class, "description").ifPresent(project::setDescription); |
179 getParameter(req, String.class, "description").ifPresent(project::setDescription); |
174 getParameter(req, String.class, "repoUrl").ifPresent(project::setRepoUrl); |
180 getParameter(req, String.class, "repoUrl").ifPresent(project::setRepoUrl); |
175 getParameter(req, Integer.class, "owner").map( |
181 getParameter(req, Integer.class, "owner").map( |
176 ownerId -> ownerId >= 0 ? new User(ownerId) : null |
182 ownerId -> ownerId >= 0 ? new User(ownerId) : null |
177 ).ifPresent(project::setOwner); |
183 ).ifPresent(project::setOwner); |
299 |
305 |
300 @RequestMapping(requestPath = "commit-version", method = HttpMethod.POST) |
306 @RequestMapping(requestPath = "commit-version", method = HttpMethod.POST) |
301 public ResponseType commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { |
307 public ResponseType commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { |
302 |
308 |
303 try { |
309 try { |
304 final var project = new Project(getParameter(req, Integer.class, "pid").orElseThrow()); |
310 final var project = dao.getProjectDao().find(getParameter(req, Integer.class, "pid").orElseThrow()); |
|
311 if (project == null) { |
|
312 // TODO: improve error handling, because not found is not correct for this POST request |
|
313 resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
|
314 return ResponseType.NONE; |
|
315 } |
305 final var version = new Version(getParameter(req, Integer.class, "id").orElseThrow()); |
316 final var version = new Version(getParameter(req, Integer.class, "id").orElseThrow()); |
306 version.setName(getParameter(req, String.class, "name").orElseThrow()); |
317 version.setName(getParameter(req, String.class, "name").orElseThrow()); |
|
318 |
|
319 final var node = getParameter(req, String.class, "node").orElse(null); |
|
320 version.setNode(sanitizeNode(node, version.getName())); |
|
321 |
307 getParameter(req, Integer.class, "ordinal").ifPresent(version::setOrdinal); |
322 getParameter(req, Integer.class, "ordinal").ifPresent(version::setOrdinal); |
308 version.setStatus(VersionStatus.valueOf(getParameter(req, String.class, "status").orElseThrow())); |
323 version.setStatus(VersionStatus.valueOf(getParameter(req, String.class, "status").orElseThrow())); |
309 dao.getVersionDao().saveOrUpdate(version, project); |
324 dao.getVersionDao().saveOrUpdate(version, project); |
310 |
325 |
311 setRedirectLocation(req, "./projects/" + project.getId() + "/versions/"); |
326 setRedirectLocation(req, "./projects/" + project.getNode() + "/versions/"); |
312 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
327 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
313 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
328 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
314 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
329 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
315 // TODO: implement - fix issue #21 |
330 // TODO: implement - fix issue #21 |
316 return ResponseType.NONE; |
331 return ResponseType.NONE; |
371 |
386 |
372 @RequestMapping(requestPath = "commit-component", method = HttpMethod.POST) |
387 @RequestMapping(requestPath = "commit-component", method = HttpMethod.POST) |
373 public ResponseType commitComponent(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { |
388 public ResponseType commitComponent(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { |
374 |
389 |
375 try { |
390 try { |
376 final var project = new Project(getParameter(req, Integer.class, "pid").orElseThrow()); |
391 final var project = dao.getProjectDao().find(getParameter(req, Integer.class, "pid").orElseThrow()); |
|
392 if (project == null) { |
|
393 // TODO: improve error handling, because not found is not correct for this POST request |
|
394 resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
|
395 return ResponseType.NONE; |
|
396 } |
377 final var component = new Component(getParameter(req, Integer.class, "id").orElseThrow()); |
397 final var component = new Component(getParameter(req, Integer.class, "id").orElseThrow()); |
378 component.setName(getParameter(req, String.class, "name").orElseThrow()); |
398 component.setName(getParameter(req, String.class, "name").orElseThrow()); |
|
399 |
|
400 final var node = getParameter(req, String.class, "node").orElse(null); |
|
401 component.setNode(sanitizeNode(node, component.getName())); |
|
402 |
379 component.setColor(getParameter(req, WebColor.class, "color").orElseThrow()); |
403 component.setColor(getParameter(req, WebColor.class, "color").orElseThrow()); |
380 getParameter(req, Integer.class, "ordinal").ifPresent(component::setOrdinal); |
404 getParameter(req, Integer.class, "ordinal").ifPresent(component::setOrdinal); |
381 getParameter(req, Integer.class, "lead").map( |
405 getParameter(req, Integer.class, "lead").map( |
382 userid -> userid >= 0 ? new User(userid) : null |
406 userid -> userid >= 0 ? new User(userid) : null |
383 ).ifPresent(component::setLead); |
407 ).ifPresent(component::setLead); |
384 getParameter(req, String.class, "description").ifPresent(component::setDescription); |
408 getParameter(req, String.class, "description").ifPresent(component::setDescription); |
385 |
409 |
386 dao.getComponentDao().saveOrUpdate(component, project); |
410 dao.getComponentDao().saveOrUpdate(component, project); |
387 |
411 |
388 setRedirectLocation(req, "./projects/" + project.getId() + "/components/"); |
412 setRedirectLocation(req, "./projects/" + project.getNode() + "/components/"); |
389 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
413 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
390 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
414 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
391 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
415 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
392 // TODO: implement - fix issue #21 |
416 // TODO: implement - fix issue #21 |
393 return ResponseType.NONE; |
417 return ResponseType.NONE; |
459 if (componentId.isPresent()) { |
483 if (componentId.isPresent()) { |
460 component = dao.getComponentDao().find(componentId.get()); |
484 component = dao.getComponentDao().find(componentId.get()); |
461 } else { |
485 } else { |
462 component = null; |
486 component = null; |
463 } |
487 } |
464 issue.setProject(new Project(getParameter(req, Integer.class, "pid").orElseThrow())); |
488 final var project = dao.getProjectDao().find(getParameter(req, Integer.class, "pid").orElseThrow()); |
|
489 if (project == null) { |
|
490 // TODO: improve error handling, because not found is not correct for this POST request |
|
491 resp.sendError(HttpServletResponse.SC_NOT_FOUND); |
|
492 return ResponseType.NONE; |
|
493 } |
|
494 issue.setProject(project); |
465 getParameter(req, String.class, "category").map(IssueCategory::valueOf).ifPresent(issue::setCategory); |
495 getParameter(req, String.class, "category").map(IssueCategory::valueOf).ifPresent(issue::setCategory); |
466 getParameter(req, String.class, "status").map(IssueStatus::valueOf).ifPresent(issue::setStatus); |
496 getParameter(req, String.class, "status").map(IssueStatus::valueOf).ifPresent(issue::setStatus); |
467 issue.setSubject(getParameter(req, String.class, "subject").orElseThrow()); |
497 issue.setSubject(getParameter(req, String.class, "subject").orElseThrow()); |
468 issue.setComponent(component); |
498 issue.setComponent(component); |
469 getParameter(req, Integer.class, "assignee").map(userid -> { |
499 getParameter(req, Integer.class, "assignee").map(userid -> { |
491 ).ifPresent(issue::setResolvedVersions); |
521 ).ifPresent(issue::setResolvedVersions); |
492 |
522 |
493 dao.getIssueDao().saveOrUpdate(issue, issue.getProject()); |
523 dao.getIssueDao().saveOrUpdate(issue, issue.getProject()); |
494 |
524 |
495 // TODO: fix issue #14 |
525 // TODO: fix issue #14 |
496 setRedirectLocation(req, "./projects/" + issue.getProject().getId() + "/all-components/all-versions/issues/"); |
526 setRedirectLocation(req, "./projects/" + issue.getProject().getNode() + "/all-components/all-versions/issues/"); |
497 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
527 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
498 |
528 |
499 return ResponseType.HTML; |
529 return ResponseType.HTML; |
500 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
530 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
501 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
531 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
530 } |
560 } |
531 |
561 |
532 dao.getIssueDao().saveComment(issueComment); |
562 dao.getIssueDao().saveComment(issueComment); |
533 |
563 |
534 // TODO: fix redirect location (e.g. after fixing #24) |
564 // TODO: fix redirect location (e.g. after fixing #24) |
535 setRedirectLocation(req, "./projects/" + issue.getProject().getId()+"/issues/"+issue.getId()+"/edit"); |
565 setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/edit"); |
536 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
566 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); |
537 |
567 |
538 return ResponseType.HTML; |
568 return ResponseType.HTML; |
539 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
569 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { |
540 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |
570 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); |