diff -r 8d3047f78190 -r c759c60507a2 src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java --- a/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Sun May 17 16:00:13 2020 +0200 +++ b/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Sun May 17 16:23:39 2020 +0200 @@ -33,10 +33,17 @@ 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; @@ -52,9 +59,11 @@ ) 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) + @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); @@ -115,18 +124,80 @@ setRedirectLocation(req, "./projects/"); setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL); - } catch (NullPointerException | NumberFormatException | SQLException ex) { + 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; + } - @RequestMapping(requestPath = "versions", method = HttpMethod.GET, menuKey = "menu.versions") - public ResponseType versions(HttpServletRequest req, DataAccessObjects dao) { + 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 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; }