adds backend methods for issues (TODO: implement commitIssue())

Mon, 18 May 2020 21:08:14 +0200

author
Mike Becker <universe@uap-core.de>
date
Mon, 18 May 2020 21:08:14 +0200
changeset 64
0f1746c6abfb
parent 63
51aa5e267c7f
child 65
9861a68a4612

adds backend methods for issues (TODO: implement commitIssue())

src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java file | annotate | diff | comparison | revisions
src/main/resources/localization/projects.properties file | annotate | diff | comparison | revisions
src/main/resources/localization/projects_de.properties file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/dynamic_fragments/projects.jsp file | annotate | diff | comparison | revisions
     1.1 --- a/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java	Mon May 18 21:06:38 2020 +0200
     1.2 +++ b/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java	Mon May 18 21:08:14 2020 +0200
     1.3 @@ -31,10 +31,7 @@
     1.4  
     1.5  import de.uapcore.lightpit.*;
     1.6  import de.uapcore.lightpit.dao.DataAccessObjects;
     1.7 -import de.uapcore.lightpit.entities.Project;
     1.8 -import de.uapcore.lightpit.entities.User;
     1.9 -import de.uapcore.lightpit.entities.Version;
    1.10 -import de.uapcore.lightpit.entities.VersionStatus;
    1.11 +import de.uapcore.lightpit.entities.*;
    1.12  import org.slf4j.Logger;
    1.13  import org.slf4j.LoggerFactory;
    1.14  
    1.15 @@ -44,7 +41,6 @@
    1.16  import java.io.IOException;
    1.17  import java.sql.SQLException;
    1.18  import java.util.NoSuchElementException;
    1.19 -import java.util.Optional;
    1.20  
    1.21  import static de.uapcore.lightpit.Functions.fqn;
    1.22  
    1.23 @@ -63,6 +59,20 @@
    1.24  
    1.25      public static final String SESSION_ATTR_SELECTED_PROJECT = fqn(ProjectsModule.class, "selected-project");
    1.26  
    1.27 +    private Project getSelectedProject(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
    1.28 +        final var projectDao = dao.getProjectDao();
    1.29 +        final var session = req.getSession();
    1.30 +        final var projectSelection = getParameter(req, Integer.class, "pid");
    1.31 +        if (projectSelection.isPresent()) {
    1.32 +            final var selectedId = projectSelection.get();
    1.33 +            final var selectedProject = projectDao.find(selectedId);
    1.34 +            session.setAttribute(SESSION_ATTR_SELECTED_PROJECT, selectedProject);
    1.35 +            return selectedProject;
    1.36 +        } else {
    1.37 +            return (Project) session.getAttribute(SESSION_ATTR_SELECTED_PROJECT);
    1.38 +        }
    1.39 +    }
    1.40 +
    1.41      @RequestMapping(method = HttpMethod.GET)
    1.42      public ResponseType indexRedirect(HttpServletResponse resp) throws IOException {
    1.43          resp.sendRedirect("index/");
    1.44 @@ -71,26 +81,14 @@
    1.45  
    1.46      @RequestMapping(requestPath = "index", method = HttpMethod.GET, menuKey = "menu.index")
    1.47      public ResponseType index(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
    1.48 +
    1.49          final var projectList = dao.getProjectDao().list();
    1.50          req.setAttribute("projects", projectList);
    1.51          setDynamicFragment(req, "projects");
    1.52          setStylesheet(req, "projects");
    1.53  
    1.54 -        final var session = req.getSession();
    1.55 -        final var projectSelection = getParameter(req, Integer.class, "select");
    1.56 -        if (projectSelection.isPresent()) {
    1.57 -            final var selectedId = projectSelection.get();
    1.58 -            for (var proj : projectList) {
    1.59 -                if (proj.getId() == selectedId) {
    1.60 -                    session.setAttribute(SESSION_ATTR_SELECTED_PROJECT, proj);
    1.61 -                    break;
    1.62 -                }
    1.63 -            }
    1.64 -        } else {
    1.65 -            final var selectedProject = session.getAttribute(SESSION_ATTR_SELECTED_PROJECT);
    1.66 -            if (selectedProject == null) {
    1.67 -                projectList.stream().findFirst().ifPresent(proj -> session.setAttribute(SESSION_ATTR_SELECTED_PROJECT, proj));
    1.68 -            }
    1.69 +        if (getSelectedProject(req, dao) == null) {
    1.70 +            projectList.stream().findFirst().ifPresent(proj -> req.getSession().setAttribute(SESSION_ATTR_SELECTED_PROJECT, proj));
    1.71          }
    1.72  
    1.73          return ResponseType.HTML;
    1.74 @@ -100,14 +98,7 @@
    1.75      public ResponseType edit(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
    1.76          final var projectDao = dao.getProjectDao();
    1.77  
    1.78 -        Optional<Integer> id = getParameter(req, Integer.class, "id");
    1.79 -        if (id.isPresent()) {
    1.80 -            req.setAttribute("project", Optional.ofNullable(projectDao.find(id.get())).orElse(new Project(-1)));
    1.81 -        } else {
    1.82 -            req.setAttribute("project", new Project(-1));
    1.83 -        }
    1.84 -        req.setAttribute("users", dao.getUserDao().list());
    1.85 -
    1.86 +        req.setAttribute("project", findByParameter(req, Integer.class, "id", projectDao::find));
    1.87          setDynamicFragment(req, "project-form");
    1.88  
    1.89          return ResponseType.HTML;
    1.90 @@ -144,7 +135,7 @@
    1.91  
    1.92      @RequestMapping(requestPath = "versions", method = HttpMethod.GET, menuKey = "menu.versions")
    1.93      public ResponseType versions(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
    1.94 -        final var selectedProject = (Project)req.getSession().getAttribute(SESSION_ATTR_SELECTED_PROJECT);
    1.95 +        final var selectedProject = getSelectedProject(req, dao);
    1.96          if (selectedProject == null) {
    1.97              resp.sendError(HttpServletResponse.SC_FORBIDDEN);
    1.98              return ResponseType.NONE;
    1.99 @@ -158,18 +149,13 @@
   1.100  
   1.101      @RequestMapping(requestPath = "versions/edit", method = HttpMethod.GET)
   1.102      public ResponseType editVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
   1.103 -        final var selectedProject = (Project)req.getSession().getAttribute(SESSION_ATTR_SELECTED_PROJECT);
   1.104 +        final var selectedProject = getSelectedProject(req, dao);
   1.105          if (selectedProject == null) {
   1.106              resp.sendError(HttpServletResponse.SC_FORBIDDEN);
   1.107              return ResponseType.NONE;
   1.108          }
   1.109  
   1.110 -        Optional<Integer> id = getParameter(req, Integer.class, "id");
   1.111 -        if (id.isPresent()) {
   1.112 -            req.setAttribute("version", Optional.ofNullable(dao.getVersionDao().find(id.get())).orElse(new Version(-1, selectedProject)));
   1.113 -        } else {
   1.114 -            req.setAttribute("version", new Version(-1, selectedProject));
   1.115 -        }
   1.116 +        req.setAttribute("version", findByParameter(req, Integer.class, "id", dao.getVersionDao()::find));
   1.117          req.setAttribute("versionStatusEnum", VersionStatus.values());
   1.118  
   1.119          setDynamicFragment(req, "version-form");
   1.120 @@ -178,8 +164,8 @@
   1.121      }
   1.122  
   1.123      @RequestMapping(requestPath = "versions/commit", method = HttpMethod.POST)
   1.124 -    public ResponseType commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException {
   1.125 -        final var selectedProject = (Project)req.getSession().getAttribute(SESSION_ATTR_SELECTED_PROJECT);
   1.126 +    public ResponseType commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
   1.127 +        final var selectedProject = getSelectedProject(req, dao);
   1.128          if (selectedProject == null) {
   1.129              resp.sendError(HttpServletResponse.SC_FORBIDDEN);
   1.130              return ResponseType.NONE;
   1.131 @@ -207,4 +193,68 @@
   1.132  
   1.133          return ResponseType.HTML;
   1.134      }
   1.135 +
   1.136 +
   1.137 +    @RequestMapping(requestPath = "issues", method = HttpMethod.GET, menuKey = "menu.issues")
   1.138 +    public ResponseType issues(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
   1.139 +        final var selectedProject = getSelectedProject(req, dao);
   1.140 +        if (selectedProject == null) {
   1.141 +            resp.sendError(HttpServletResponse.SC_FORBIDDEN);
   1.142 +            return ResponseType.NONE;
   1.143 +        }
   1.144 +
   1.145 +        req.setAttribute("issues", dao.getVersionDao().list(selectedProject));
   1.146 +        setDynamicFragment(req, "issues");
   1.147 +
   1.148 +        return ResponseType.HTML;
   1.149 +    }
   1.150 +
   1.151 +    @RequestMapping(requestPath = "issues/edit", method = HttpMethod.GET)
   1.152 +    public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
   1.153 +        final var selectedProject = getSelectedProject(req, dao);
   1.154 +        if (selectedProject == null) {
   1.155 +            resp.sendError(HttpServletResponse.SC_FORBIDDEN);
   1.156 +            return ResponseType.NONE;
   1.157 +        }
   1.158 +
   1.159 +        req.setAttribute("issue", findByParameter(req, Integer.class, "id", dao.getIssueDao()::find));
   1.160 +        req.setAttribute("issueStatusEnum", IssueStatus.values());
   1.161 +        req.setAttribute("issueCategoryEnum", IssueCategory.values());
   1.162 +
   1.163 +        setDynamicFragment(req, "issue-form");
   1.164 +
   1.165 +        return ResponseType.HTML;
   1.166 +    }
   1.167 +
   1.168 +    @RequestMapping(requestPath = "issues/commit", method = HttpMethod.POST)
   1.169 +    public ResponseType commitIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
   1.170 +        final var selectedProject = getSelectedProject(req, dao);
   1.171 +        if (selectedProject == null) {
   1.172 +            resp.sendError(HttpServletResponse.SC_FORBIDDEN);
   1.173 +            return ResponseType.NONE;
   1.174 +        }
   1.175 +
   1.176 +        Issue issue = new Issue(-1, selectedProject);
   1.177 +        try {
   1.178 +            issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow(), selectedProject);
   1.179 +
   1.180 +            // TODO: implement
   1.181 +
   1.182 +            dao.getIssueDao().saveOrUpdate(issue);
   1.183 +
   1.184 +            setRedirectLocation(req, "./projects/issues/");
   1.185 +            setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL);
   1.186 +            LOG.debug("Successfully updated issue {} for project {}", issue.getId(), selectedProject.getName());
   1.187 +        } catch (NoSuchElementException | NumberFormatException | SQLException ex) {
   1.188 +            // TODO: set request attribute with error text
   1.189 +            req.setAttribute("issue", issue);
   1.190 +            req.setAttribute("issueStatusEnum", IssueStatus.values());
   1.191 +            req.setAttribute("issueCategoryEnum", IssueCategory.values());
   1.192 +            setDynamicFragment(req, "issue-form");
   1.193 +            LOG.warn("Form validation failure: {}", ex.getMessage());
   1.194 +            LOG.debug("Details:", ex);
   1.195 +        }
   1.196 +
   1.197 +        return ResponseType.HTML;
   1.198 +    }
   1.199  }
     2.1 --- a/src/main/resources/localization/projects.properties	Mon May 18 21:06:38 2020 +0200
     2.2 +++ b/src/main/resources/localization/projects.properties	Mon May 18 21:08:14 2020 +0200
     2.3 @@ -25,6 +25,7 @@
     2.4  
     2.5  menu.index=Index
     2.6  menu.versions=Versions
     2.7 +menu.issues=Issues
     2.8  
     2.9  button.create=New Project
    2.10  button.version.create=New Version
     3.1 --- a/src/main/resources/localization/projects_de.properties	Mon May 18 21:06:38 2020 +0200
     3.2 +++ b/src/main/resources/localization/projects_de.properties	Mon May 18 21:08:14 2020 +0200
     3.3 @@ -25,6 +25,7 @@
     3.4  
     3.5  menu.index=Index
     3.6  menu.versions=Versionen
     3.7 +menu.issues=Vorg\u00e4nge
     3.8  
     3.9  button.create=Neues Projekt
    3.10  button.version.create=Neue Version
     4.1 --- a/src/main/webapp/WEB-INF/dynamic_fragments/projects.jsp	Mon May 18 21:06:38 2020 +0200
     4.2 +++ b/src/main/webapp/WEB-INF/dynamic_fragments/projects.jsp	Mon May 18 21:08:14 2020 +0200
     4.3 @@ -67,7 +67,7 @@
     4.4      <c:forEach var="project" items="${projects}">
     4.5          <tr class="nowrap" <c:if test="${project eq selectedProject}">data-selected</c:if> >
     4.6              <td style="width: 2em;"><a href="./${moduleInfo.modulePath}/edit?id=${project.id}">&#x270e;</a></td>
     4.7 -            <td><a href="./${moduleInfo.modulePath}/index/?select=${project.id}"><c:out value="${project.name}"/></a></td>
     4.8 +            <td><a href="./${moduleInfo.modulePath}/index/?pid=${project.id}"><c:out value="${project.name}"/></a></td>
     4.9              <td><c:out value="${project.description}"/></td>
    4.10              <td>
    4.11                  <c:if test="${not empty project.repoUrl}">

mercurial