Sun, 17 May 2020 16:23:39 +0200
adds version management
/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2018 Mike Becker. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */ package de.uapcore.lightpit.modules; import de.uapcore.lightpit.*; import de.uapcore.lightpit.dao.DataAccessObjects; import de.uapcore.lightpit.entities.Project; import de.uapcore.lightpit.entities.User; import de.uapcore.lightpit.entities.Version; import de.uapcore.lightpit.entities.VersionStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.sql.SQLException; import java.util.NoSuchElementException; import java.util.Optional; import static de.uapcore.lightpit.Functions.fqn; @LightPITModule( bundleBaseName = "localization.projects", modulePath = "projects", defaultPriority = 20 ) @WebServlet( name = "ProjectsModule", urlPatterns = "/projects/*" ) public final class ProjectsModule extends AbstractLightPITServlet { private static final Logger LOG = LoggerFactory.getLogger(ProjectsModule.class); public static final String SESSION_ATTR_SELECTED_PROJECT = fqn(ProjectsModule.class, "selected-project"); @RequestMapping(method = HttpMethod.GET, menuKey = "menu.index") public ResponseType index(HttpServletRequest req, DataAccessObjects dao) throws SQLException { final var projectList = dao.getProjectDao().list(); req.setAttribute("projects", projectList); setDynamicFragment(req, "projects"); setStylesheet(req, "projects"); final var session = req.getSession(); final var projectSelection = getParameter(req, Integer.class, "select"); if (projectSelection.isPresent()) { final var selectedId = projectSelection.get(); for (var proj : projectList) { if (proj.getId() == selectedId) { session.setAttribute(SESSION_ATTR_SELECTED_PROJECT, proj); break; } } } else { final var selectedProject = session.getAttribute(SESSION_ATTR_SELECTED_PROJECT); if (selectedProject == null) { projectList.stream().findFirst().ifPresent(proj -> session.setAttribute(SESSION_ATTR_SELECTED_PROJECT, proj)); } } return ResponseType.HTML; } @RequestMapping(requestPath = "edit", method = HttpMethod.GET) public ResponseType edit(HttpServletRequest req, DataAccessObjects dao) throws SQLException { final var projectDao = dao.getProjectDao(); Optional<Integer> id = getParameter(req, Integer.class, "id"); if (id.isPresent()) { req.setAttribute("project", Optional.ofNullable(projectDao.find(id.get())).orElse(new Project(-1))); } else { req.setAttribute("project", new Project(-1)); } req.setAttribute("users", dao.getUserDao().list()); setDynamicFragment(req, "project-form"); return ResponseType.HTML; } @RequestMapping(requestPath = "commit", method = HttpMethod.POST) public ResponseType commit(HttpServletRequest req, DataAccessObjects dao) { Project project = new Project(-1); try { project = new Project(getParameter(req, Integer.class, "id").orElseThrow()); project.setName(getParameter(req, String.class, "name").orElseThrow()); getParameter(req, String.class, "description").ifPresent(project::setDescription); getParameter(req, String.class, "repoUrl").ifPresent(project::setRepoUrl); getParameter(req, Integer.class, "owner").map( ownerId -> ownerId >= 0 ? new User(ownerId) : null ).ifPresent(project::setOwner); dao.getProjectDao().saveOrUpdate(project); setRedirectLocation(req, "./projects/"); setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL); LOG.debug("Successfully updated project {}", project.getName()); } catch (NoSuchElementException | NumberFormatException | SQLException ex) { // TODO: set request attribute with error text req.setAttribute("project", project); setDynamicFragment(req, "project-form"); LOG.warn("Form validation failure: {}", ex.getMessage()); LOG.debug("Details:", ex); } return ResponseType.HTML; } @RequestMapping(requestPath = "versions", method = HttpMethod.GET, menuKey = "menu.versions") public ResponseType versions(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException { final var selectedProject = (Project)req.getSession().getAttribute(SESSION_ATTR_SELECTED_PROJECT); if (selectedProject == null) { resp.sendError(HttpServletResponse.SC_FORBIDDEN); return ResponseType.NONE; } req.setAttribute("versions", dao.getVersionDao().list(selectedProject)); setDynamicFragment(req, "versions"); return ResponseType.HTML; } @RequestMapping(requestPath = "versions/edit", method = HttpMethod.GET) public ResponseType editVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException { final var selectedProject = (Project)req.getSession().getAttribute(SESSION_ATTR_SELECTED_PROJECT); if (selectedProject == null) { resp.sendError(HttpServletResponse.SC_FORBIDDEN); return ResponseType.NONE; } Optional<Integer> id = getParameter(req, Integer.class, "id"); if (id.isPresent()) { req.setAttribute("version", Optional.ofNullable(dao.getVersionDao().find(id.get())).orElse(new Version(-1, selectedProject))); } else { req.setAttribute("version", new Version(-1, selectedProject)); } req.setAttribute("versionStatusEnum", VersionStatus.values()); setDynamicFragment(req, "version-form"); return ResponseType.HTML; } @RequestMapping(requestPath = "versions/commit", method = HttpMethod.POST) public ResponseType commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { final var selectedProject = (Project)req.getSession().getAttribute(SESSION_ATTR_SELECTED_PROJECT); if (selectedProject == null) { resp.sendError(HttpServletResponse.SC_FORBIDDEN); return ResponseType.NONE; } Version version = new Version(-1, selectedProject); try { version = new Version(getParameter(req, Integer.class, "id").orElseThrow(), selectedProject); version.setName(getParameter(req, String.class, "name").orElseThrow()); getParameter(req, Integer.class, "ordinal").ifPresent(version::setOrdinal); version.setStatus(VersionStatus.valueOf(getParameter(req, String.class, "status").orElseThrow())); dao.getVersionDao().saveOrUpdate(version); setRedirectLocation(req, "./projects/versions/"); setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL); LOG.debug("Successfully updated version {} for project {}", version.getName(), selectedProject.getName()); } catch (NoSuchElementException | NumberFormatException | SQLException ex) { // TODO: set request attribute with error text req.setAttribute("version", version); req.setAttribute("versionStatusEnum", VersionStatus.values()); setDynamicFragment(req, "version-form"); LOG.warn("Form validation failure: {}", ex.getMessage()); LOG.debug("Details:", ex); } return ResponseType.HTML; } }