1.1 --- a/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Sun May 17 16:00:13 2020 +0200 1.2 +++ b/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Sun May 17 16:23:39 2020 +0200 1.3 @@ -33,10 +33,17 @@ 1.4 import de.uapcore.lightpit.dao.DataAccessObjects; 1.5 import de.uapcore.lightpit.entities.Project; 1.6 import de.uapcore.lightpit.entities.User; 1.7 +import de.uapcore.lightpit.entities.Version; 1.8 +import de.uapcore.lightpit.entities.VersionStatus; 1.9 +import org.slf4j.Logger; 1.10 +import org.slf4j.LoggerFactory; 1.11 1.12 import javax.servlet.annotation.WebServlet; 1.13 import javax.servlet.http.HttpServletRequest; 1.14 +import javax.servlet.http.HttpServletResponse; 1.15 +import java.io.IOException; 1.16 import java.sql.SQLException; 1.17 +import java.util.NoSuchElementException; 1.18 import java.util.Optional; 1.19 1.20 import static de.uapcore.lightpit.Functions.fqn; 1.21 @@ -52,9 +59,11 @@ 1.22 ) 1.23 public final class ProjectsModule extends AbstractLightPITServlet { 1.24 1.25 + private static final Logger LOG = LoggerFactory.getLogger(ProjectsModule.class); 1.26 + 1.27 public static final String SESSION_ATTR_SELECTED_PROJECT = fqn(ProjectsModule.class, "selected-project"); 1.28 1.29 - @RequestMapping(method = HttpMethod.GET) 1.30 + @RequestMapping(method = HttpMethod.GET, menuKey = "menu.index") 1.31 public ResponseType index(HttpServletRequest req, DataAccessObjects dao) throws SQLException { 1.32 final var projectList = dao.getProjectDao().list(); 1.33 req.setAttribute("projects", projectList); 1.34 @@ -115,18 +124,80 @@ 1.35 1.36 setRedirectLocation(req, "./projects/"); 1.37 setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL); 1.38 - } catch (NullPointerException | NumberFormatException | SQLException ex) { 1.39 + LOG.debug("Successfully updated project {}", project.getName()); 1.40 + } catch (NoSuchElementException | NumberFormatException | SQLException ex) { 1.41 // TODO: set request attribute with error text 1.42 req.setAttribute("project", project); 1.43 setDynamicFragment(req, "project-form"); 1.44 + LOG.warn("Form validation failure: {}", ex.getMessage()); 1.45 + LOG.debug("Details:", ex); 1.46 } 1.47 1.48 return ResponseType.HTML; 1.49 } 1.50 1.51 + @RequestMapping(requestPath = "versions", method = HttpMethod.GET, menuKey = "menu.versions") 1.52 + public ResponseType versions(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException { 1.53 + final var selectedProject = (Project)req.getSession().getAttribute(SESSION_ATTR_SELECTED_PROJECT); 1.54 + if (selectedProject == null) { 1.55 + resp.sendError(HttpServletResponse.SC_FORBIDDEN); 1.56 + return ResponseType.NONE; 1.57 + } 1.58 1.59 - @RequestMapping(requestPath = "versions", method = HttpMethod.GET, menuKey = "menu.versions") 1.60 - public ResponseType versions(HttpServletRequest req, DataAccessObjects dao) { 1.61 + req.setAttribute("versions", dao.getVersionDao().list(selectedProject)); 1.62 + setDynamicFragment(req, "versions"); 1.63 + 1.64 + return ResponseType.HTML; 1.65 + } 1.66 + 1.67 + @RequestMapping(requestPath = "versions/edit", method = HttpMethod.GET) 1.68 + public ResponseType editVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException { 1.69 + final var selectedProject = (Project)req.getSession().getAttribute(SESSION_ATTR_SELECTED_PROJECT); 1.70 + if (selectedProject == null) { 1.71 + resp.sendError(HttpServletResponse.SC_FORBIDDEN); 1.72 + return ResponseType.NONE; 1.73 + } 1.74 + 1.75 + Optional<Integer> id = getParameter(req, Integer.class, "id"); 1.76 + if (id.isPresent()) { 1.77 + req.setAttribute("version", Optional.ofNullable(dao.getVersionDao().find(id.get())).orElse(new Version(-1, selectedProject))); 1.78 + } else { 1.79 + req.setAttribute("version", new Version(-1, selectedProject)); 1.80 + } 1.81 + req.setAttribute("versionStatusEnum", VersionStatus.values()); 1.82 + 1.83 + setDynamicFragment(req, "version-form"); 1.84 + 1.85 + return ResponseType.HTML; 1.86 + } 1.87 + 1.88 + @RequestMapping(requestPath = "versions/commit", method = HttpMethod.POST) 1.89 + public ResponseType commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { 1.90 + final var selectedProject = (Project)req.getSession().getAttribute(SESSION_ATTR_SELECTED_PROJECT); 1.91 + if (selectedProject == null) { 1.92 + resp.sendError(HttpServletResponse.SC_FORBIDDEN); 1.93 + return ResponseType.NONE; 1.94 + } 1.95 + 1.96 + Version version = new Version(-1, selectedProject); 1.97 + try { 1.98 + version = new Version(getParameter(req, Integer.class, "id").orElseThrow(), selectedProject); 1.99 + version.setName(getParameter(req, String.class, "name").orElseThrow()); 1.100 + getParameter(req, Integer.class, "ordinal").ifPresent(version::setOrdinal); 1.101 + version.setStatus(VersionStatus.valueOf(getParameter(req, String.class, "status").orElseThrow())); 1.102 + dao.getVersionDao().saveOrUpdate(version); 1.103 + 1.104 + setRedirectLocation(req, "./projects/versions/"); 1.105 + setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL); 1.106 + LOG.debug("Successfully updated version {} for project {}", version.getName(), selectedProject.getName()); 1.107 + } catch (NoSuchElementException | NumberFormatException | SQLException ex) { 1.108 + // TODO: set request attribute with error text 1.109 + req.setAttribute("version", version); 1.110 + req.setAttribute("versionStatusEnum", VersionStatus.values()); 1.111 + setDynamicFragment(req, "version-form"); 1.112 + LOG.warn("Form validation failure: {}", ex.getMessage()); 1.113 + LOG.debug("Details:", ex); 1.114 + } 1.115 1.116 return ResponseType.HTML; 1.117 }