Mon, 18 May 2020 21:08:14 +0200
adds backend methods for issues (TODO: implement commitIssue())
1.1 --- a/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Mon May 18 21:06:38 2020 +0200 1.2 +++ b/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Mon May 18 21:08:14 2020 +0200 1.3 @@ -31,10 +31,7 @@ 1.4 1.5 import de.uapcore.lightpit.*; 1.6 import de.uapcore.lightpit.dao.DataAccessObjects; 1.7 -import de.uapcore.lightpit.entities.Project; 1.8 -import de.uapcore.lightpit.entities.User; 1.9 -import de.uapcore.lightpit.entities.Version; 1.10 -import de.uapcore.lightpit.entities.VersionStatus; 1.11 +import de.uapcore.lightpit.entities.*; 1.12 import org.slf4j.Logger; 1.13 import org.slf4j.LoggerFactory; 1.14 1.15 @@ -44,7 +41,6 @@ 1.16 import java.io.IOException; 1.17 import java.sql.SQLException; 1.18 import java.util.NoSuchElementException; 1.19 -import java.util.Optional; 1.20 1.21 import static de.uapcore.lightpit.Functions.fqn; 1.22 1.23 @@ -63,6 +59,20 @@ 1.24 1.25 public static final String SESSION_ATTR_SELECTED_PROJECT = fqn(ProjectsModule.class, "selected-project"); 1.26 1.27 + private Project getSelectedProject(HttpServletRequest req, DataAccessObjects dao) throws SQLException { 1.28 + final var projectDao = dao.getProjectDao(); 1.29 + final var session = req.getSession(); 1.30 + final var projectSelection = getParameter(req, Integer.class, "pid"); 1.31 + if (projectSelection.isPresent()) { 1.32 + final var selectedId = projectSelection.get(); 1.33 + final var selectedProject = projectDao.find(selectedId); 1.34 + session.setAttribute(SESSION_ATTR_SELECTED_PROJECT, selectedProject); 1.35 + return selectedProject; 1.36 + } else { 1.37 + return (Project) session.getAttribute(SESSION_ATTR_SELECTED_PROJECT); 1.38 + } 1.39 + } 1.40 + 1.41 @RequestMapping(method = HttpMethod.GET) 1.42 public ResponseType indexRedirect(HttpServletResponse resp) throws IOException { 1.43 resp.sendRedirect("index/"); 1.44 @@ -71,26 +81,14 @@ 1.45 1.46 @RequestMapping(requestPath = "index", method = HttpMethod.GET, menuKey = "menu.index") 1.47 public ResponseType index(HttpServletRequest req, DataAccessObjects dao) throws SQLException { 1.48 + 1.49 final var projectList = dao.getProjectDao().list(); 1.50 req.setAttribute("projects", projectList); 1.51 setDynamicFragment(req, "projects"); 1.52 setStylesheet(req, "projects"); 1.53 1.54 - final var session = req.getSession(); 1.55 - final var projectSelection = getParameter(req, Integer.class, "select"); 1.56 - if (projectSelection.isPresent()) { 1.57 - final var selectedId = projectSelection.get(); 1.58 - for (var proj : projectList) { 1.59 - if (proj.getId() == selectedId) { 1.60 - session.setAttribute(SESSION_ATTR_SELECTED_PROJECT, proj); 1.61 - break; 1.62 - } 1.63 - } 1.64 - } else { 1.65 - final var selectedProject = session.getAttribute(SESSION_ATTR_SELECTED_PROJECT); 1.66 - if (selectedProject == null) { 1.67 - projectList.stream().findFirst().ifPresent(proj -> session.setAttribute(SESSION_ATTR_SELECTED_PROJECT, proj)); 1.68 - } 1.69 + if (getSelectedProject(req, dao) == null) { 1.70 + projectList.stream().findFirst().ifPresent(proj -> req.getSession().setAttribute(SESSION_ATTR_SELECTED_PROJECT, proj)); 1.71 } 1.72 1.73 return ResponseType.HTML; 1.74 @@ -100,14 +98,7 @@ 1.75 public ResponseType edit(HttpServletRequest req, DataAccessObjects dao) throws SQLException { 1.76 final var projectDao = dao.getProjectDao(); 1.77 1.78 - Optional<Integer> id = getParameter(req, Integer.class, "id"); 1.79 - if (id.isPresent()) { 1.80 - req.setAttribute("project", Optional.ofNullable(projectDao.find(id.get())).orElse(new Project(-1))); 1.81 - } else { 1.82 - req.setAttribute("project", new Project(-1)); 1.83 - } 1.84 - req.setAttribute("users", dao.getUserDao().list()); 1.85 - 1.86 + req.setAttribute("project", findByParameter(req, Integer.class, "id", projectDao::find)); 1.87 setDynamicFragment(req, "project-form"); 1.88 1.89 return ResponseType.HTML; 1.90 @@ -144,7 +135,7 @@ 1.91 1.92 @RequestMapping(requestPath = "versions", method = HttpMethod.GET, menuKey = "menu.versions") 1.93 public ResponseType versions(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException { 1.94 - final var selectedProject = (Project)req.getSession().getAttribute(SESSION_ATTR_SELECTED_PROJECT); 1.95 + final var selectedProject = getSelectedProject(req, dao); 1.96 if (selectedProject == null) { 1.97 resp.sendError(HttpServletResponse.SC_FORBIDDEN); 1.98 return ResponseType.NONE; 1.99 @@ -158,18 +149,13 @@ 1.100 1.101 @RequestMapping(requestPath = "versions/edit", method = HttpMethod.GET) 1.102 public ResponseType editVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException { 1.103 - final var selectedProject = (Project)req.getSession().getAttribute(SESSION_ATTR_SELECTED_PROJECT); 1.104 + final var selectedProject = getSelectedProject(req, dao); 1.105 if (selectedProject == null) { 1.106 resp.sendError(HttpServletResponse.SC_FORBIDDEN); 1.107 return ResponseType.NONE; 1.108 } 1.109 1.110 - Optional<Integer> id = getParameter(req, Integer.class, "id"); 1.111 - if (id.isPresent()) { 1.112 - req.setAttribute("version", Optional.ofNullable(dao.getVersionDao().find(id.get())).orElse(new Version(-1, selectedProject))); 1.113 - } else { 1.114 - req.setAttribute("version", new Version(-1, selectedProject)); 1.115 - } 1.116 + req.setAttribute("version", findByParameter(req, Integer.class, "id", dao.getVersionDao()::find)); 1.117 req.setAttribute("versionStatusEnum", VersionStatus.values()); 1.118 1.119 setDynamicFragment(req, "version-form"); 1.120 @@ -178,8 +164,8 @@ 1.121 } 1.122 1.123 @RequestMapping(requestPath = "versions/commit", method = HttpMethod.POST) 1.124 - public ResponseType commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { 1.125 - final var selectedProject = (Project)req.getSession().getAttribute(SESSION_ATTR_SELECTED_PROJECT); 1.126 + public ResponseType commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException { 1.127 + final var selectedProject = getSelectedProject(req, dao); 1.128 if (selectedProject == null) { 1.129 resp.sendError(HttpServletResponse.SC_FORBIDDEN); 1.130 return ResponseType.NONE; 1.131 @@ -207,4 +193,68 @@ 1.132 1.133 return ResponseType.HTML; 1.134 } 1.135 + 1.136 + 1.137 + @RequestMapping(requestPath = "issues", method = HttpMethod.GET, menuKey = "menu.issues") 1.138 + public ResponseType issues(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException { 1.139 + final var selectedProject = getSelectedProject(req, dao); 1.140 + if (selectedProject == null) { 1.141 + resp.sendError(HttpServletResponse.SC_FORBIDDEN); 1.142 + return ResponseType.NONE; 1.143 + } 1.144 + 1.145 + req.setAttribute("issues", dao.getVersionDao().list(selectedProject)); 1.146 + setDynamicFragment(req, "issues"); 1.147 + 1.148 + return ResponseType.HTML; 1.149 + } 1.150 + 1.151 + @RequestMapping(requestPath = "issues/edit", method = HttpMethod.GET) 1.152 + public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException { 1.153 + final var selectedProject = getSelectedProject(req, dao); 1.154 + if (selectedProject == null) { 1.155 + resp.sendError(HttpServletResponse.SC_FORBIDDEN); 1.156 + return ResponseType.NONE; 1.157 + } 1.158 + 1.159 + req.setAttribute("issue", findByParameter(req, Integer.class, "id", dao.getIssueDao()::find)); 1.160 + req.setAttribute("issueStatusEnum", IssueStatus.values()); 1.161 + req.setAttribute("issueCategoryEnum", IssueCategory.values()); 1.162 + 1.163 + setDynamicFragment(req, "issue-form"); 1.164 + 1.165 + return ResponseType.HTML; 1.166 + } 1.167 + 1.168 + @RequestMapping(requestPath = "issues/commit", method = HttpMethod.POST) 1.169 + public ResponseType commitIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException { 1.170 + final var selectedProject = getSelectedProject(req, dao); 1.171 + if (selectedProject == null) { 1.172 + resp.sendError(HttpServletResponse.SC_FORBIDDEN); 1.173 + return ResponseType.NONE; 1.174 + } 1.175 + 1.176 + Issue issue = new Issue(-1, selectedProject); 1.177 + try { 1.178 + issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow(), selectedProject); 1.179 + 1.180 + // TODO: implement 1.181 + 1.182 + dao.getIssueDao().saveOrUpdate(issue); 1.183 + 1.184 + setRedirectLocation(req, "./projects/issues/"); 1.185 + setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL); 1.186 + LOG.debug("Successfully updated issue {} for project {}", issue.getId(), selectedProject.getName()); 1.187 + } catch (NoSuchElementException | NumberFormatException | SQLException ex) { 1.188 + // TODO: set request attribute with error text 1.189 + req.setAttribute("issue", issue); 1.190 + req.setAttribute("issueStatusEnum", IssueStatus.values()); 1.191 + req.setAttribute("issueCategoryEnum", IssueCategory.values()); 1.192 + setDynamicFragment(req, "issue-form"); 1.193 + LOG.warn("Form validation failure: {}", ex.getMessage()); 1.194 + LOG.debug("Details:", ex); 1.195 + } 1.196 + 1.197 + return ResponseType.HTML; 1.198 + } 1.199 }
2.1 --- a/src/main/resources/localization/projects.properties Mon May 18 21:06:38 2020 +0200 2.2 +++ b/src/main/resources/localization/projects.properties Mon May 18 21:08:14 2020 +0200 2.3 @@ -25,6 +25,7 @@ 2.4 2.5 menu.index=Index 2.6 menu.versions=Versions 2.7 +menu.issues=Issues 2.8 2.9 button.create=New Project 2.10 button.version.create=New Version
3.1 --- a/src/main/resources/localization/projects_de.properties Mon May 18 21:06:38 2020 +0200 3.2 +++ b/src/main/resources/localization/projects_de.properties Mon May 18 21:08:14 2020 +0200 3.3 @@ -25,6 +25,7 @@ 3.4 3.5 menu.index=Index 3.6 menu.versions=Versionen 3.7 +menu.issues=Vorg\u00e4nge 3.8 3.9 button.create=Neues Projekt 3.10 button.version.create=Neue Version
4.1 --- a/src/main/webapp/WEB-INF/dynamic_fragments/projects.jsp Mon May 18 21:06:38 2020 +0200 4.2 +++ b/src/main/webapp/WEB-INF/dynamic_fragments/projects.jsp Mon May 18 21:08:14 2020 +0200 4.3 @@ -67,7 +67,7 @@ 4.4 <c:forEach var="project" items="${projects}"> 4.5 <tr class="nowrap" <c:if test="${project eq selectedProject}">data-selected</c:if> > 4.6 <td style="width: 2em;"><a href="./${moduleInfo.modulePath}/edit?id=${project.id}">✎</a></td> 4.7 - <td><a href="./${moduleInfo.modulePath}/index/?select=${project.id}"><c:out value="${project.name}"/></a></td> 4.8 + <td><a href="./${moduleInfo.modulePath}/index/?pid=${project.id}"><c:out value="${project.name}"/></a></td> 4.9 <td><c:out value="${project.description}"/></td> 4.10 <td> 4.11 <c:if test="${not empty project.repoUrl}">