src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java

changeset 64
0f1746c6abfb
parent 61
3e287f361c7a
child 65
9861a68a4612
equal deleted inserted replaced
63:51aa5e267c7f 64:0f1746c6abfb
29 package de.uapcore.lightpit.modules; 29 package de.uapcore.lightpit.modules;
30 30
31 31
32 import de.uapcore.lightpit.*; 32 import de.uapcore.lightpit.*;
33 import de.uapcore.lightpit.dao.DataAccessObjects; 33 import de.uapcore.lightpit.dao.DataAccessObjects;
34 import de.uapcore.lightpit.entities.Project; 34 import de.uapcore.lightpit.entities.*;
35 import de.uapcore.lightpit.entities.User;
36 import de.uapcore.lightpit.entities.Version;
37 import de.uapcore.lightpit.entities.VersionStatus;
38 import org.slf4j.Logger; 35 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory; 36 import org.slf4j.LoggerFactory;
40 37
41 import javax.servlet.annotation.WebServlet; 38 import javax.servlet.annotation.WebServlet;
42 import javax.servlet.http.HttpServletRequest; 39 import javax.servlet.http.HttpServletRequest;
43 import javax.servlet.http.HttpServletResponse; 40 import javax.servlet.http.HttpServletResponse;
44 import java.io.IOException; 41 import java.io.IOException;
45 import java.sql.SQLException; 42 import java.sql.SQLException;
46 import java.util.NoSuchElementException; 43 import java.util.NoSuchElementException;
47 import java.util.Optional;
48 44
49 import static de.uapcore.lightpit.Functions.fqn; 45 import static de.uapcore.lightpit.Functions.fqn;
50 46
51 @LightPITModule( 47 @LightPITModule(
52 bundleBaseName = "localization.projects", 48 bundleBaseName = "localization.projects",
61 57
62 private static final Logger LOG = LoggerFactory.getLogger(ProjectsModule.class); 58 private static final Logger LOG = LoggerFactory.getLogger(ProjectsModule.class);
63 59
64 public static final String SESSION_ATTR_SELECTED_PROJECT = fqn(ProjectsModule.class, "selected-project"); 60 public static final String SESSION_ATTR_SELECTED_PROJECT = fqn(ProjectsModule.class, "selected-project");
65 61
62 private Project getSelectedProject(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
63 final var projectDao = dao.getProjectDao();
64 final var session = req.getSession();
65 final var projectSelection = getParameter(req, Integer.class, "pid");
66 if (projectSelection.isPresent()) {
67 final var selectedId = projectSelection.get();
68 final var selectedProject = projectDao.find(selectedId);
69 session.setAttribute(SESSION_ATTR_SELECTED_PROJECT, selectedProject);
70 return selectedProject;
71 } else {
72 return (Project) session.getAttribute(SESSION_ATTR_SELECTED_PROJECT);
73 }
74 }
75
66 @RequestMapping(method = HttpMethod.GET) 76 @RequestMapping(method = HttpMethod.GET)
67 public ResponseType indexRedirect(HttpServletResponse resp) throws IOException { 77 public ResponseType indexRedirect(HttpServletResponse resp) throws IOException {
68 resp.sendRedirect("index/"); 78 resp.sendRedirect("index/");
69 return ResponseType.NONE; 79 return ResponseType.NONE;
70 } 80 }
71 81
72 @RequestMapping(requestPath = "index", method = HttpMethod.GET, menuKey = "menu.index") 82 @RequestMapping(requestPath = "index", method = HttpMethod.GET, menuKey = "menu.index")
73 public ResponseType index(HttpServletRequest req, DataAccessObjects dao) throws SQLException { 83 public ResponseType index(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
84
74 final var projectList = dao.getProjectDao().list(); 85 final var projectList = dao.getProjectDao().list();
75 req.setAttribute("projects", projectList); 86 req.setAttribute("projects", projectList);
76 setDynamicFragment(req, "projects"); 87 setDynamicFragment(req, "projects");
77 setStylesheet(req, "projects"); 88 setStylesheet(req, "projects");
78 89
79 final var session = req.getSession(); 90 if (getSelectedProject(req, dao) == null) {
80 final var projectSelection = getParameter(req, Integer.class, "select"); 91 projectList.stream().findFirst().ifPresent(proj -> req.getSession().setAttribute(SESSION_ATTR_SELECTED_PROJECT, proj));
81 if (projectSelection.isPresent()) {
82 final var selectedId = projectSelection.get();
83 for (var proj : projectList) {
84 if (proj.getId() == selectedId) {
85 session.setAttribute(SESSION_ATTR_SELECTED_PROJECT, proj);
86 break;
87 }
88 }
89 } else {
90 final var selectedProject = session.getAttribute(SESSION_ATTR_SELECTED_PROJECT);
91 if (selectedProject == null) {
92 projectList.stream().findFirst().ifPresent(proj -> session.setAttribute(SESSION_ATTR_SELECTED_PROJECT, proj));
93 }
94 } 92 }
95 93
96 return ResponseType.HTML; 94 return ResponseType.HTML;
97 } 95 }
98 96
99 @RequestMapping(requestPath = "edit", method = HttpMethod.GET) 97 @RequestMapping(requestPath = "edit", method = HttpMethod.GET)
100 public ResponseType edit(HttpServletRequest req, DataAccessObjects dao) throws SQLException { 98 public ResponseType edit(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
101 final var projectDao = dao.getProjectDao(); 99 final var projectDao = dao.getProjectDao();
102 100
103 Optional<Integer> id = getParameter(req, Integer.class, "id"); 101 req.setAttribute("project", findByParameter(req, Integer.class, "id", projectDao::find));
104 if (id.isPresent()) {
105 req.setAttribute("project", Optional.ofNullable(projectDao.find(id.get())).orElse(new Project(-1)));
106 } else {
107 req.setAttribute("project", new Project(-1));
108 }
109 req.setAttribute("users", dao.getUserDao().list());
110
111 setDynamicFragment(req, "project-form"); 102 setDynamicFragment(req, "project-form");
112 103
113 return ResponseType.HTML; 104 return ResponseType.HTML;
114 } 105 }
115 106
142 return ResponseType.HTML; 133 return ResponseType.HTML;
143 } 134 }
144 135
145 @RequestMapping(requestPath = "versions", method = HttpMethod.GET, menuKey = "menu.versions") 136 @RequestMapping(requestPath = "versions", method = HttpMethod.GET, menuKey = "menu.versions")
146 public ResponseType versions(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException { 137 public ResponseType versions(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
147 final var selectedProject = (Project)req.getSession().getAttribute(SESSION_ATTR_SELECTED_PROJECT); 138 final var selectedProject = getSelectedProject(req, dao);
148 if (selectedProject == null) { 139 if (selectedProject == null) {
149 resp.sendError(HttpServletResponse.SC_FORBIDDEN); 140 resp.sendError(HttpServletResponse.SC_FORBIDDEN);
150 return ResponseType.NONE; 141 return ResponseType.NONE;
151 } 142 }
152 143
156 return ResponseType.HTML; 147 return ResponseType.HTML;
157 } 148 }
158 149
159 @RequestMapping(requestPath = "versions/edit", method = HttpMethod.GET) 150 @RequestMapping(requestPath = "versions/edit", method = HttpMethod.GET)
160 public ResponseType editVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException { 151 public ResponseType editVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
161 final var selectedProject = (Project)req.getSession().getAttribute(SESSION_ATTR_SELECTED_PROJECT); 152 final var selectedProject = getSelectedProject(req, dao);
162 if (selectedProject == null) { 153 if (selectedProject == null) {
163 resp.sendError(HttpServletResponse.SC_FORBIDDEN); 154 resp.sendError(HttpServletResponse.SC_FORBIDDEN);
164 return ResponseType.NONE; 155 return ResponseType.NONE;
165 } 156 }
166 157
167 Optional<Integer> id = getParameter(req, Integer.class, "id"); 158 req.setAttribute("version", findByParameter(req, Integer.class, "id", dao.getVersionDao()::find));
168 if (id.isPresent()) {
169 req.setAttribute("version", Optional.ofNullable(dao.getVersionDao().find(id.get())).orElse(new Version(-1, selectedProject)));
170 } else {
171 req.setAttribute("version", new Version(-1, selectedProject));
172 }
173 req.setAttribute("versionStatusEnum", VersionStatus.values()); 159 req.setAttribute("versionStatusEnum", VersionStatus.values());
174 160
175 setDynamicFragment(req, "version-form"); 161 setDynamicFragment(req, "version-form");
176 162
177 return ResponseType.HTML; 163 return ResponseType.HTML;
178 } 164 }
179 165
180 @RequestMapping(requestPath = "versions/commit", method = HttpMethod.POST) 166 @RequestMapping(requestPath = "versions/commit", method = HttpMethod.POST)
181 public ResponseType commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException { 167 public ResponseType commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
182 final var selectedProject = (Project)req.getSession().getAttribute(SESSION_ATTR_SELECTED_PROJECT); 168 final var selectedProject = getSelectedProject(req, dao);
183 if (selectedProject == null) { 169 if (selectedProject == null) {
184 resp.sendError(HttpServletResponse.SC_FORBIDDEN); 170 resp.sendError(HttpServletResponse.SC_FORBIDDEN);
185 return ResponseType.NONE; 171 return ResponseType.NONE;
186 } 172 }
187 173
205 LOG.debug("Details:", ex); 191 LOG.debug("Details:", ex);
206 } 192 }
207 193
208 return ResponseType.HTML; 194 return ResponseType.HTML;
209 } 195 }
196
197
198 @RequestMapping(requestPath = "issues", method = HttpMethod.GET, menuKey = "menu.issues")
199 public ResponseType issues(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
200 final var selectedProject = getSelectedProject(req, dao);
201 if (selectedProject == null) {
202 resp.sendError(HttpServletResponse.SC_FORBIDDEN);
203 return ResponseType.NONE;
204 }
205
206 req.setAttribute("issues", dao.getVersionDao().list(selectedProject));
207 setDynamicFragment(req, "issues");
208
209 return ResponseType.HTML;
210 }
211
212 @RequestMapping(requestPath = "issues/edit", method = HttpMethod.GET)
213 public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
214 final var selectedProject = getSelectedProject(req, dao);
215 if (selectedProject == null) {
216 resp.sendError(HttpServletResponse.SC_FORBIDDEN);
217 return ResponseType.NONE;
218 }
219
220 req.setAttribute("issue", findByParameter(req, Integer.class, "id", dao.getIssueDao()::find));
221 req.setAttribute("issueStatusEnum", IssueStatus.values());
222 req.setAttribute("issueCategoryEnum", IssueCategory.values());
223
224 setDynamicFragment(req, "issue-form");
225
226 return ResponseType.HTML;
227 }
228
229 @RequestMapping(requestPath = "issues/commit", method = HttpMethod.POST)
230 public ResponseType commitIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
231 final var selectedProject = getSelectedProject(req, dao);
232 if (selectedProject == null) {
233 resp.sendError(HttpServletResponse.SC_FORBIDDEN);
234 return ResponseType.NONE;
235 }
236
237 Issue issue = new Issue(-1, selectedProject);
238 try {
239 issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow(), selectedProject);
240
241 // TODO: implement
242
243 dao.getIssueDao().saveOrUpdate(issue);
244
245 setRedirectLocation(req, "./projects/issues/");
246 setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL);
247 LOG.debug("Successfully updated issue {} for project {}", issue.getId(), selectedProject.getName());
248 } catch (NoSuchElementException | NumberFormatException | SQLException ex) {
249 // TODO: set request attribute with error text
250 req.setAttribute("issue", issue);
251 req.setAttribute("issueStatusEnum", IssueStatus.values());
252 req.setAttribute("issueCategoryEnum", IssueCategory.values());
253 setDynamicFragment(req, "issue-form");
254 LOG.warn("Form validation failure: {}", ex.getMessage());
255 LOG.debug("Details:", ex);
256 }
257
258 return ResponseType.HTML;
259 }
210 } 260 }

mercurial