1.1 --- a/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Sat Oct 31 10:54:20 2020 +0100 1.2 +++ b/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Thu Nov 05 13:37:48 2020 +0100 1.3 @@ -38,6 +38,7 @@ 1.4 import org.slf4j.Logger; 1.5 import org.slf4j.LoggerFactory; 1.6 1.7 +import javax.servlet.ServletException; 1.8 import javax.servlet.annotation.WebServlet; 1.9 import javax.servlet.http.HttpServletRequest; 1.10 import javax.servlet.http.HttpServletResponse; 1.11 @@ -115,16 +116,16 @@ 1.12 } 1.13 } 1.14 1.15 - private ResponseType forwardView(HttpServletRequest req, ProjectView viewModel, String name) { 1.16 + private void forwardView(HttpServletRequest req, HttpServletResponse resp, ProjectView viewModel, String name) throws ServletException, IOException { 1.17 setViewModel(req, viewModel); 1.18 setContentPage(req, name); 1.19 setStylesheet(req, "projects"); 1.20 setNavigationMenu(req, "project-navmenu"); 1.21 - return ResponseType.HTML; 1.22 + renderSite(req, resp); 1.23 } 1.24 1.25 @RequestMapping(method = HttpMethod.GET) 1.26 - public ResponseType index(HttpServletRequest req, DataAccessObjects dao) throws SQLException { 1.27 + public void index(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException, ServletException, IOException { 1.28 final var viewModel = new ProjectView(); 1.29 populate(viewModel, null, dao); 1.30 1.31 @@ -136,7 +137,7 @@ 1.32 info.setIssueSummary(projectDao.getIssueSummary(info.getProject())); 1.33 } 1.34 1.35 - return forwardView(req, viewModel, "projects"); 1.36 + forwardView(req, resp, viewModel, "projects"); 1.37 } 1.38 1.39 private void configureProjectEditor(ProjectEditView viewModel, Project project, DataAccessObjects dao) throws SQLException { 1.40 @@ -145,29 +146,29 @@ 1.41 } 1.42 1.43 @RequestMapping(requestPath = "$project/edit", method = HttpMethod.GET) 1.44 - public ResponseType edit(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DataAccessObjects dao) throws IOException, SQLException { 1.45 + public void edit(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DataAccessObjects dao) throws IOException, SQLException, ServletException { 1.46 final var viewModel = new ProjectEditView(); 1.47 populate(viewModel, pathParams, dao); 1.48 1.49 if (!viewModel.isProjectInfoPresent()) { 1.50 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.51 - return ResponseType.NONE; 1.52 + return; 1.53 } 1.54 1.55 configureProjectEditor(viewModel, viewModel.getProjectInfo().getProject(), dao); 1.56 - return forwardView(req, viewModel, "project-form"); 1.57 + forwardView(req, resp, viewModel, "project-form"); 1.58 } 1.59 1.60 @RequestMapping(requestPath = "create", method = HttpMethod.GET) 1.61 - public ResponseType create(HttpServletRequest req, DataAccessObjects dao) throws SQLException { 1.62 + public void create(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException, ServletException, IOException { 1.63 final var viewModel = new ProjectEditView(); 1.64 populate(viewModel, null, dao); 1.65 configureProjectEditor(viewModel, new Project(-1), dao); 1.66 - return forwardView(req, viewModel, "project-form"); 1.67 + forwardView(req, resp, viewModel, "project-form"); 1.68 } 1.69 1.70 @RequestMapping(requestPath = "commit", method = HttpMethod.POST) 1.71 - public ResponseType commit(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { 1.72 + public void commit(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, ServletException { 1.73 1.74 try { 1.75 final var project = new Project(getParameter(req, Integer.class, "pid").orElseThrow()); 1.76 @@ -188,22 +189,21 @@ 1.77 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); 1.78 LOG.debug("Successfully updated project {}", project.getName()); 1.79 1.80 - return ResponseType.HTML; 1.81 + renderSite(req, resp); 1.82 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { 1.83 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); 1.84 // TODO: implement - fix issue #21 1.85 - return ResponseType.NONE; 1.86 } 1.87 } 1.88 1.89 @RequestMapping(requestPath = "$project/$component/$version/issues/", method = HttpMethod.GET) 1.90 - public ResponseType issues(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DataAccessObjects dao) throws SQLException, IOException { 1.91 + public void issues(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DataAccessObjects dao) throws SQLException, IOException, ServletException { 1.92 final var viewModel = new ProjectDetailsView(); 1.93 populate(viewModel, pathParams, dao); 1.94 1.95 if (!viewModel.isEveryFilterValid()) { 1.96 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.97 - return ResponseType.NONE; 1.98 + return; 1.99 } 1.100 1.101 final var project = viewModel.getProjectInfo().getProject(); 1.102 @@ -251,18 +251,18 @@ 1.103 if (version.getId() > 0) 1.104 viewModel.getProjectDetails().updateVersionInfo(version); 1.105 1.106 - return forwardView(req, viewModel, "project-details"); 1.107 + forwardView(req, resp, viewModel, "project-details"); 1.108 } 1.109 1.110 @RequestMapping(requestPath = "$project/versions/", method = HttpMethod.GET) 1.111 - public ResponseType versions(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { 1.112 + public void versions(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { 1.113 final var viewModel = new VersionsView(); 1.114 populate(viewModel, pathParameters, dao); 1.115 1.116 final var projectInfo = viewModel.getProjectInfo(); 1.117 if (projectInfo == null) { 1.118 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.119 - return ResponseType.NONE; 1.120 + return; 1.121 } 1.122 1.123 final var issueDao = dao.getIssueDao(); 1.124 @@ -270,48 +270,48 @@ 1.125 for (var issue : issues) issueDao.joinVersionInformation(issue); 1.126 viewModel.update(projectInfo.getVersions(), issues); 1.127 1.128 - return forwardView(req, viewModel, "versions"); 1.129 + forwardView(req, resp, viewModel, "versions"); 1.130 } 1.131 1.132 @RequestMapping(requestPath = "$project/versions/$version/edit", method = HttpMethod.GET) 1.133 - public ResponseType editVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { 1.134 + public void editVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { 1.135 final var viewModel = new VersionEditView(); 1.136 populate(viewModel, pathParameters, dao); 1.137 1.138 if (viewModel.getProjectInfo() == null || viewModel.getVersionFilter() == null) { 1.139 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.140 - return ResponseType.NONE; 1.141 + return; 1.142 } 1.143 1.144 viewModel.setVersion(viewModel.getVersionFilter()); 1.145 1.146 - return forwardView(req, viewModel, "version-form"); 1.147 + forwardView(req, resp, viewModel, "version-form"); 1.148 } 1.149 1.150 @RequestMapping(requestPath = "$project/create-version", method = HttpMethod.GET) 1.151 - public ResponseType createVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { 1.152 + public void createVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { 1.153 final var viewModel = new VersionEditView(); 1.154 populate(viewModel, pathParameters, dao); 1.155 1.156 if (viewModel.getProjectInfo() == null) { 1.157 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.158 - return ResponseType.NONE; 1.159 + return; 1.160 } 1.161 1.162 viewModel.setVersion(new Version(-1)); 1.163 1.164 - return forwardView(req, viewModel, "version-form"); 1.165 + forwardView(req, resp, viewModel, "version-form"); 1.166 } 1.167 1.168 @RequestMapping(requestPath = "commit-version", method = HttpMethod.POST) 1.169 - public ResponseType commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { 1.170 + public void commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, ServletException { 1.171 1.172 try { 1.173 final var project = dao.getProjectDao().find(getParameter(req, Integer.class, "pid").orElseThrow()); 1.174 if (project == null) { 1.175 // TODO: improve error handling, because not found is not correct for this POST request 1.176 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.177 - return ResponseType.NONE; 1.178 + return; 1.179 } 1.180 final var version = new Version(getParameter(req, Integer.class, "id").orElseThrow()); 1.181 version.setName(getParameter(req, String.class, "name").orElseThrow()); 1.182 @@ -325,74 +325,73 @@ 1.183 1.184 setRedirectLocation(req, "./projects/" + project.getNode() + "/versions/"); 1.185 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); 1.186 + 1.187 + renderSite(req, resp); 1.188 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { 1.189 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); 1.190 // TODO: implement - fix issue #21 1.191 - return ResponseType.NONE; 1.192 } 1.193 - 1.194 - return ResponseType.HTML; 1.195 } 1.196 1.197 @RequestMapping(requestPath = "$project/components/", method = HttpMethod.GET) 1.198 - public ResponseType components(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { 1.199 + public void components(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { 1.200 final var viewModel = new ComponentsView(); 1.201 populate(viewModel, pathParameters, dao); 1.202 1.203 final var projectInfo = viewModel.getProjectInfo(); 1.204 if (projectInfo == null) { 1.205 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.206 - return ResponseType.NONE; 1.207 + return; 1.208 } 1.209 1.210 final var issueDao = dao.getIssueDao(); 1.211 final var issues = issueDao.list(projectInfo.getProject()); 1.212 viewModel.update(projectInfo.getComponents(), issues); 1.213 1.214 - return forwardView(req, viewModel, "components"); 1.215 + forwardView(req, resp, viewModel, "components"); 1.216 } 1.217 1.218 @RequestMapping(requestPath = "$project/components/$component/edit", method = HttpMethod.GET) 1.219 - public ResponseType editComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { 1.220 + public void editComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { 1.221 final var viewModel = new ComponentEditView(); 1.222 populate(viewModel, pathParameters, dao); 1.223 1.224 if (viewModel.getProjectInfo() == null || viewModel.getComponentFilter() == null) { 1.225 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.226 - return ResponseType.NONE; 1.227 + return; 1.228 } 1.229 1.230 viewModel.setComponent(viewModel.getComponentFilter()); 1.231 viewModel.setUsers(dao.getUserDao().list()); 1.232 1.233 - return forwardView(req, viewModel, "component-form"); 1.234 + forwardView(req, resp, viewModel, "component-form"); 1.235 } 1.236 1.237 @RequestMapping(requestPath = "$project/create-component", method = HttpMethod.GET) 1.238 - public ResponseType createComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { 1.239 + public void createComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { 1.240 final var viewModel = new ComponentEditView(); 1.241 populate(viewModel, pathParameters, dao); 1.242 1.243 if (viewModel.getProjectInfo() == null) { 1.244 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.245 - return ResponseType.NONE; 1.246 + return; 1.247 } 1.248 1.249 viewModel.setComponent(new Component(-1)); 1.250 viewModel.setUsers(dao.getUserDao().list()); 1.251 1.252 - return forwardView(req, viewModel, "component-form"); 1.253 + forwardView(req, resp, viewModel, "component-form"); 1.254 } 1.255 1.256 @RequestMapping(requestPath = "commit-component", method = HttpMethod.POST) 1.257 - public ResponseType commitComponent(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { 1.258 + public void commitComponent(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, ServletException { 1.259 1.260 try { 1.261 final var project = dao.getProjectDao().find(getParameter(req, Integer.class, "pid").orElseThrow()); 1.262 if (project == null) { 1.263 // TODO: improve error handling, because not found is not correct for this POST request 1.264 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.265 - return ResponseType.NONE; 1.266 + return; 1.267 } 1.268 final var component = new Component(getParameter(req, Integer.class, "id").orElseThrow()); 1.269 component.setName(getParameter(req, String.class, "name").orElseThrow()); 1.270 @@ -411,13 +410,12 @@ 1.271 1.272 setRedirectLocation(req, "./projects/" + project.getNode() + "/components/"); 1.273 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); 1.274 + 1.275 + renderSite(req, resp); 1.276 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { 1.277 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); 1.278 // TODO: implement - fix issue #21 1.279 - return ResponseType.NONE; 1.280 } 1.281 - 1.282 - return ResponseType.HTML; 1.283 } 1.284 1.285 private void configureIssueEditor(IssueEditView viewModel, Issue issue, DataAccessObjects dao) throws SQLException { 1.286 @@ -430,75 +428,75 @@ 1.287 } 1.288 1.289 @RequestMapping(requestPath = "$project/issues/$issue/view", method = HttpMethod.GET) 1.290 - public ResponseType viewIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { 1.291 + public void viewIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { 1.292 final var viewModel = new IssueDetailView(); 1.293 populate(viewModel, pathParameters, dao); 1.294 1.295 final var projectInfo = viewModel.getProjectInfo(); 1.296 if (projectInfo == null) { 1.297 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.298 - return ResponseType.NONE; 1.299 + return; 1.300 } 1.301 1.302 final var issueDao = dao.getIssueDao(); 1.303 final var issue = issueDao.find(Functions.parseIntOrZero(pathParameters.get("issue"))); 1.304 if (issue == null) { 1.305 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.306 - return ResponseType.NONE; 1.307 + return; 1.308 } 1.309 1.310 issueDao.joinVersionInformation(issue); 1.311 viewModel.setIssue(issue); 1.312 viewModel.setComments(issueDao.listComments(issue)); 1.313 1.314 - return forwardView(req, viewModel, "issue-view"); 1.315 + forwardView(req, resp, viewModel, "issue-view"); 1.316 } 1.317 1.318 // TODO: why should the issue editor be child of $project? 1.319 @RequestMapping(requestPath = "$project/issues/$issue/edit", method = HttpMethod.GET) 1.320 - public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { 1.321 + public void editIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { 1.322 final var viewModel = new IssueEditView(); 1.323 populate(viewModel, pathParameters, dao); 1.324 1.325 final var projectInfo = viewModel.getProjectInfo(); 1.326 if (projectInfo == null) { 1.327 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.328 - return ResponseType.NONE; 1.329 + return; 1.330 } 1.331 1.332 final var issueDao = dao.getIssueDao(); 1.333 final var issue = issueDao.find(Functions.parseIntOrZero(pathParameters.get("issue"))); 1.334 if (issue == null) { 1.335 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.336 - return ResponseType.NONE; 1.337 + return; 1.338 } 1.339 1.340 issueDao.joinVersionInformation(issue); 1.341 configureIssueEditor(viewModel, issue, dao); 1.342 1.343 - return forwardView(req, viewModel, "issue-form"); 1.344 + forwardView(req, resp, viewModel, "issue-form"); 1.345 } 1.346 1.347 @RequestMapping(requestPath = "$project/create-issue", method = HttpMethod.GET) 1.348 - public ResponseType createIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { 1.349 + public void createIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { 1.350 final var viewModel = new IssueEditView(); 1.351 populate(viewModel, pathParameters, dao); 1.352 1.353 final var projectInfo = viewModel.getProjectInfo(); 1.354 if (projectInfo == null) { 1.355 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.356 - return ResponseType.NONE; 1.357 + return; 1.358 } 1.359 1.360 final var issue = new Issue(-1); 1.361 issue.setProject(projectInfo.getProject()); 1.362 configureIssueEditor(viewModel, issue, dao); 1.363 1.364 - return forwardView(req, viewModel, "issue-form"); 1.365 + forwardView(req, resp, viewModel, "issue-form"); 1.366 } 1.367 1.368 @RequestMapping(requestPath = "commit-issue", method = HttpMethod.POST) 1.369 - public ResponseType commitIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { 1.370 + public void commitIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, ServletException { 1.371 try { 1.372 final var issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow()); 1.373 final var componentId = getParameter(req, Integer.class, "component"); 1.374 @@ -512,7 +510,7 @@ 1.375 if (project == null) { 1.376 // TODO: improve error handling, because not found is not correct for this POST request 1.377 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.378 - return ResponseType.NONE; 1.379 + return; 1.380 } 1.381 issue.setProject(project); 1.382 getParameter(req, String.class, "category").map(IssueCategory::valueOf).ifPresent(issue::setCategory); 1.383 @@ -549,25 +547,24 @@ 1.384 setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/view"); 1.385 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); 1.386 1.387 - return ResponseType.HTML; 1.388 + renderSite(req, resp); 1.389 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { 1.390 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); 1.391 // TODO: implement - fix issue #21 1.392 - return ResponseType.NONE; 1.393 } 1.394 } 1.395 1.396 @RequestMapping(requestPath = "commit-issue-comment", method = HttpMethod.POST) 1.397 - public ResponseType commentIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException, IOException { 1.398 + public void commentIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException, IOException, ServletException { 1.399 final var issueIdParam = getParameter(req, Integer.class, "issueid"); 1.400 if (issueIdParam.isEmpty()) { 1.401 resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Detected manipulated form."); 1.402 - return ResponseType.NONE; 1.403 + return; 1.404 } 1.405 final var issue = dao.getIssueDao().find(issueIdParam.get()); 1.406 if (issue == null) { 1.407 resp.sendError(HttpServletResponse.SC_NOT_FOUND); 1.408 - return ResponseType.NONE; 1.409 + return; 1.410 } 1.411 try { 1.412 final var issueComment = new IssueComment(getParameter(req, Integer.class, "commentid").orElse(-1)); 1.413 @@ -588,11 +585,10 @@ 1.414 setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/view"); 1.415 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); 1.416 1.417 - return ResponseType.HTML; 1.418 + renderSite(req, resp); 1.419 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { 1.420 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); 1.421 // TODO: implement - fix issue #21 1.422 - return ResponseType.NONE; 1.423 } 1.424 } 1.425 }