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

Tue, 19 May 2020 16:57:29 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 19 May 2020 16:57:29 +0200
changeset 68
ded1b5639bd3
parent 67
d15779cf3982
child 70
821c4950b619
permissions
-rw-r--r--

adds request attribute users in commit() error path

     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 org.slf4j.Logger;
    36 import org.slf4j.LoggerFactory;
    38 import javax.servlet.annotation.WebServlet;
    39 import javax.servlet.http.HttpServletRequest;
    40 import javax.servlet.http.HttpServletResponse;
    41 import java.io.IOException;
    42 import java.sql.SQLException;
    43 import java.util.NoSuchElementException;
    45 import static de.uapcore.lightpit.Functions.fqn;
    47 @LightPITModule(
    48         bundleBaseName = "localization.projects",
    49         modulePath = "projects",
    50         defaultPriority = 20
    51 )
    52 @WebServlet(
    53         name = "ProjectsModule",
    54         urlPatterns = "/projects/*"
    55 )
    56 public final class ProjectsModule extends AbstractLightPITServlet {
    58     private static final Logger LOG = LoggerFactory.getLogger(ProjectsModule.class);
    60     public static final String SESSION_ATTR_SELECTED_PROJECT = fqn(ProjectsModule.class, "selected-project");
    62     private Project getSelectedProject(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
    63         final var projectDao = dao.getProjectDao();
    64         final var session = req.getSession();
    65         final var projectSelection = getParameter(req, Integer.class, "pid");
    66         if (projectSelection.isPresent()) {
    67             final var selectedId = projectSelection.get();
    68             final var selectedProject = projectDao.find(selectedId);
    69             session.setAttribute(SESSION_ATTR_SELECTED_PROJECT, selectedProject);
    70             return selectedProject;
    71         } else {
    72             return (Project) session.getAttribute(SESSION_ATTR_SELECTED_PROJECT);
    73         }
    74     }
    76     @RequestMapping(method = HttpMethod.GET)
    77     public ResponseType indexRedirect(HttpServletResponse resp) throws IOException {
    78         resp.sendRedirect("index/");
    79         return ResponseType.NONE;
    80     }
    82     @RequestMapping(requestPath = "index", method = HttpMethod.GET, menuKey = "menu.index")
    83     public ResponseType index(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
    85         final var projectList = dao.getProjectDao().list();
    86         req.setAttribute("projects", projectList);
    87         setDynamicFragment(req, "projects");
    88         setStylesheet(req, "projects");
    90         if (getSelectedProject(req, dao) == null) {
    91             projectList.stream().findFirst().ifPresent(proj -> req.getSession().setAttribute(SESSION_ATTR_SELECTED_PROJECT, proj));
    92         }
    94         return ResponseType.HTML;
    95     }
    97     @RequestMapping(requestPath = "edit", method = HttpMethod.GET)
    98     public ResponseType edit(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
    99         req.setAttribute("project", findByParameter(req, Integer.class, "id",
   100                 dao.getProjectDao()::find).orElse(new Project(-1)));
   101         req.setAttribute("users", dao.getUserDao().list());
   103         setDynamicFragment(req, "project-form");
   105         return ResponseType.HTML;
   106     }
   108     @RequestMapping(requestPath = "commit", method = HttpMethod.POST)
   109     public ResponseType commit(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
   111         Project project = new Project(-1);
   112         try {
   113             project = new Project(getParameter(req, Integer.class, "id").orElseThrow());
   114             project.setName(getParameter(req, String.class, "name").orElseThrow());
   115             getParameter(req, String.class, "description").ifPresent(project::setDescription);
   116             getParameter(req, String.class, "repoUrl").ifPresent(project::setRepoUrl);
   117             getParameter(req, Integer.class, "owner").map(
   118                     ownerId -> ownerId >= 0 ? new User(ownerId) : null
   119             ).ifPresent(project::setOwner);
   121             dao.getProjectDao().saveOrUpdate(project);
   123             setRedirectLocation(req, "./projects/index/");
   124             setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL);
   125             LOG.debug("Successfully updated project {}", project.getName());
   126         } catch (NoSuchElementException | NumberFormatException | SQLException ex) {
   127             // TODO: set request attribute with error text
   128             req.setAttribute("project", project);
   129             req.setAttribute("users", dao.getUserDao().list());
   130             setDynamicFragment(req, "project-form");
   131             LOG.warn("Form validation failure: {}", ex.getMessage());
   132             LOG.debug("Details:", ex);
   133         }
   135         return ResponseType.HTML;
   136     }
   138     @RequestMapping(requestPath = "versions", method = HttpMethod.GET, menuKey = "menu.versions")
   139     public ResponseType versions(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
   140         final var selectedProject = getSelectedProject(req, dao);
   141         if (selectedProject == null) {
   142             resp.sendError(HttpServletResponse.SC_FORBIDDEN);
   143             return ResponseType.NONE;
   144         }
   146         req.setAttribute("versions", dao.getVersionDao().list(selectedProject));
   147         setDynamicFragment(req, "versions");
   149         return ResponseType.HTML;
   150     }
   152     @RequestMapping(requestPath = "versions/edit", method = HttpMethod.GET)
   153     public ResponseType editVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
   154         final var selectedProject = getSelectedProject(req, dao);
   155         if (selectedProject == null) {
   156             resp.sendError(HttpServletResponse.SC_FORBIDDEN);
   157             return ResponseType.NONE;
   158         }
   160         req.setAttribute("version", findByParameter(req, Integer.class, "id",
   161                 dao.getVersionDao()::find).orElse(new Version(-1, selectedProject)));
   162         req.setAttribute("versionStatusEnum", VersionStatus.values());
   164         setDynamicFragment(req, "version-form");
   166         return ResponseType.HTML;
   167     }
   169     @RequestMapping(requestPath = "versions/commit", method = HttpMethod.POST)
   170     public ResponseType commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
   171         final var selectedProject = getSelectedProject(req, dao);
   172         if (selectedProject == null) {
   173             resp.sendError(HttpServletResponse.SC_FORBIDDEN);
   174             return ResponseType.NONE;
   175         }
   177         Version version = new Version(-1, selectedProject);
   178         try {
   179             version = new Version(getParameter(req, Integer.class, "id").orElseThrow(), selectedProject);
   180             version.setName(getParameter(req, String.class, "name").orElseThrow());
   181             getParameter(req, Integer.class, "ordinal").ifPresent(version::setOrdinal);
   182             version.setStatus(VersionStatus.valueOf(getParameter(req, String.class, "status").orElseThrow()));
   183             dao.getVersionDao().saveOrUpdate(version);
   185             setRedirectLocation(req, "./projects/versions/");
   186             setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL);
   187             LOG.debug("Successfully updated version {} for project {}", version.getName(), selectedProject.getName());
   188         } catch (NoSuchElementException | NumberFormatException | SQLException ex) {
   189             // TODO: set request attribute with error text
   190             req.setAttribute("version", version);
   191             req.setAttribute("versionStatusEnum", VersionStatus.values());
   192             setDynamicFragment(req, "version-form");
   193             LOG.warn("Form validation failure: {}", ex.getMessage());
   194             LOG.debug("Details:", ex);
   195         }
   197         return ResponseType.HTML;
   198     }
   201     @RequestMapping(requestPath = "issues", method = HttpMethod.GET, menuKey = "menu.issues")
   202     public ResponseType issues(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
   203         final var selectedProject = getSelectedProject(req, dao);
   204         if (selectedProject == null) {
   205             resp.sendError(HttpServletResponse.SC_FORBIDDEN);
   206             return ResponseType.NONE;
   207         }
   209         req.setAttribute("issues", dao.getVersionDao().list(selectedProject));
   210         setDynamicFragment(req, "issues");
   212         return ResponseType.HTML;
   213     }
   215     @RequestMapping(requestPath = "issues/edit", method = HttpMethod.GET)
   216     public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
   217         final var selectedProject = getSelectedProject(req, dao);
   218         if (selectedProject == null) {
   219             resp.sendError(HttpServletResponse.SC_FORBIDDEN);
   220             return ResponseType.NONE;
   221         }
   223         req.setAttribute("issue", findByParameter(req, Integer.class, "id",
   224                 dao.getIssueDao()::find).orElse(new Issue(-1, selectedProject)));
   225         req.setAttribute("issueStatusEnum", IssueStatus.values());
   226         req.setAttribute("issueCategoryEnum", IssueCategory.values());
   228         setDynamicFragment(req, "issue-form");
   230         return ResponseType.HTML;
   231     }
   233     @RequestMapping(requestPath = "issues/commit", method = HttpMethod.POST)
   234     public ResponseType commitIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
   235         final var selectedProject = getSelectedProject(req, dao);
   236         if (selectedProject == null) {
   237             resp.sendError(HttpServletResponse.SC_FORBIDDEN);
   238             return ResponseType.NONE;
   239         }
   241         Issue issue = new Issue(-1, selectedProject);
   242         try {
   243             issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow(), selectedProject);
   245             // TODO: implement
   247             dao.getIssueDao().saveOrUpdate(issue);
   249             setRedirectLocation(req, "./projects/issues/");
   250             setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL);
   251             LOG.debug("Successfully updated issue {} for project {}", issue.getId(), selectedProject.getName());
   252         } catch (NoSuchElementException | NumberFormatException | SQLException ex) {
   253             // TODO: set request attribute with error text
   254             req.setAttribute("issue", issue);
   255             req.setAttribute("issueStatusEnum", IssueStatus.values());
   256             req.setAttribute("issueCategoryEnum", IssueCategory.values());
   257             setDynamicFragment(req, "issue-form");
   258             LOG.warn("Form validation failure: {}", ex.getMessage());
   259             LOG.debug("Details:", ex);
   260         }
   262         return ResponseType.HTML;
   263     }
   264 }

mercurial