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

Tue, 19 May 2020 19:34:57 +0200

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

removes the sub menu and removes the home module
fixes the queries in the PGIssueDao
adds placeholder for a breadcrumb menu

     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 index(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
    79         final var projectList = dao.getProjectDao().list();
    80         req.setAttribute("projects", projectList);
    81         setDynamicFragment(req, "projects");
    82         setStylesheet(req, "projects");
    84         if (getSelectedProject(req, dao) == null) {
    85             projectList.stream().findFirst().ifPresent(proj -> req.getSession().setAttribute(SESSION_ATTR_SELECTED_PROJECT, proj));
    86         }
    88         return ResponseType.HTML;
    89     }
    91     @RequestMapping(requestPath = "edit", method = HttpMethod.GET)
    92     public ResponseType edit(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
    93         req.setAttribute("project", findByParameter(req, Integer.class, "id",
    94                 dao.getProjectDao()::find).orElse(new Project(-1)));
    95         req.setAttribute("users", dao.getUserDao().list());
    97         setDynamicFragment(req, "project-form");
    99         return ResponseType.HTML;
   100     }
   102     @RequestMapping(requestPath = "commit", method = HttpMethod.POST)
   103     public ResponseType commit(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
   105         Project project = new Project(-1);
   106         try {
   107             project = new Project(getParameter(req, Integer.class, "id").orElseThrow());
   108             project.setName(getParameter(req, String.class, "name").orElseThrow());
   109             getParameter(req, String.class, "description").ifPresent(project::setDescription);
   110             getParameter(req, String.class, "repoUrl").ifPresent(project::setRepoUrl);
   111             getParameter(req, Integer.class, "owner").map(
   112                     ownerId -> ownerId >= 0 ? new User(ownerId) : null
   113             ).ifPresent(project::setOwner);
   115             dao.getProjectDao().saveOrUpdate(project);
   117             setRedirectLocation(req, "./projects/");
   118             setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL);
   119             LOG.debug("Successfully updated project {}", project.getName());
   120         } catch (NoSuchElementException | NumberFormatException | SQLException ex) {
   121             // TODO: set request attribute with error text
   122             req.setAttribute("project", project);
   123             req.setAttribute("users", dao.getUserDao().list());
   124             setDynamicFragment(req, "project-form");
   125             LOG.warn("Form validation failure: {}", ex.getMessage());
   126             LOG.debug("Details:", ex);
   127         }
   129         return ResponseType.HTML;
   130     }
   132     @RequestMapping(requestPath = "view", method = HttpMethod.GET)
   133     public ResponseType view(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
   134         final var selectedProject = getSelectedProject(req, dao);
   135         if (selectedProject == null) {
   136             resp.sendError(HttpServletResponse.SC_FORBIDDEN);
   137             return ResponseType.NONE;
   138         }
   140         req.setAttribute("versions", dao.getVersionDao().list(selectedProject));
   141         req.setAttribute("issues", dao.getIssueDao().list(selectedProject));
   143         setDynamicFragment(req, "project-details");
   145         return ResponseType.HTML;
   146     }
   148     @RequestMapping(requestPath = "versions/edit", method = HttpMethod.GET)
   149     public ResponseType editVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
   150         final var selectedProject = getSelectedProject(req, dao);
   151         if (selectedProject == null) {
   152             resp.sendError(HttpServletResponse.SC_FORBIDDEN);
   153             return ResponseType.NONE;
   154         }
   156         req.setAttribute("version", findByParameter(req, Integer.class, "id",
   157                 dao.getVersionDao()::find).orElse(new Version(-1, selectedProject)));
   158         req.setAttribute("versionStatusEnum", VersionStatus.values());
   160         setDynamicFragment(req, "version-form");
   162         return ResponseType.HTML;
   163     }
   165     @RequestMapping(requestPath = "versions/commit", method = HttpMethod.POST)
   166     public ResponseType commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
   167         final var selectedProject = getSelectedProject(req, dao);
   168         if (selectedProject == null) {
   169             resp.sendError(HttpServletResponse.SC_FORBIDDEN);
   170             return ResponseType.NONE;
   171         }
   173         Version version = new Version(-1, selectedProject);
   174         try {
   175             version = new Version(getParameter(req, Integer.class, "id").orElseThrow(), selectedProject);
   176             version.setName(getParameter(req, String.class, "name").orElseThrow());
   177             getParameter(req, Integer.class, "ordinal").ifPresent(version::setOrdinal);
   178             version.setStatus(VersionStatus.valueOf(getParameter(req, String.class, "status").orElseThrow()));
   179             dao.getVersionDao().saveOrUpdate(version);
   181             setRedirectLocation(req, "./projects/versions/");
   182             setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL);
   183             LOG.debug("Successfully updated version {} for project {}", version.getName(), selectedProject.getName());
   184         } catch (NoSuchElementException | NumberFormatException | SQLException ex) {
   185             // TODO: set request attribute with error text
   186             req.setAttribute("version", version);
   187             req.setAttribute("versionStatusEnum", VersionStatus.values());
   188             setDynamicFragment(req, "version-form");
   189             LOG.warn("Form validation failure: {}", ex.getMessage());
   190             LOG.debug("Details:", ex);
   191         }
   193         return ResponseType.HTML;
   194     }
   196     @RequestMapping(requestPath = "issues/edit", method = HttpMethod.GET)
   197     public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
   198         final var selectedProject = getSelectedProject(req, dao);
   199         if (selectedProject == null) {
   200             resp.sendError(HttpServletResponse.SC_FORBIDDEN);
   201             return ResponseType.NONE;
   202         }
   204         req.setAttribute("issue", findByParameter(req, Integer.class, "id",
   205                 dao.getIssueDao()::find).orElse(new Issue(-1, selectedProject)));
   206         req.setAttribute("issueStatusEnum", IssueStatus.values());
   207         req.setAttribute("issueCategoryEnum", IssueCategory.values());
   209         setDynamicFragment(req, "issue-form");
   211         return ResponseType.HTML;
   212     }
   214     @RequestMapping(requestPath = "issues/commit", method = HttpMethod.POST)
   215     public ResponseType commitIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
   216         final var selectedProject = getSelectedProject(req, dao);
   217         if (selectedProject == null) {
   218             resp.sendError(HttpServletResponse.SC_FORBIDDEN);
   219             return ResponseType.NONE;
   220         }
   222         Issue issue = new Issue(-1, selectedProject);
   223         try {
   224             issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow(), selectedProject);
   226             // TODO: implement
   228             dao.getIssueDao().saveOrUpdate(issue);
   230             setRedirectLocation(req, "./projects/issues/");
   231             setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL);
   232             LOG.debug("Successfully updated issue {} for project {}", issue.getId(), selectedProject.getName());
   233         } catch (NoSuchElementException | NumberFormatException | SQLException ex) {
   234             // TODO: set request attribute with error text
   235             req.setAttribute("issue", issue);
   236             req.setAttribute("issueStatusEnum", IssueStatus.values());
   237             req.setAttribute("issueCategoryEnum", IssueCategory.values());
   238             setDynamicFragment(req, "issue-form");
   239             LOG.warn("Form validation failure: {}", ex.getMessage());
   240             LOG.debug("Details:", ex);
   241         }
   243         return ResponseType.HTML;
   244     }
   245 }

mercurial