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 } |