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

Thu, 22 Oct 2020 12:00:34 +0200

author
Mike Becker <universe@uap-core.de>
date
Thu, 22 Oct 2020 12:00:34 +0200
changeset 137
a7e543ab0c5f
parent 136
7281bdf43c60
child 138
e2aa673dd473
permissions
-rw-r--r--

fixes creation of redirect link when commenting an issue

     1 /*
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * Copyright 2018 Mike Becker. All rights reserved.
     5  *
     6  * Redistribution and use in source and binary forms, with or without
     7  * modification, are permitted provided that the following conditions are met:
     8  *
     9  *   1. Redistributions of source code must retain the above copyright
    10  *      notice, this list of conditions and the following disclaimer.
    11  *
    12  *   2. Redistributions in binary form must reproduce the above copyright
    13  *      notice, this list of conditions and the following disclaimer in the
    14  *      documentation and/or other materials provided with the distribution.
    15  *
    16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
    20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    26  * POSSIBILITY OF SUCH DAMAGE.
    27  *
    28  */
    29 package de.uapcore.lightpit.modules;
    32 import de.uapcore.lightpit.*;
    33 import de.uapcore.lightpit.dao.DataAccessObjects;
    34 import de.uapcore.lightpit.entities.*;
    35 import de.uapcore.lightpit.types.WebColor;
    36 import de.uapcore.lightpit.viewmodel.*;
    37 import de.uapcore.lightpit.viewmodel.util.IssueSorter;
    38 import org.slf4j.Logger;
    39 import org.slf4j.LoggerFactory;
    41 import javax.servlet.annotation.WebServlet;
    42 import javax.servlet.http.HttpServletRequest;
    43 import javax.servlet.http.HttpServletResponse;
    44 import java.io.IOException;
    45 import java.sql.Date;
    46 import java.sql.SQLException;
    47 import java.util.List;
    48 import java.util.NoSuchElementException;
    49 import java.util.Optional;
    50 import java.util.stream.Collectors;
    51 import java.util.stream.Stream;
    53 @WebServlet(
    54         name = "ProjectsModule",
    55         urlPatterns = "/projects/*"
    56 )
    57 public final class ProjectsModule extends AbstractLightPITServlet {
    59     private static final Logger LOG = LoggerFactory.getLogger(ProjectsModule.class);
    61     @Override
    62     protected String getResourceBundleName() {
    63         return "localization.projects";
    64     }
    66     private void populate(ProjectView viewModel, PathParameters pathParameters, DataAccessObjects dao) throws SQLException {
    67         final var projectDao = dao.getProjectDao();
    68         final var versionDao = dao.getVersionDao();
    69         final var componentDao = dao.getComponentDao();
    71         projectDao.list().stream().map(ProjectInfo::new).forEach(viewModel.getProjectList()::add);
    73         if (pathParameters == null)
    74             return;
    76         // Select Project
    77         final int pid = Functions.parseIntOrZero(pathParameters.get("project"));
    78         if (pid > 0) {
    79             final var project = projectDao.find(pid);
    80             if (project != null) {
    81                 final var info = new ProjectInfo(project);
    82                 info.setVersions(versionDao.list(project));
    83                 info.setComponents(componentDao.list(project));
    84                 info.setIssueSummary(projectDao.getIssueSummary(project));
    85                 viewModel.setProjectInfo(info);
    86             }
    87         }
    89         // Select Version
    90         final var pathParamVersion = pathParameters.get("version");
    91         if ("no-version".equals(pathParamVersion)) {
    92             viewModel.setVersionFilter(ProjectView.NO_VERSION);
    93         } else if ("all-versions".equals(pathParamVersion)) {
    94             viewModel.setVersionFilter(ProjectView.ALL_VERSIONS);
    95         } else {
    96             final int vid = Functions.parseIntOrZero(pathParamVersion);
    97             if (vid > 0) {
    98                 viewModel.setVersionFilter(versionDao.find(vid));
    99             }
   100         }
   102         // Select Component
   103         final var pathParamComponent = pathParameters.get("component");
   104         if ("no-component".equals(pathParamComponent)) {
   105             viewModel.setComponentFilter(ProjectView.NO_COMPONENT);
   106         } else if ("all-components".equals(pathParamComponent)) {
   107             viewModel.setComponentFilter(ProjectView.ALL_COMPONENTS);
   108         } else {
   109             final int cid = Functions.parseIntOrZero(pathParamComponent);
   110             if (cid > 0) {
   111                 viewModel.setComponentFilter(componentDao.find(cid));
   112             }
   113         }
   114     }
   116     private ResponseType forwardView(HttpServletRequest req, ProjectView viewModel, String name) {
   117         setViewModel(req, viewModel);
   118         setContentPage(req, name);
   119         setStylesheet(req, "projects");
   120         setNavigationMenu(req, "project-navmenu");
   121         return ResponseType.HTML;
   122     }
   124     @RequestMapping(method = HttpMethod.GET)
   125     public ResponseType index(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
   126         final var viewModel = new ProjectView();
   127         populate(viewModel, null, dao);
   129         final var projectDao = dao.getProjectDao();
   130         final var versionDao = dao.getVersionDao();
   132         for (var info : viewModel.getProjectList()) {
   133             info.setVersions(versionDao.list(info.getProject()));
   134             info.setIssueSummary(projectDao.getIssueSummary(info.getProject()));
   135         }
   137         return forwardView(req, viewModel, "projects");
   138     }
   140     private void configureProjectEditor(ProjectEditView viewModel, Project project, DataAccessObjects dao) throws SQLException {
   141         viewModel.setProject(project);
   142         viewModel.setUsers(dao.getUserDao().list());
   143     }
   145     @RequestMapping(requestPath = "$project/edit", method = HttpMethod.GET)
   146     public ResponseType edit(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DataAccessObjects dao) throws IOException, SQLException {
   147         final var viewModel = new ProjectEditView();
   148         populate(viewModel, pathParams, dao);
   150         if (!viewModel.isProjectInfoPresent()) {
   151             resp.sendError(HttpServletResponse.SC_NOT_FOUND);
   152             return ResponseType.NONE;
   153         }
   155         configureProjectEditor(viewModel, viewModel.getProjectInfo().getProject(), dao);
   156         return forwardView(req, viewModel, "project-form");
   157     }
   159     @RequestMapping(requestPath = "create", method = HttpMethod.GET)
   160     public ResponseType create(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
   161         final var viewModel = new ProjectEditView();
   162         populate(viewModel, null, dao);
   163         configureProjectEditor(viewModel, new Project(-1), dao);
   164         return forwardView(req, viewModel, "project-form");
   165     }
   167     @RequestMapping(requestPath = "commit", method = HttpMethod.POST)
   168     public ResponseType commit(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException {
   170         try {
   171             final var project = new Project(getParameter(req, Integer.class, "pid").orElseThrow());
   172             project.setName(getParameter(req, String.class, "name").orElseThrow());
   173             getParameter(req, String.class, "description").ifPresent(project::setDescription);
   174             getParameter(req, String.class, "repoUrl").ifPresent(project::setRepoUrl);
   175             getParameter(req, Integer.class, "owner").map(
   176                     ownerId -> ownerId >= 0 ? new User(ownerId) : null
   177             ).ifPresent(project::setOwner);
   179             dao.getProjectDao().saveOrUpdate(project);
   181             setRedirectLocation(req, "./projects/");
   182             setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL);
   183             LOG.debug("Successfully updated project {}", project.getName());
   185             return ResponseType.HTML;
   186         } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) {
   187             resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
   188             // TODO: implement - fix issue #21
   189             return ResponseType.NONE;
   190         }
   191     }
   193     @RequestMapping(requestPath = "$project/$component/$version/issues/", method = HttpMethod.GET)
   194     public ResponseType issues(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DataAccessObjects dao) throws SQLException, IOException {
   195         final var viewModel = new ProjectDetailsView();
   196         populate(viewModel, pathParams, dao);
   198         if (!viewModel.isEveryFilterValid()) {
   199             resp.sendError(HttpServletResponse.SC_NOT_FOUND);
   200             return ResponseType.NONE;
   201         }
   203         final var project = viewModel.getProjectInfo().getProject();
   204         final var version = viewModel.getVersionFilter();
   205         final var component = viewModel.getComponentFilter();
   207         final var issueDao = dao.getIssueDao();
   209         final List<Issue> issues;
   210         if (version.equals(ProjectView.NO_VERSION)) {
   211             if (component.equals(ProjectView.ALL_COMPONENTS)) {
   212                 issues = issueDao.list(project, (Version) null);
   213             } else if (component.equals(ProjectView.NO_COMPONENT)) {
   214                 issues = issueDao.list(project, null, null);
   215             } else {
   216                 issues = issueDao.list(project, component, null);
   217             }
   218         } else if (version.equals(ProjectView.ALL_VERSIONS)) {
   219             if (component.equals(ProjectView.ALL_COMPONENTS)) {
   220                 issues = issueDao.list(project);
   221             } else if (component.equals(ProjectView.NO_COMPONENT)) {
   222                 issues = issueDao.list(project, (Component)null);
   223             } else {
   224                 issues = issueDao.list(project, component);
   225             }
   226         } else {
   227             if (component.equals(ProjectView.ALL_COMPONENTS)) {
   228                 issues = issueDao.list(project, version);
   229             } else if (component.equals(ProjectView.NO_COMPONENT)) {
   230                 issues = issueDao.list(project, null, version);
   231             } else {
   232                 issues = issueDao.list(project, component, version);
   233             }
   234         }
   236         for (var issue : issues) issueDao.joinVersionInformation(issue);
   237         issues.sort(new IssueSorter(
   238                 new IssueSorter.Criteria(IssueSorter.Field.PHASE, true),
   239                 new IssueSorter.Criteria(IssueSorter.Field.ETA, true),
   240                 new IssueSorter.Criteria(IssueSorter.Field.UPDATED, false)
   241         ));
   244         viewModel.getProjectDetails().updateDetails(issues);
   245         if (version.getId() > 0)
   246             viewModel.getProjectDetails().updateVersionInfo(version);
   248         return forwardView(req, viewModel, "project-details");
   249     }
   251     @RequestMapping(requestPath = "$project/versions/", method = HttpMethod.GET)
   252     public ResponseType versions(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException {
   253         final var viewModel = new VersionsView();
   254         populate(viewModel, pathParameters, dao);
   256         final var projectInfo = viewModel.getProjectInfo();
   257         if (projectInfo == null) {
   258             resp.sendError(HttpServletResponse.SC_NOT_FOUND);
   259             return ResponseType.NONE;
   260         }
   262         final var issueDao = dao.getIssueDao();
   263         final var issues = issueDao.list(projectInfo.getProject());
   264         for (var issue : issues) issueDao.joinVersionInformation(issue);
   265         viewModel.update(projectInfo.getVersions(), issues);
   267         return forwardView(req, viewModel, "versions");
   268     }
   270     @RequestMapping(requestPath = "$project/versions/$version/edit", method = HttpMethod.GET)
   271     public ResponseType editVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException {
   272         final var viewModel = new VersionEditView();
   273         populate(viewModel, pathParameters, dao);
   275         if (viewModel.getProjectInfo() == null || viewModel.getVersionFilter() == null) {
   276             resp.sendError(HttpServletResponse.SC_NOT_FOUND);
   277             return ResponseType.NONE;
   278         }
   280         viewModel.setVersion(viewModel.getVersionFilter());
   282         return forwardView(req, viewModel, "version-form");
   283     }
   285     @RequestMapping(requestPath = "$project/create-version", method = HttpMethod.GET)
   286     public ResponseType createVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException {
   287         final var viewModel = new VersionEditView();
   288         populate(viewModel, pathParameters, dao);
   290         if (viewModel.getProjectInfo() == null) {
   291             resp.sendError(HttpServletResponse.SC_NOT_FOUND);
   292             return ResponseType.NONE;
   293         }
   295         viewModel.setVersion(viewModel.getVersionFilter());
   297         return forwardView(req, viewModel, "version-form");
   298     }
   300     @RequestMapping(requestPath = "commit-version", method = HttpMethod.POST)
   301     public ResponseType commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException {
   303         try {
   304             final var project = new Project(getParameter(req, Integer.class, "pid").orElseThrow());
   305             final var version = new Version(getParameter(req, Integer.class, "id").orElseThrow());
   306             version.setName(getParameter(req, String.class, "name").orElseThrow());
   307             getParameter(req, Integer.class, "ordinal").ifPresent(version::setOrdinal);
   308             version.setStatus(VersionStatus.valueOf(getParameter(req, String.class, "status").orElseThrow()));
   309             dao.getVersionDao().saveOrUpdate(version, project);
   311             setRedirectLocation(req, "./projects/" + project.getId() + "/versions/");
   312             setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL);
   313         } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) {
   314             resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
   315             // TODO: implement - fix issue #21
   316             return ResponseType.NONE;
   317         }
   319         return ResponseType.HTML;
   320     }
   322     @RequestMapping(requestPath = "$project/components/", method = HttpMethod.GET)
   323     public ResponseType components(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException {
   324         final var viewModel = new ComponentsView();
   325         populate(viewModel, pathParameters, dao);
   327         final var projectInfo = viewModel.getProjectInfo();
   328         if (projectInfo == null) {
   329             resp.sendError(HttpServletResponse.SC_NOT_FOUND);
   330             return ResponseType.NONE;
   331         }
   333         final var issueDao = dao.getIssueDao();
   334         final var issues = issueDao.list(projectInfo.getProject());
   335         viewModel.update(projectInfo.getComponents(), issues);
   337         return forwardView(req, viewModel, "components");
   338     }
   340     @RequestMapping(requestPath = "$project/components/$component/edit", method = HttpMethod.GET)
   341     public ResponseType editComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException {
   342         final var viewModel = new ComponentEditView();
   343         populate(viewModel, pathParameters, dao);
   345         if (viewModel.getProjectInfo() == null || viewModel.getComponentFilter() == null) {
   346             resp.sendError(HttpServletResponse.SC_NOT_FOUND);
   347             return ResponseType.NONE;
   348         }
   350         viewModel.setComponent(viewModel.getComponentFilter());
   351         viewModel.setUsers(dao.getUserDao().list());
   353         return forwardView(req, viewModel, "component-form");
   354     }
   356     @RequestMapping(requestPath = "$project/create-component", method = HttpMethod.GET)
   357     public ResponseType createComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException {
   358         final var viewModel = new ComponentEditView();
   359         populate(viewModel, pathParameters, dao);
   361         if (viewModel.getProjectInfo() == null) {
   362             resp.sendError(HttpServletResponse.SC_NOT_FOUND);
   363             return ResponseType.NONE;
   364         }
   366         viewModel.setComponent(new Component(-1));
   367         viewModel.setUsers(dao.getUserDao().list());
   369         return forwardView(req, viewModel, "component-form");
   370     }
   372     @RequestMapping(requestPath = "commit-component", method = HttpMethod.POST)
   373     public ResponseType commitComponent(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException {
   375         try {
   376             final var project = new Project(getParameter(req, Integer.class, "pid").orElseThrow());
   377             final var component = new Component(getParameter(req, Integer.class, "id").orElseThrow());
   378             component.setName(getParameter(req, String.class, "name").orElseThrow());
   379             component.setColor(getParameter(req, WebColor.class, "color").orElseThrow());
   380             getParameter(req, Integer.class, "ordinal").ifPresent(component::setOrdinal);
   381             getParameter(req, Integer.class, "lead").map(
   382                     userid -> userid >= 0 ? new User(userid) : null
   383             ).ifPresent(component::setLead);
   384             getParameter(req, String.class, "description").ifPresent(component::setDescription);
   386             dao.getComponentDao().saveOrUpdate(component, project);
   388             setRedirectLocation(req, "./projects/" + project.getId() + "/components/");
   389             setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL);
   390         } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) {
   391             resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
   392             // TODO: implement - fix issue #21
   393             return ResponseType.NONE;
   394         }
   396         return ResponseType.HTML;
   397     }
   399     private void configureIssueEditor(IssueEditView viewModel, Issue issue, DataAccessObjects dao) throws SQLException {
   400         final var project = viewModel.getProjectInfo().getProject();
   401         issue.setProject(project);
   402         viewModel.setIssue(issue);
   403         viewModel.configureVersionSelectors(viewModel.getProjectInfo().getVersions());
   404         viewModel.setUsers(dao.getUserDao().list());
   405         viewModel.setComponents(dao.getComponentDao().list(project));
   406         if (issue.getId() >= 0) {
   407             viewModel.setComments(dao.getIssueDao().listComments(issue));
   408         }
   409     }
   411     @RequestMapping(requestPath = "$project/issues/$issue/edit", method = HttpMethod.GET)
   412     public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException {
   413         final var viewModel = new IssueEditView();
   414         populate(viewModel, pathParameters, dao);
   416         final var projectInfo = viewModel.getProjectInfo();
   417         if (projectInfo == null) {
   418             resp.sendError(HttpServletResponse.SC_NOT_FOUND);
   419             return ResponseType.NONE;
   420         }
   422         final var issueDao = dao.getIssueDao();
   423         final var issue = issueDao.find(Functions.parseIntOrZero(pathParameters.get("issue")));
   424         if (issue == null) {
   425             resp.sendError(HttpServletResponse.SC_NOT_FOUND);
   426             return ResponseType.NONE;
   427         }
   429         issueDao.joinVersionInformation(issue);
   430         configureIssueEditor(viewModel, issue, dao);
   432         return forwardView(req, viewModel, "issue-form");
   433     }
   435     @RequestMapping(requestPath = "$project/create-issue", method = HttpMethod.GET)
   436     public ResponseType createIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException {
   437         final var viewModel = new IssueEditView();
   438         populate(viewModel, pathParameters, dao);
   440         final var projectInfo = viewModel.getProjectInfo();
   441         if (projectInfo == null) {
   442             resp.sendError(HttpServletResponse.SC_NOT_FOUND);
   443             return ResponseType.NONE;
   444         }
   446         final var issue = new Issue(-1);
   447         issue.setProject(projectInfo.getProject());
   448         configureIssueEditor(viewModel, issue, dao);
   450         return forwardView(req, viewModel, "issue-form");
   451     }
   453     @RequestMapping(requestPath = "commit-issue", method = HttpMethod.POST)
   454     public ResponseType commitIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException {
   455         try {
   456             final var issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow());
   457             final var componentId = getParameter(req, Integer.class, "component");
   458             final Component component;
   459             if (componentId.isPresent()) {
   460                 component = dao.getComponentDao().find(componentId.get());
   461             } else {
   462                 component = null;
   463             }
   464             issue.setProject(new Project(getParameter(req, Integer.class, "pid").orElseThrow()));
   465             getParameter(req, String.class, "category").map(IssueCategory::valueOf).ifPresent(issue::setCategory);
   466             getParameter(req, String.class, "status").map(IssueStatus::valueOf).ifPresent(issue::setStatus);
   467             issue.setSubject(getParameter(req, String.class, "subject").orElseThrow());
   468             issue.setComponent(component);
   469             getParameter(req, Integer.class, "assignee").map(userid -> {
   470                 if (userid >= 0) {
   471                     return new User(userid);
   472                 } else if (userid == -2) {
   473                     return Optional.ofNullable(component).map(Component::getLead).orElse(null);
   474                 } else {
   475                     return null;
   476                 }
   477             }
   478             ).ifPresent(issue::setAssignee);
   479             getParameter(req, String.class, "description").ifPresent(issue::setDescription);
   480             getParameter(req, Date.class, "eta").ifPresent(issue::setEta);
   482             getParameter(req, Integer[].class, "affected")
   483                     .map(Stream::of)
   484                     .map(stream ->
   485                             stream.map(Version::new).collect(Collectors.toList())
   486                     ).ifPresent(issue::setAffectedVersions);
   487             getParameter(req, Integer[].class, "resolved")
   488                     .map(Stream::of)
   489                     .map(stream ->
   490                             stream.map(Version::new).collect(Collectors.toList())
   491                     ).ifPresent(issue::setResolvedVersions);
   493             dao.getIssueDao().saveOrUpdate(issue, issue.getProject());
   495             // TODO: fix issue #14
   496             setRedirectLocation(req, "./projects/" + issue.getProject().getId() + "/all-components/all-versions/issues/");
   497             setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL);
   499             return ResponseType.HTML;
   500         } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) {
   501             resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
   502             // TODO: implement - fix issue #21
   503             return ResponseType.NONE;
   504         }
   505     }
   507     @RequestMapping(requestPath = "commit-issue-comment", method = HttpMethod.POST)
   508     public ResponseType commentIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException, IOException {
   509         final var issueIdParam = getParameter(req, Integer.class, "issueid");
   510         if (issueIdParam.isEmpty()) {
   511             resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Detected manipulated form.");
   512             return ResponseType.NONE;
   513         }
   514         final var issue = dao.getIssueDao().find(issueIdParam.get());
   515         if (issue == null) {
   516             resp.sendError(HttpServletResponse.SC_NOT_FOUND);
   517             return ResponseType.NONE;
   518         }
   519         try {
   520             final var issueComment = new IssueComment(getParameter(req, Integer.class, "commentid").orElse(-1), issue);
   521             issueComment.setComment(getParameter(req, String.class, "comment").orElse(""));
   523             if (issueComment.getComment().isBlank()) {
   524                 throw new IllegalArgumentException("comment.null");
   525             }
   527             LOG.debug("User {} is commenting on issue #{}", req.getRemoteUser(), issue.getId());
   528             if (req.getRemoteUser() != null) {
   529                 dao.getUserDao().findByUsername(req.getRemoteUser()).ifPresent(issueComment::setAuthor);
   530             }
   532             dao.getIssueDao().saveComment(issueComment);
   534             // TODO: fix redirect location (e.g. after fixing #24)
   535             setRedirectLocation(req, "./projects/" + issue.getProject().getId()+"/issues/"+issue.getId()+"/edit");
   536             setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL);
   538             return ResponseType.HTML;
   539         } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) {
   540             resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
   541             // TODO: implement - fix issue #21
   542             return ResponseType.NONE;
   543         }
   544     }
   545 }

mercurial