src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java

changeset 159
86b5d8a1662f
parent 158
4f912cd42876
child 161
3d9218457b62
equal deleted inserted replaced
158:4f912cd42876 159:86b5d8a1662f
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 }

mercurial