61 |
64 |
62 private Project getSelectedProject(HttpServletRequest req, DataAccessObjects dao) throws SQLException { |
65 private Project getSelectedProject(HttpServletRequest req, DataAccessObjects dao) throws SQLException { |
63 final var projectDao = dao.getProjectDao(); |
66 final var projectDao = dao.getProjectDao(); |
64 final var session = req.getSession(); |
67 final var session = req.getSession(); |
65 final var projectSelection = getParameter(req, Integer.class, "pid"); |
68 final var projectSelection = getParameter(req, Integer.class, "pid"); |
|
69 final Project selectedProject; |
66 if (projectSelection.isPresent()) { |
70 if (projectSelection.isPresent()) { |
67 final var selectedId = projectSelection.get(); |
71 selectedProject = projectDao.find(projectSelection.get()); |
68 final var selectedProject = projectDao.find(selectedId); |
|
69 session.setAttribute(SESSION_ATTR_SELECTED_PROJECT, selectedProject); |
|
70 return selectedProject; |
|
71 } else { |
72 } else { |
72 return (Project) session.getAttribute(SESSION_ATTR_SELECTED_PROJECT); |
73 final var sessionProject = (Project) session.getAttribute(SESSION_ATTR_SELECTED_PROJECT); |
73 } |
74 selectedProject = sessionProject == null ? null : projectDao.find(sessionProject.getId()); |
|
75 } |
|
76 session.setAttribute(SESSION_ATTR_SELECTED_PROJECT, selectedProject); |
|
77 return selectedProject; |
|
78 } |
|
79 |
|
80 |
|
81 /** |
|
82 * Creates the breadcrumb menu. |
|
83 * |
|
84 * @param level the current active level |
|
85 * @param selectedProject the selected project, if any, or null |
|
86 * @return a dynamic breadcrumb menu trying to display as many levels as possible |
|
87 */ |
|
88 private List<MenuEntry> getBreadcrumbs(int level, |
|
89 Project selectedProject) { |
|
90 MenuEntry entry; |
|
91 |
|
92 final var breadcrumbs = new ArrayList<MenuEntry>(); |
|
93 entry = new MenuEntry(new ResourceKey("localization.projects", "menuLabel"), |
|
94 "projects/", 0); |
|
95 breadcrumbs.add(entry); |
|
96 if (level == 0) entry.setActive(true); |
|
97 |
|
98 if (selectedProject == null) |
|
99 return breadcrumbs; |
|
100 |
|
101 entry = new MenuEntry(selectedProject.getName(), |
|
102 "projects/view?pid=" + selectedProject.getId(), 1); |
|
103 if (level == 1) entry.setActive(true); |
|
104 |
|
105 breadcrumbs.add(entry); |
|
106 return breadcrumbs; |
74 } |
107 } |
75 |
108 |
76 @RequestMapping(method = HttpMethod.GET) |
109 @RequestMapping(method = HttpMethod.GET) |
77 public ResponseType index(HttpServletRequest req, DataAccessObjects dao) throws SQLException { |
110 public ResponseType index(HttpServletRequest req, DataAccessObjects dao) throws SQLException { |
78 |
111 |
79 final var projectList = dao.getProjectDao().list(); |
112 final var projectList = dao.getProjectDao().list(); |
80 req.setAttribute("projects", projectList); |
113 req.setAttribute("projects", projectList); |
81 setDynamicFragment(req, "projects"); |
114 setDynamicFragment(req, "projects"); |
82 setStylesheet(req, "projects"); |
115 setStylesheet(req, "projects"); |
83 |
116 |
84 if (getSelectedProject(req, dao) == null) { |
117 final var selectedProject = getSelectedProject(req, dao); |
85 projectList.stream().findFirst().ifPresent(proj -> req.getSession().setAttribute(SESSION_ATTR_SELECTED_PROJECT, proj)); |
118 setBreadcrumbs(req, getBreadcrumbs(0, selectedProject)); |
86 } |
119 |
87 |
120 return ResponseType.HTML; |
88 return ResponseType.HTML; |
121 } |
|
122 |
|
123 private void configureEditForm(HttpServletRequest req, DataAccessObjects dao, Optional<Project> project) throws SQLException { |
|
124 if (project.isPresent()) { |
|
125 req.setAttribute("project", project.get()); |
|
126 setBreadcrumbs(req, getBreadcrumbs(1, project.get())); |
|
127 } else { |
|
128 req.setAttribute("project", new Project(-1)); |
|
129 setBreadcrumbs(req, getBreadcrumbs(0, null)); |
|
130 } |
|
131 |
|
132 req.setAttribute("users", dao.getUserDao().list()); |
|
133 setDynamicFragment(req, "project-form"); |
89 } |
134 } |
90 |
135 |
91 @RequestMapping(requestPath = "edit", method = HttpMethod.GET) |
136 @RequestMapping(requestPath = "edit", method = HttpMethod.GET) |
92 public ResponseType edit(HttpServletRequest req, DataAccessObjects dao) throws SQLException { |
137 public ResponseType edit(HttpServletRequest req, DataAccessObjects dao) throws SQLException { |
93 req.setAttribute("project", findByParameter(req, Integer.class, "id", |
138 |
94 dao.getProjectDao()::find).orElse(new Project(-1))); |
139 Optional<Project> project = findByParameter(req, Integer.class, "id", dao.getProjectDao()::find); |
95 req.setAttribute("users", dao.getUserDao().list()); |
140 configureEditForm(req, dao, project); |
96 |
141 if (project.isPresent()) { |
97 setDynamicFragment(req, "project-form"); |
142 req.getSession().setAttribute(SESSION_ATTR_SELECTED_PROJECT, project.get()); |
|
143 } |
98 |
144 |
99 return ResponseType.HTML; |
145 return ResponseType.HTML; |
100 } |
146 } |
101 |
147 |
102 @RequestMapping(requestPath = "commit", method = HttpMethod.POST) |
148 @RequestMapping(requestPath = "commit", method = HttpMethod.POST) |
103 public ResponseType commit(HttpServletRequest req, DataAccessObjects dao) throws SQLException { |
149 public ResponseType commit(HttpServletRequest req, DataAccessObjects dao) throws SQLException { |
104 |
150 |
105 Project project = new Project(-1); |
151 Project project = null; |
106 try { |
152 try { |
107 project = new Project(getParameter(req, Integer.class, "id").orElseThrow()); |
153 project = new Project(getParameter(req, Integer.class, "id").orElseThrow()); |
108 project.setName(getParameter(req, String.class, "name").orElseThrow()); |
154 project.setName(getParameter(req, String.class, "name").orElseThrow()); |
109 getParameter(req, String.class, "description").ifPresent(project::setDescription); |
155 getParameter(req, String.class, "description").ifPresent(project::setDescription); |
110 getParameter(req, String.class, "repoUrl").ifPresent(project::setRepoUrl); |
156 getParameter(req, String.class, "repoUrl").ifPresent(project::setRepoUrl); |
117 setRedirectLocation(req, "./projects/"); |
163 setRedirectLocation(req, "./projects/"); |
118 setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL); |
164 setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL); |
119 LOG.debug("Successfully updated project {}", project.getName()); |
165 LOG.debug("Successfully updated project {}", project.getName()); |
120 } catch (NoSuchElementException | NumberFormatException | SQLException ex) { |
166 } catch (NoSuchElementException | NumberFormatException | SQLException ex) { |
121 // TODO: set request attribute with error text |
167 // TODO: set request attribute with error text |
122 req.setAttribute("project", project); |
|
123 req.setAttribute("users", dao.getUserDao().list()); |
|
124 setDynamicFragment(req, "project-form"); |
|
125 LOG.warn("Form validation failure: {}", ex.getMessage()); |
168 LOG.warn("Form validation failure: {}", ex.getMessage()); |
126 LOG.debug("Details:", ex); |
169 LOG.debug("Details:", ex); |
|
170 configureEditForm(req, dao, Optional.ofNullable(project)); |
127 } |
171 } |
128 |
172 |
129 return ResponseType.HTML; |
173 return ResponseType.HTML; |
130 } |
174 } |
131 |
175 |
138 } |
182 } |
139 |
183 |
140 req.setAttribute("versions", dao.getVersionDao().list(selectedProject)); |
184 req.setAttribute("versions", dao.getVersionDao().list(selectedProject)); |
141 req.setAttribute("issues", dao.getIssueDao().list(selectedProject)); |
185 req.setAttribute("issues", dao.getIssueDao().list(selectedProject)); |
142 |
186 |
|
187 // TODO: add more levels depending on last visited location |
|
188 setBreadcrumbs(req, getBreadcrumbs(1, selectedProject)); |
|
189 |
143 setDynamicFragment(req, "project-details"); |
190 setDynamicFragment(req, "project-details"); |
144 |
191 |
145 return ResponseType.HTML; |
192 return ResponseType.HTML; |
|
193 } |
|
194 |
|
195 private void configureEditVersionForm(HttpServletRequest req, Optional<Version> version, Project selectedProject) { |
|
196 req.setAttribute("version", version.orElse(new Version(-1, selectedProject))); |
|
197 req.setAttribute("versionStatusEnum", VersionStatus.values()); |
|
198 |
|
199 setDynamicFragment(req, "version-form"); |
146 } |
200 } |
147 |
201 |
148 @RequestMapping(requestPath = "versions/edit", method = HttpMethod.GET) |
202 @RequestMapping(requestPath = "versions/edit", method = HttpMethod.GET) |
149 public ResponseType editVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException { |
203 public ResponseType editVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException { |
150 final var selectedProject = getSelectedProject(req, dao); |
204 final var selectedProject = getSelectedProject(req, dao); |
151 if (selectedProject == null) { |
205 if (selectedProject == null) { |
152 resp.sendError(HttpServletResponse.SC_FORBIDDEN); |
206 resp.sendError(HttpServletResponse.SC_FORBIDDEN); |
153 return ResponseType.NONE; |
207 return ResponseType.NONE; |
154 } |
208 } |
155 |
209 |
156 req.setAttribute("version", findByParameter(req, Integer.class, "id", |
210 configureEditVersionForm(req, |
157 dao.getVersionDao()::find).orElse(new Version(-1, selectedProject))); |
211 findByParameter(req, Integer.class, "id", dao.getVersionDao()::find), |
158 req.setAttribute("versionStatusEnum", VersionStatus.values()); |
212 selectedProject); |
159 |
|
160 setDynamicFragment(req, "version-form"); |
|
161 |
213 |
162 return ResponseType.HTML; |
214 return ResponseType.HTML; |
163 } |
215 } |
164 |
216 |
165 @RequestMapping(requestPath = "versions/commit", method = HttpMethod.POST) |
217 @RequestMapping(requestPath = "versions/commit", method = HttpMethod.POST) |
181 setRedirectLocation(req, "./projects/versions/"); |
233 setRedirectLocation(req, "./projects/versions/"); |
182 setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL); |
234 setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL); |
183 LOG.debug("Successfully updated version {} for project {}", version.getName(), selectedProject.getName()); |
235 LOG.debug("Successfully updated version {} for project {}", version.getName(), selectedProject.getName()); |
184 } catch (NoSuchElementException | NumberFormatException | SQLException ex) { |
236 } catch (NoSuchElementException | NumberFormatException | SQLException ex) { |
185 // TODO: set request attribute with error text |
237 // TODO: set request attribute with error text |
186 req.setAttribute("version", version); |
|
187 req.setAttribute("versionStatusEnum", VersionStatus.values()); |
|
188 setDynamicFragment(req, "version-form"); |
|
189 LOG.warn("Form validation failure: {}", ex.getMessage()); |
238 LOG.warn("Form validation failure: {}", ex.getMessage()); |
190 LOG.debug("Details:", ex); |
239 LOG.debug("Details:", ex); |
191 } |
240 configureEditVersionForm(req, Optional.ofNullable(version), selectedProject); |
192 |
241 } |
193 return ResponseType.HTML; |
242 |
|
243 return ResponseType.HTML; |
|
244 } |
|
245 |
|
246 private void configureEditIssueForm(HttpServletRequest req, DataAccessObjects dao, Optional<Issue> issue, Project selectedProject) throws SQLException { |
|
247 |
|
248 req.setAttribute("issue", issue.orElse(new Issue(-1, selectedProject))); |
|
249 req.setAttribute("issueStatusEnum", IssueStatus.values()); |
|
250 req.setAttribute("issueCategoryEnum", IssueCategory.values()); |
|
251 req.setAttribute("versions", dao.getVersionDao().list(selectedProject)); |
|
252 |
|
253 setDynamicFragment(req, "issue-form"); |
194 } |
254 } |
195 |
255 |
196 @RequestMapping(requestPath = "issues/edit", method = HttpMethod.GET) |
256 @RequestMapping(requestPath = "issues/edit", method = HttpMethod.GET) |
197 public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException { |
257 public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException { |
198 final var selectedProject = getSelectedProject(req, dao); |
258 final var selectedProject = getSelectedProject(req, dao); |
199 if (selectedProject == null) { |
259 if (selectedProject == null) { |
200 resp.sendError(HttpServletResponse.SC_FORBIDDEN); |
260 resp.sendError(HttpServletResponse.SC_FORBIDDEN); |
201 return ResponseType.NONE; |
261 return ResponseType.NONE; |
202 } |
262 } |
203 |
263 |
204 req.setAttribute("issue", findByParameter(req, Integer.class, "id", |
264 configureEditIssueForm(req, dao, |
205 dao.getIssueDao()::find).orElse(new Issue(-1, selectedProject))); |
265 findByParameter(req, Integer.class, "id", dao.getIssueDao()::find), |
206 req.setAttribute("issueStatusEnum", IssueStatus.values()); |
266 selectedProject); |
207 req.setAttribute("issueCategoryEnum", IssueCategory.values()); |
|
208 |
|
209 setDynamicFragment(req, "issue-form"); |
|
210 |
267 |
211 return ResponseType.HTML; |
268 return ResponseType.HTML; |
212 } |
269 } |
213 |
270 |
214 @RequestMapping(requestPath = "issues/commit", method = HttpMethod.POST) |
271 @RequestMapping(requestPath = "issues/commit", method = HttpMethod.POST) |
230 setRedirectLocation(req, "./projects/issues/"); |
287 setRedirectLocation(req, "./projects/issues/"); |
231 setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL); |
288 setDynamicFragment(req, Constants.DYN_FRAGMENT_COMMIT_SUCCESSFUL); |
232 LOG.debug("Successfully updated issue {} for project {}", issue.getId(), selectedProject.getName()); |
289 LOG.debug("Successfully updated issue {} for project {}", issue.getId(), selectedProject.getName()); |
233 } catch (NoSuchElementException | NumberFormatException | SQLException ex) { |
290 } catch (NoSuchElementException | NumberFormatException | SQLException ex) { |
234 // TODO: set request attribute with error text |
291 // TODO: set request attribute with error text |
235 req.setAttribute("issue", issue); |
|
236 req.setAttribute("issueStatusEnum", IssueStatus.values()); |
|
237 req.setAttribute("issueCategoryEnum", IssueCategory.values()); |
|
238 setDynamicFragment(req, "issue-form"); |
|
239 LOG.warn("Form validation failure: {}", ex.getMessage()); |
292 LOG.warn("Form validation failure: {}", ex.getMessage()); |
240 LOG.debug("Details:", ex); |
293 LOG.debug("Details:", ex); |
|
294 configureEditIssueForm(req, dao, Optional.ofNullable(issue), selectedProject); |
241 } |
295 } |
242 |
296 |
243 return ResponseType.HTML; |
297 return ResponseType.HTML; |
244 } |
298 } |
245 } |
299 } |