diff -r c5d6820d884e -r 1e6f16fad3a5 src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java --- a/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Sat Oct 31 10:54:20 2020 +0100 +++ b/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Thu Nov 05 13:37:48 2020 +0100 @@ -38,6 +38,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -115,16 +116,16 @@ } } - private ResponseType forwardView(HttpServletRequest req, ProjectView viewModel, String name) { + private void forwardView(HttpServletRequest req, HttpServletResponse resp, ProjectView viewModel, String name) throws ServletException, IOException { setViewModel(req, viewModel); setContentPage(req, name); setStylesheet(req, "projects"); setNavigationMenu(req, "project-navmenu"); - return ResponseType.HTML; + renderSite(req, resp); } @RequestMapping(method = HttpMethod.GET) - public ResponseType index(HttpServletRequest req, DataAccessObjects dao) throws SQLException { + public void index(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException, ServletException, IOException { final var viewModel = new ProjectView(); populate(viewModel, null, dao); @@ -136,7 +137,7 @@ info.setIssueSummary(projectDao.getIssueSummary(info.getProject())); } - return forwardView(req, viewModel, "projects"); + forwardView(req, resp, viewModel, "projects"); } private void configureProjectEditor(ProjectEditView viewModel, Project project, DataAccessObjects dao) throws SQLException { @@ -145,29 +146,29 @@ } @RequestMapping(requestPath = "$project/edit", method = HttpMethod.GET) - public ResponseType edit(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DataAccessObjects dao) throws IOException, SQLException { + public void edit(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DataAccessObjects dao) throws IOException, SQLException, ServletException { final var viewModel = new ProjectEditView(); populate(viewModel, pathParams, dao); if (!viewModel.isProjectInfoPresent()) { resp.sendError(HttpServletResponse.SC_NOT_FOUND); - return ResponseType.NONE; + return; } configureProjectEditor(viewModel, viewModel.getProjectInfo().getProject(), dao); - return forwardView(req, viewModel, "project-form"); + forwardView(req, resp, viewModel, "project-form"); } @RequestMapping(requestPath = "create", method = HttpMethod.GET) - public ResponseType create(HttpServletRequest req, DataAccessObjects dao) throws SQLException { + public void create(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException, ServletException, IOException { final var viewModel = new ProjectEditView(); populate(viewModel, null, dao); configureProjectEditor(viewModel, new Project(-1), dao); - return forwardView(req, viewModel, "project-form"); + forwardView(req, resp, viewModel, "project-form"); } @RequestMapping(requestPath = "commit", method = HttpMethod.POST) - public ResponseType commit(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { + public void commit(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, ServletException { try { final var project = new Project(getParameter(req, Integer.class, "pid").orElseThrow()); @@ -188,22 +189,21 @@ setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); LOG.debug("Successfully updated project {}", project.getName()); - return ResponseType.HTML; + renderSite(req, resp); } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); // TODO: implement - fix issue #21 - return ResponseType.NONE; } } @RequestMapping(requestPath = "$project/$component/$version/issues/", method = HttpMethod.GET) - public ResponseType issues(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DataAccessObjects dao) throws SQLException, IOException { + public void issues(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DataAccessObjects dao) throws SQLException, IOException, ServletException { final var viewModel = new ProjectDetailsView(); populate(viewModel, pathParams, dao); if (!viewModel.isEveryFilterValid()) { resp.sendError(HttpServletResponse.SC_NOT_FOUND); - return ResponseType.NONE; + return; } final var project = viewModel.getProjectInfo().getProject(); @@ -251,18 +251,18 @@ if (version.getId() > 0) viewModel.getProjectDetails().updateVersionInfo(version); - return forwardView(req, viewModel, "project-details"); + forwardView(req, resp, viewModel, "project-details"); } @RequestMapping(requestPath = "$project/versions/", method = HttpMethod.GET) - public ResponseType versions(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { + public void versions(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { final var viewModel = new VersionsView(); populate(viewModel, pathParameters, dao); final var projectInfo = viewModel.getProjectInfo(); if (projectInfo == null) { resp.sendError(HttpServletResponse.SC_NOT_FOUND); - return ResponseType.NONE; + return; } final var issueDao = dao.getIssueDao(); @@ -270,48 +270,48 @@ for (var issue : issues) issueDao.joinVersionInformation(issue); viewModel.update(projectInfo.getVersions(), issues); - return forwardView(req, viewModel, "versions"); + forwardView(req, resp, viewModel, "versions"); } @RequestMapping(requestPath = "$project/versions/$version/edit", method = HttpMethod.GET) - public ResponseType editVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { + public void editVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { final var viewModel = new VersionEditView(); populate(viewModel, pathParameters, dao); if (viewModel.getProjectInfo() == null || viewModel.getVersionFilter() == null) { resp.sendError(HttpServletResponse.SC_NOT_FOUND); - return ResponseType.NONE; + return; } viewModel.setVersion(viewModel.getVersionFilter()); - return forwardView(req, viewModel, "version-form"); + forwardView(req, resp, viewModel, "version-form"); } @RequestMapping(requestPath = "$project/create-version", method = HttpMethod.GET) - public ResponseType createVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { + public void createVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { final var viewModel = new VersionEditView(); populate(viewModel, pathParameters, dao); if (viewModel.getProjectInfo() == null) { resp.sendError(HttpServletResponse.SC_NOT_FOUND); - return ResponseType.NONE; + return; } viewModel.setVersion(new Version(-1)); - return forwardView(req, viewModel, "version-form"); + forwardView(req, resp, viewModel, "version-form"); } @RequestMapping(requestPath = "commit-version", method = HttpMethod.POST) - public ResponseType commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { + public void commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, ServletException { try { final var project = dao.getProjectDao().find(getParameter(req, Integer.class, "pid").orElseThrow()); if (project == null) { // TODO: improve error handling, because not found is not correct for this POST request resp.sendError(HttpServletResponse.SC_NOT_FOUND); - return ResponseType.NONE; + return; } final var version = new Version(getParameter(req, Integer.class, "id").orElseThrow()); version.setName(getParameter(req, String.class, "name").orElseThrow()); @@ -325,74 +325,73 @@ setRedirectLocation(req, "./projects/" + project.getNode() + "/versions/"); setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); + + renderSite(req, resp); } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); // TODO: implement - fix issue #21 - return ResponseType.NONE; } - - return ResponseType.HTML; } @RequestMapping(requestPath = "$project/components/", method = HttpMethod.GET) - public ResponseType components(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { + public void components(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { final var viewModel = new ComponentsView(); populate(viewModel, pathParameters, dao); final var projectInfo = viewModel.getProjectInfo(); if (projectInfo == null) { resp.sendError(HttpServletResponse.SC_NOT_FOUND); - return ResponseType.NONE; + return; } final var issueDao = dao.getIssueDao(); final var issues = issueDao.list(projectInfo.getProject()); viewModel.update(projectInfo.getComponents(), issues); - return forwardView(req, viewModel, "components"); + forwardView(req, resp, viewModel, "components"); } @RequestMapping(requestPath = "$project/components/$component/edit", method = HttpMethod.GET) - public ResponseType editComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { + public void editComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { final var viewModel = new ComponentEditView(); populate(viewModel, pathParameters, dao); if (viewModel.getProjectInfo() == null || viewModel.getComponentFilter() == null) { resp.sendError(HttpServletResponse.SC_NOT_FOUND); - return ResponseType.NONE; + return; } viewModel.setComponent(viewModel.getComponentFilter()); viewModel.setUsers(dao.getUserDao().list()); - return forwardView(req, viewModel, "component-form"); + forwardView(req, resp, viewModel, "component-form"); } @RequestMapping(requestPath = "$project/create-component", method = HttpMethod.GET) - public ResponseType createComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { + public void createComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { final var viewModel = new ComponentEditView(); populate(viewModel, pathParameters, dao); if (viewModel.getProjectInfo() == null) { resp.sendError(HttpServletResponse.SC_NOT_FOUND); - return ResponseType.NONE; + return; } viewModel.setComponent(new Component(-1)); viewModel.setUsers(dao.getUserDao().list()); - return forwardView(req, viewModel, "component-form"); + forwardView(req, resp, viewModel, "component-form"); } @RequestMapping(requestPath = "commit-component", method = HttpMethod.POST) - public ResponseType commitComponent(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { + public void commitComponent(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, ServletException { try { final var project = dao.getProjectDao().find(getParameter(req, Integer.class, "pid").orElseThrow()); if (project == null) { // TODO: improve error handling, because not found is not correct for this POST request resp.sendError(HttpServletResponse.SC_NOT_FOUND); - return ResponseType.NONE; + return; } final var component = new Component(getParameter(req, Integer.class, "id").orElseThrow()); component.setName(getParameter(req, String.class, "name").orElseThrow()); @@ -411,13 +410,12 @@ setRedirectLocation(req, "./projects/" + project.getNode() + "/components/"); setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); + + renderSite(req, resp); } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); // TODO: implement - fix issue #21 - return ResponseType.NONE; } - - return ResponseType.HTML; } private void configureIssueEditor(IssueEditView viewModel, Issue issue, DataAccessObjects dao) throws SQLException { @@ -430,75 +428,75 @@ } @RequestMapping(requestPath = "$project/issues/$issue/view", method = HttpMethod.GET) - public ResponseType viewIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { + public void viewIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { final var viewModel = new IssueDetailView(); populate(viewModel, pathParameters, dao); final var projectInfo = viewModel.getProjectInfo(); if (projectInfo == null) { resp.sendError(HttpServletResponse.SC_NOT_FOUND); - return ResponseType.NONE; + return; } final var issueDao = dao.getIssueDao(); final var issue = issueDao.find(Functions.parseIntOrZero(pathParameters.get("issue"))); if (issue == null) { resp.sendError(HttpServletResponse.SC_NOT_FOUND); - return ResponseType.NONE; + return; } issueDao.joinVersionInformation(issue); viewModel.setIssue(issue); viewModel.setComments(issueDao.listComments(issue)); - return forwardView(req, viewModel, "issue-view"); + forwardView(req, resp, viewModel, "issue-view"); } // TODO: why should the issue editor be child of $project? @RequestMapping(requestPath = "$project/issues/$issue/edit", method = HttpMethod.GET) - public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { + public void editIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { final var viewModel = new IssueEditView(); populate(viewModel, pathParameters, dao); final var projectInfo = viewModel.getProjectInfo(); if (projectInfo == null) { resp.sendError(HttpServletResponse.SC_NOT_FOUND); - return ResponseType.NONE; + return; } final var issueDao = dao.getIssueDao(); final var issue = issueDao.find(Functions.parseIntOrZero(pathParameters.get("issue"))); if (issue == null) { resp.sendError(HttpServletResponse.SC_NOT_FOUND); - return ResponseType.NONE; + return; } issueDao.joinVersionInformation(issue); configureIssueEditor(viewModel, issue, dao); - return forwardView(req, viewModel, "issue-form"); + forwardView(req, resp, viewModel, "issue-form"); } @RequestMapping(requestPath = "$project/create-issue", method = HttpMethod.GET) - public ResponseType createIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { + public void createIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException, ServletException { final var viewModel = new IssueEditView(); populate(viewModel, pathParameters, dao); final var projectInfo = viewModel.getProjectInfo(); if (projectInfo == null) { resp.sendError(HttpServletResponse.SC_NOT_FOUND); - return ResponseType.NONE; + return; } final var issue = new Issue(-1); issue.setProject(projectInfo.getProject()); configureIssueEditor(viewModel, issue, dao); - return forwardView(req, viewModel, "issue-form"); + forwardView(req, resp, viewModel, "issue-form"); } @RequestMapping(requestPath = "commit-issue", method = HttpMethod.POST) - public ResponseType commitIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { + public void commitIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, ServletException { try { final var issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow()); final var componentId = getParameter(req, Integer.class, "component"); @@ -512,7 +510,7 @@ if (project == null) { // TODO: improve error handling, because not found is not correct for this POST request resp.sendError(HttpServletResponse.SC_NOT_FOUND); - return ResponseType.NONE; + return; } issue.setProject(project); getParameter(req, String.class, "category").map(IssueCategory::valueOf).ifPresent(issue::setCategory); @@ -549,25 +547,24 @@ setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/view"); setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); - return ResponseType.HTML; + renderSite(req, resp); } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); // TODO: implement - fix issue #21 - return ResponseType.NONE; } } @RequestMapping(requestPath = "commit-issue-comment", method = HttpMethod.POST) - public ResponseType commentIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException, IOException { + public void commentIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException, IOException, ServletException { final var issueIdParam = getParameter(req, Integer.class, "issueid"); if (issueIdParam.isEmpty()) { resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Detected manipulated form."); - return ResponseType.NONE; + return; } final var issue = dao.getIssueDao().find(issueIdParam.get()); if (issue == null) { resp.sendError(HttpServletResponse.SC_NOT_FOUND); - return ResponseType.NONE; + return; } try { final var issueComment = new IssueComment(getParameter(req, Integer.class, "commentid").orElse(-1)); @@ -588,11 +585,10 @@ setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/view"); setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); - return ResponseType.HTML; + renderSite(req, resp); } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); // TODO: implement - fix issue #21 - return ResponseType.NONE; } } }