1.1 --- a/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Sun Dec 20 11:06:25 2020 +0100 1.2 +++ b/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Mon Dec 21 18:29:34 2020 +0100 1.3 @@ -30,8 +30,15 @@ 1.4 1.5 1.6 import de.uapcore.lightpit.*; 1.7 -import de.uapcore.lightpit.dao.DaoProvider; 1.8 +import de.uapcore.lightpit.dao.DataAccessObject; 1.9 import de.uapcore.lightpit.entities.*; 1.10 +import de.uapcore.lightpit.filter.AllFilter; 1.11 +import de.uapcore.lightpit.filter.IssueFilter; 1.12 +import de.uapcore.lightpit.filter.NoneFilter; 1.13 +import de.uapcore.lightpit.filter.SpecificFilter; 1.14 +import de.uapcore.lightpit.types.IssueCategory; 1.15 +import de.uapcore.lightpit.types.IssueStatus; 1.16 +import de.uapcore.lightpit.types.VersionStatus; 1.17 import de.uapcore.lightpit.types.WebColor; 1.18 import de.uapcore.lightpit.viewmodel.*; 1.19 import de.uapcore.lightpit.viewmodel.util.IssueSorter; 1.20 @@ -45,7 +52,6 @@ 1.21 import java.io.IOException; 1.22 import java.sql.Date; 1.23 import java.sql.SQLException; 1.24 -import java.util.List; 1.25 import java.util.NoSuchElementException; 1.26 import java.util.Optional; 1.27 import java.util.stream.Collectors; 1.28 @@ -72,25 +78,21 @@ 1.29 } 1.30 } 1.31 1.32 - private void populate(ProjectView viewModel, PathParameters pathParameters, DaoProvider dao) { 1.33 - final var projectDao = dao.getProjectDao(); 1.34 - final var versionDao = dao.getVersionDao(); 1.35 - final var componentDao = dao.getComponentDao(); 1.36 - 1.37 - projectDao.list().stream().map(ProjectInfo::new).forEach(viewModel.getProjectList()::add); 1.38 + private void populate(ProjectView viewModel, PathParameters pathParameters, DataAccessObject dao) { 1.39 + dao.listProjects().stream().map(ProjectInfo::new).forEach(viewModel.getProjectList()::add); 1.40 1.41 if (pathParameters == null) 1.42 return; 1.43 1.44 // Select Project 1.45 - final var project = projectDao.findByNode(pathParameters.get("project")); 1.46 + final var project = dao.findProjectByNode(pathParameters.get("project")); 1.47 if (project == null) 1.48 return; 1.49 1.50 final var info = new ProjectInfo(project); 1.51 - info.setVersions(versionDao.list(project)); 1.52 - info.setComponents(componentDao.list(project)); 1.53 - info.setIssueSummary(projectDao.getIssueSummary(project)); 1.54 + info.setVersions(dao.listVersions(project)); 1.55 + info.setComponents(dao.listComponents(project)); 1.56 + info.setIssueSummary(dao.collectIssueSummary(project)); 1.57 viewModel.setProjectInfo(info); 1.58 1.59 // Select Version 1.60 @@ -101,7 +103,7 @@ 1.61 } else if ("all-versions".equals(versionNode)) { 1.62 viewModel.setVersionFilter(ProjectView.ALL_VERSIONS); 1.63 } else { 1.64 - viewModel.setVersionFilter(versionDao.findByNode(project, versionNode)); 1.65 + viewModel.setVersionFilter(dao.findVersionByNode(project, versionNode)); 1.66 } 1.67 } 1.68 1.69 @@ -113,7 +115,7 @@ 1.70 } else if ("all-components".equals(componentNode)) { 1.71 viewModel.setComponentFilter(ProjectView.ALL_COMPONENTS); 1.72 } else { 1.73 - viewModel.setComponentFilter(componentDao.findByNode(project, componentNode)); 1.74 + viewModel.setComponentFilter(dao.findComponentByNode(project, componentNode)); 1.75 } 1.76 } 1.77 } 1.78 @@ -137,28 +139,25 @@ 1.79 } 1.80 1.81 @RequestMapping(method = HttpMethod.GET) 1.82 - public void index(HttpServletRequest req, HttpServletResponse resp, DaoProvider dao) throws SQLException, ServletException, IOException { 1.83 + public void index(HttpServletRequest req, HttpServletResponse resp, DataAccessObject dao) throws ServletException, IOException { 1.84 final var viewModel = new ProjectView(); 1.85 populate(viewModel, null, dao); 1.86 1.87 - final var projectDao = dao.getProjectDao(); 1.88 - final var versionDao = dao.getVersionDao(); 1.89 - 1.90 for (var info : viewModel.getProjectList()) { 1.91 - info.setVersions(versionDao.list(info.getProject())); 1.92 - info.setIssueSummary(projectDao.getIssueSummary(info.getProject())); 1.93 + info.setVersions(dao.listVersions(info.getProject())); 1.94 + info.setIssueSummary(dao.collectIssueSummary(info.getProject())); 1.95 } 1.96 1.97 forwardView(req, resp, viewModel, "projects"); 1.98 } 1.99 1.100 - private void configureProjectEditor(ProjectEditView viewModel, Project project, DaoProvider dao) throws SQLException { 1.101 + private void configureProjectEditor(ProjectEditView viewModel, Project project, DataAccessObject dao) { 1.102 viewModel.setProject(project); 1.103 - viewModel.setUsers(dao.getUserDao().list()); 1.104 + viewModel.setUsers(dao.listUsers()); 1.105 } 1.106 1.107 @RequestMapping(requestPath = "$project/edit", method = HttpMethod.GET) 1.108 - public void edit(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DaoProvider dao) throws IOException, SQLException, ServletException { 1.109 + public void edit(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DataAccessObject dao) throws IOException, SQLException, ServletException { 1.110 final var viewModel = new ProjectEditView(); 1.111 populate(viewModel, pathParams, dao); 1.112 1.113 @@ -172,7 +171,7 @@ 1.114 } 1.115 1.116 @RequestMapping(requestPath = "create", method = HttpMethod.GET) 1.117 - public void create(HttpServletRequest req, HttpServletResponse resp, DaoProvider dao) throws SQLException, ServletException, IOException { 1.118 + public void create(HttpServletRequest req, HttpServletResponse resp, DataAccessObject dao) throws SQLException, ServletException, IOException { 1.119 final var viewModel = new ProjectEditView(); 1.120 populate(viewModel, null, dao); 1.121 configureProjectEditor(viewModel, new Project(-1), dao); 1.122 @@ -180,7 +179,7 @@ 1.123 } 1.124 1.125 @RequestMapping(requestPath = "commit", method = HttpMethod.POST) 1.126 - public void commit(HttpServletRequest req, HttpServletResponse resp, DaoProvider dao) throws IOException, ServletException { 1.127 + public void commit(HttpServletRequest req, HttpServletResponse resp, DataAccessObject dao) throws IOException, ServletException { 1.128 1.129 try { 1.130 final var project = new Project(getParameter(req, Integer.class, "pid").orElseThrow()); 1.131 @@ -195,12 +194,10 @@ 1.132 ownerId -> ownerId >= 0 ? new User(ownerId) : null 1.133 ).ifPresent(project::setOwner); 1.134 1.135 - final var projectDao = dao.getProjectDao(); 1.136 if (project.getId() > 0) { 1.137 - // TODO: unused return value 1.138 - projectDao.update(project); 1.139 + dao.updateProject(project); 1.140 } else { 1.141 - projectDao.save(project); 1.142 + dao.insertProject(project); 1.143 } 1.144 1.145 setRedirectLocation(req, "./projects/"); 1.146 @@ -215,7 +212,7 @@ 1.147 } 1.148 1.149 @RequestMapping(requestPath = "$project/$component/$version/issues/", method = HttpMethod.GET) 1.150 - public void issues(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DaoProvider dao) throws SQLException, IOException, ServletException { 1.151 + public void issues(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DataAccessObject dao) throws SQLException, IOException, ServletException { 1.152 final var viewModel = new ProjectDetailsView(); 1.153 populate(viewModel, pathParams, dao); 1.154 1.155 @@ -228,36 +225,64 @@ 1.156 final var version = viewModel.getVersionFilter(); 1.157 final var component = viewModel.getComponentFilter(); 1.158 1.159 - final var issueDao = dao.getIssueDao(); 1.160 + // TODO: use new IssueFilter class for the ViewModel 1.161 1.162 - final List<Issue> issues; 1.163 + final var projectFilter = new SpecificFilter<>(project); 1.164 + final IssueFilter filter; 1.165 if (version.equals(ProjectView.NO_VERSION)) { 1.166 if (component.equals(ProjectView.ALL_COMPONENTS)) { 1.167 - issues = issueDao.list(project, (Version) null); 1.168 + filter = new IssueFilter(projectFilter, 1.169 + new NoneFilter<>(), 1.170 + new AllFilter<>() 1.171 + ); 1.172 } else if (component.equals(ProjectView.NO_COMPONENT)) { 1.173 - issues = issueDao.list(project, null, null); 1.174 + filter = new IssueFilter(projectFilter, 1.175 + new NoneFilter<>(), 1.176 + new NoneFilter<>() 1.177 + ); 1.178 } else { 1.179 - issues = issueDao.list(project, component, null); 1.180 + filter = new IssueFilter(projectFilter, 1.181 + new NoneFilter<>(), 1.182 + new SpecificFilter<>(component) 1.183 + ); 1.184 } 1.185 } else if (version.equals(ProjectView.ALL_VERSIONS)) { 1.186 if (component.equals(ProjectView.ALL_COMPONENTS)) { 1.187 - issues = issueDao.list(project); 1.188 + filter = new IssueFilter(projectFilter, 1.189 + new AllFilter<>(), 1.190 + new AllFilter<>() 1.191 + ); 1.192 } else if (component.equals(ProjectView.NO_COMPONENT)) { 1.193 - issues = issueDao.list(project, (Component)null); 1.194 + filter = new IssueFilter(projectFilter, 1.195 + new AllFilter<>(), 1.196 + new NoneFilter<>() 1.197 + ); 1.198 } else { 1.199 - issues = issueDao.list(project, component); 1.200 + filter = new IssueFilter(projectFilter, 1.201 + new AllFilter<>(), 1.202 + new SpecificFilter<>(component) 1.203 + ); 1.204 } 1.205 } else { 1.206 if (component.equals(ProjectView.ALL_COMPONENTS)) { 1.207 - issues = issueDao.list(project, version); 1.208 + filter = new IssueFilter(projectFilter, 1.209 + new SpecificFilter<>(version), 1.210 + new AllFilter<>() 1.211 + ); 1.212 } else if (component.equals(ProjectView.NO_COMPONENT)) { 1.213 - issues = issueDao.list(project, null, version); 1.214 + filter = new IssueFilter(projectFilter, 1.215 + new SpecificFilter<>(version), 1.216 + new NoneFilter<>() 1.217 + ); 1.218 } else { 1.219 - issues = issueDao.list(project, component, version); 1.220 + filter = new IssueFilter(projectFilter, 1.221 + new SpecificFilter<>(version), 1.222 + new SpecificFilter<>(component) 1.223 + ); 1.224 } 1.225 } 1.226 1.227 - for (var issue : issues) issueDao.joinVersionInformation(issue); 1.228 + final var issues = dao.listIssues(filter); 1.229 issues.sort(new IssueSorter( 1.230 new IssueSorter.Criteria(IssueSorter.Field.DONE, true), 1.231 new IssueSorter.Criteria(IssueSorter.Field.ETA, true), 1.232 @@ -273,7 +298,7 @@ 1.233 } 1.234 1.235 @RequestMapping(requestPath = "$project/versions/", method = HttpMethod.GET) 1.236 - public void versions(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { 1.237 + public void versions(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObject dao) throws IOException, SQLException, ServletException { 1.238 final var viewModel = new VersionsView(); 1.239 populate(viewModel, pathParameters, dao); 1.240 1.241 @@ -283,16 +308,20 @@ 1.242 return; 1.243 } 1.244 1.245 - final var issueDao = dao.getIssueDao(); 1.246 - final var issues = issueDao.list(projectInfo.getProject()); 1.247 - for (var issue : issues) issueDao.joinVersionInformation(issue); 1.248 + final var issues = dao.listIssues( 1.249 + new IssueFilter( 1.250 + new SpecificFilter<>(projectInfo.getProject()), 1.251 + new AllFilter<>(), 1.252 + new AllFilter<>() 1.253 + ) 1.254 + ); 1.255 viewModel.update(projectInfo.getVersions(), issues); 1.256 1.257 forwardView(req, resp, viewModel, "versions"); 1.258 } 1.259 1.260 @RequestMapping(requestPath = "$project/versions/$version/edit", method = HttpMethod.GET) 1.261 - public void editVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { 1.262 + public void editVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObject dao) throws IOException, ServletException { 1.263 final var viewModel = new VersionEditView(); 1.264 populate(viewModel, pathParameters, dao); 1.265 1.266 @@ -307,7 +336,7 @@ 1.267 } 1.268 1.269 @RequestMapping(requestPath = "$project/create-version", method = HttpMethod.GET) 1.270 - public void createVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { 1.271 + public void createVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObject dao) throws IOException, ServletException { 1.272 final var viewModel = new VersionEditView(); 1.273 populate(viewModel, pathParameters, dao); 1.274 1.275 @@ -316,22 +345,22 @@ 1.276 return; 1.277 } 1.278 1.279 - viewModel.setVersion(new Version(-1)); 1.280 + viewModel.setVersion(new Version(-1, viewModel.getProjectInfo().getProject().getId())); 1.281 1.282 forwardView(req, resp, viewModel, "version-form"); 1.283 } 1.284 1.285 @RequestMapping(requestPath = "commit-version", method = HttpMethod.POST) 1.286 - public void commitVersion(HttpServletRequest req, HttpServletResponse resp, DaoProvider dao) throws IOException, ServletException { 1.287 + public void commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObject dao) throws IOException, ServletException { 1.288 1.289 try { 1.290 - final var project = dao.getProjectDao().find(getParameter(req, Integer.class, "pid").orElseThrow()); 1.291 + final var project = dao.findProject(getParameter(req, Integer.class, "pid").orElseThrow()); 1.292 if (project == null) { 1.293 // TODO: improve error handling, because not found is not correct for this POST request 1.294 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.295 return; 1.296 } 1.297 - final var version = new Version(getParameter(req, Integer.class, "id").orElseThrow()); 1.298 + final var version = new Version(getParameter(req, Integer.class, "id").orElseThrow(), project.getId()); 1.299 version.setName(getParameter(req, String.class, "name").orElseThrow()); 1.300 1.301 final var node = getParameter(req, String.class, "node").orElse(null); 1.302 @@ -340,12 +369,10 @@ 1.303 getParameter(req, Integer.class, "ordinal").ifPresent(version::setOrdinal); 1.304 version.setStatus(VersionStatus.valueOf(getParameter(req, String.class, "status").orElseThrow())); 1.305 1.306 - final var versionDao = dao.getVersionDao(); 1.307 if (version.getId() > 0) { 1.308 - // TODO: use return value 1.309 - versionDao.update(version); 1.310 + dao.updateVersion(version); 1.311 } else { 1.312 - versionDao.save(version, project); 1.313 + dao.insertVersion(version); 1.314 } 1.315 1.316 setRedirectLocation(req, "./projects/" + project.getNode() + "/versions/"); 1.317 @@ -359,7 +386,7 @@ 1.318 } 1.319 1.320 @RequestMapping(requestPath = "$project/components/", method = HttpMethod.GET) 1.321 - public void components(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { 1.322 + public void components(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObject dao) throws IOException, SQLException, ServletException { 1.323 final var viewModel = new ComponentsView(); 1.324 populate(viewModel, pathParameters, dao); 1.325 1.326 @@ -369,15 +396,20 @@ 1.327 return; 1.328 } 1.329 1.330 - final var issueDao = dao.getIssueDao(); 1.331 - final var issues = issueDao.list(projectInfo.getProject()); 1.332 + final var issues = dao.listIssues( 1.333 + new IssueFilter( 1.334 + new SpecificFilter<>(projectInfo.getProject()), 1.335 + new AllFilter<>(), 1.336 + new AllFilter<>() 1.337 + ) 1.338 + ); 1.339 viewModel.update(projectInfo.getComponents(), issues); 1.340 1.341 forwardView(req, resp, viewModel, "components"); 1.342 } 1.343 1.344 @RequestMapping(requestPath = "$project/components/$component/edit", method = HttpMethod.GET) 1.345 - public void editComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { 1.346 + public void editComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObject dao) throws IOException, ServletException { 1.347 final var viewModel = new ComponentEditView(); 1.348 populate(viewModel, pathParameters, dao); 1.349 1.350 @@ -387,13 +419,13 @@ 1.351 } 1.352 1.353 viewModel.setComponent(viewModel.getComponentFilter()); 1.354 - viewModel.setUsers(dao.getUserDao().list()); 1.355 + viewModel.setUsers(dao.listUsers()); 1.356 1.357 forwardView(req, resp, viewModel, "component-form"); 1.358 } 1.359 1.360 @RequestMapping(requestPath = "$project/create-component", method = HttpMethod.GET) 1.361 - public void createComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { 1.362 + public void createComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObject dao) throws IOException, ServletException { 1.363 final var viewModel = new ComponentEditView(); 1.364 populate(viewModel, pathParameters, dao); 1.365 1.366 @@ -402,23 +434,23 @@ 1.367 return; 1.368 } 1.369 1.370 - viewModel.setComponent(new Component(-1)); 1.371 - viewModel.setUsers(dao.getUserDao().list()); 1.372 + viewModel.setComponent(new Component(-1, viewModel.getProjectInfo().getProject().getId())); 1.373 + viewModel.setUsers(dao.listUsers()); 1.374 1.375 forwardView(req, resp, viewModel, "component-form"); 1.376 } 1.377 1.378 @RequestMapping(requestPath = "commit-component", method = HttpMethod.POST) 1.379 - public void commitComponent(HttpServletRequest req, HttpServletResponse resp, DaoProvider dao) throws IOException, ServletException { 1.380 + public void commitComponent(HttpServletRequest req, HttpServletResponse resp, DataAccessObject dao) throws IOException, ServletException { 1.381 1.382 try { 1.383 - final var project = dao.getProjectDao().find(getParameter(req, Integer.class, "pid").orElseThrow()); 1.384 + final var project = dao.findProject(getParameter(req, Integer.class, "pid").orElseThrow()); 1.385 if (project == null) { 1.386 // TODO: improve error handling, because not found is not correct for this POST request 1.387 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.388 return; 1.389 } 1.390 - final var component = new Component(getParameter(req, Integer.class, "id").orElseThrow()); 1.391 + final var component = new Component(getParameter(req, Integer.class, "id").orElseThrow(), project.getId()); 1.392 component.setName(getParameter(req, String.class, "name").orElseThrow()); 1.393 1.394 final var node = getParameter(req, String.class, "node").orElse(null); 1.395 @@ -431,12 +463,10 @@ 1.396 ).ifPresent(component::setLead); 1.397 getParameter(req, String.class, "description").ifPresent(component::setDescription); 1.398 1.399 - final var componentDao = dao.getComponentDao(); 1.400 if (component.getId() > 0) { 1.401 - // TODO: use return value 1.402 - componentDao.update(component); 1.403 + dao.updateComponent(component); 1.404 } else { 1.405 - componentDao.save(component, project); 1.406 + dao.insertComponent(component); 1.407 } 1.408 1.409 setRedirectLocation(req, "./projects/" + project.getNode() + "/components/"); 1.410 @@ -449,17 +479,17 @@ 1.411 } 1.412 } 1.413 1.414 - private void configureIssueEditor(IssueEditView viewModel, Issue issue, DaoProvider dao) throws SQLException { 1.415 + private void configureIssueEditor(IssueEditView viewModel, Issue issue, DataAccessObject dao) { 1.416 final var project = viewModel.getProjectInfo().getProject(); 1.417 issue.setProject(project); // automatically set current project for new issues 1.418 viewModel.setIssue(issue); 1.419 viewModel.configureVersionSelectors(viewModel.getProjectInfo().getVersions()); 1.420 - viewModel.setUsers(dao.getUserDao().list()); 1.421 - viewModel.setComponents(dao.getComponentDao().list(project)); 1.422 + viewModel.setUsers(dao.listUsers()); 1.423 + viewModel.setComponents(dao.listComponents(project)); 1.424 } 1.425 1.426 @RequestMapping(requestPath = "$project/issues/$issue/view", method = HttpMethod.GET) 1.427 - public void viewIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { 1.428 + public void viewIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObject dao) throws IOException, ServletException { 1.429 final var viewModel = new IssueDetailView(); 1.430 populate(viewModel, pathParameters, dao); 1.431 1.432 @@ -469,16 +499,14 @@ 1.433 return; 1.434 } 1.435 1.436 - final var issueDao = dao.getIssueDao(); 1.437 - final var issue = issueDao.find(parseIntOrZero(pathParameters.get("issue"))); 1.438 + final var issue = dao.findIssue(parseIntOrZero(pathParameters.get("issue"))); 1.439 if (issue == null) { 1.440 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.441 return; 1.442 } 1.443 1.444 - issueDao.joinVersionInformation(issue); 1.445 viewModel.setIssue(issue); 1.446 - viewModel.setComments(issueDao.listComments(issue)); 1.447 + viewModel.setComments(dao.listComments(issue)); 1.448 1.449 viewModel.processMarkdown(); 1.450 1.451 @@ -487,7 +515,7 @@ 1.452 1.453 // TODO: why should the issue editor be child of $project? 1.454 @RequestMapping(requestPath = "$project/issues/$issue/edit", method = HttpMethod.GET) 1.455 - public void editIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { 1.456 + public void editIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObject dao) throws IOException, SQLException, ServletException { 1.457 final var viewModel = new IssueEditView(); 1.458 populate(viewModel, pathParameters, dao); 1.459 1.460 @@ -497,21 +525,19 @@ 1.461 return; 1.462 } 1.463 1.464 - final var issueDao = dao.getIssueDao(); 1.465 - final var issue = issueDao.find(parseIntOrZero(pathParameters.get("issue"))); 1.466 + final var issue = dao.findIssue(parseIntOrZero(pathParameters.get("issue"))); 1.467 if (issue == null) { 1.468 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.469 return; 1.470 } 1.471 1.472 - issueDao.joinVersionInformation(issue); 1.473 configureIssueEditor(viewModel, issue, dao); 1.474 1.475 forwardView(req, resp, viewModel, "issue-form"); 1.476 } 1.477 1.478 @RequestMapping(requestPath = "$project/create-issue", method = HttpMethod.GET) 1.479 - public void createIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DaoProvider dao) throws IOException, SQLException, ServletException { 1.480 + public void createIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObject dao) throws IOException, SQLException, ServletException { 1.481 final var viewModel = new IssueEditView(); 1.482 populate(viewModel, pathParameters, dao); 1.483 1.484 @@ -521,7 +547,8 @@ 1.485 return; 1.486 } 1.487 1.488 - final var issue = new Issue(-1); 1.489 + // TODO: fix #38 - automatically select component (and version) 1.490 + final var issue = new Issue(-1, projectInfo.getProject(), null); 1.491 issue.setProject(projectInfo.getProject()); 1.492 configureIssueEditor(viewModel, issue, dao); 1.493 1.494 @@ -529,27 +556,25 @@ 1.495 } 1.496 1.497 @RequestMapping(requestPath = "commit-issue", method = HttpMethod.POST) 1.498 - public void commitIssue(HttpServletRequest req, HttpServletResponse resp, DaoProvider dao) throws IOException, ServletException { 1.499 + public void commitIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObject dao) throws IOException, ServletException { 1.500 try { 1.501 - final var issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow()); 1.502 - final var componentId = getParameter(req, Integer.class, "component"); 1.503 - final Component component; 1.504 - if (componentId.isPresent()) { 1.505 - component = dao.getComponentDao().find(componentId.get()); 1.506 - } else { 1.507 - component = null; 1.508 - } 1.509 - final var project = dao.getProjectDao().find(getParameter(req, Integer.class, "pid").orElseThrow()); 1.510 + final var project = dao.findProject(getParameter(req, Integer.class, "pid").orElseThrow()); 1.511 if (project == null) { 1.512 // TODO: improve error handling, because not found is not correct for this POST request 1.513 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.514 return; 1.515 } 1.516 - issue.setProject(project); 1.517 + final var componentId = getParameter(req, Integer.class, "component"); 1.518 + final Component component; 1.519 + if (componentId.isPresent()) { 1.520 + component = dao.findComponent(componentId.get()); 1.521 + } else { 1.522 + component = null; 1.523 + } 1.524 + final var issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow(), project, component); 1.525 getParameter(req, String.class, "category").map(IssueCategory::valueOf).ifPresent(issue::setCategory); 1.526 getParameter(req, String.class, "status").map(IssueStatus::valueOf).ifPresent(issue::setStatus); 1.527 issue.setSubject(getParameter(req, String.class, "subject").orElseThrow()); 1.528 - issue.setComponent(component); 1.529 getParameter(req, Integer.class, "assignee").map(userid -> { 1.530 if (userid >= 0) { 1.531 return new User(userid); 1.532 @@ -566,23 +591,23 @@ 1.533 getParameter(req, Integer[].class, "affected") 1.534 .map(Stream::of) 1.535 .map(stream -> 1.536 - stream.map(Version::new).collect(Collectors.toList()) 1.537 + stream.map(id -> new Version(id, project.getId())) 1.538 + .collect(Collectors.toList()) 1.539 ).ifPresent(issue::setAffectedVersions); 1.540 getParameter(req, Integer[].class, "resolved") 1.541 .map(Stream::of) 1.542 .map(stream -> 1.543 - stream.map(Version::new).collect(Collectors.toList()) 1.544 + stream.map(id -> new Version(id, project.getId())) 1.545 + .collect(Collectors.toList()) 1.546 ).ifPresent(issue::setResolvedVersions); 1.547 1.548 - final var issueDao = dao.getIssueDao(); 1.549 if (issue.getId() > 0) { 1.550 - // TODO: use return value 1.551 - issueDao.update(issue); 1.552 + dao.updateIssue(issue); 1.553 } else { 1.554 - issueDao.save(issue, project); 1.555 + dao.insertIssue(issue); 1.556 } 1.557 1.558 - // TODO: fix redirect location 1.559 + // TODO: implement #110 1.560 setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/view"); 1.561 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); 1.562 1.563 @@ -594,19 +619,19 @@ 1.564 } 1.565 1.566 @RequestMapping(requestPath = "commit-issue-comment", method = HttpMethod.POST) 1.567 - public void commentIssue(HttpServletRequest req, HttpServletResponse resp, DaoProvider dao) throws IOException, ServletException { 1.568 + public void commentIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObject dao) throws IOException, ServletException { 1.569 final var issueIdParam = getParameter(req, Integer.class, "issueid"); 1.570 if (issueIdParam.isEmpty()) { 1.571 resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Detected manipulated form."); 1.572 return; 1.573 } 1.574 - final var issue = dao.getIssueDao().find(issueIdParam.get()); 1.575 + final var issue = dao.findIssue(issueIdParam.get()); 1.576 if (issue == null) { 1.577 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.578 return; 1.579 } 1.580 try { 1.581 - final var issueComment = new IssueComment(getParameter(req, Integer.class, "commentid").orElse(-1)); 1.582 + final var issueComment = new IssueComment(getParameter(req, Integer.class, "commentid").orElse(-1), issue.getId()); 1.583 issueComment.setComment(getParameter(req, String.class, "comment").orElse("")); 1.584 1.585 if (issueComment.getComment().isBlank()) { 1.586 @@ -615,12 +640,11 @@ 1.587 1.588 LOG.debug("User {} is commenting on issue #{}", req.getRemoteUser(), issue.getId()); 1.589 if (req.getRemoteUser() != null) { 1.590 - Optional.ofNullable(dao.getUserDao().findByUsername(req.getRemoteUser())).ifPresent(issueComment::setAuthor); 1.591 + Optional.ofNullable(dao.findUserByName(req.getRemoteUser())).ifPresent(issueComment::setAuthor); 1.592 } 1.593 1.594 - dao.getIssueDao().saveComment(issue, issueComment); 1.595 + dao.insertComment(issueComment); 1.596 1.597 - // TODO: fix redirect location 1.598 setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/view"); 1.599 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); 1.600