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

changeset 167
3f30adba1c63
parent 162
2adc8623dd89
child 168
1c3694ae224c
     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  

mercurial