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

changeset 71
dca186d3911f
parent 70
821c4950b619
child 74
91d1fc2a3a14
equal deleted inserted replaced
70:821c4950b619 71:dca186d3911f
38 import javax.servlet.annotation.WebServlet; 38 import javax.servlet.annotation.WebServlet;
39 import javax.servlet.http.HttpServletRequest; 39 import javax.servlet.http.HttpServletRequest;
40 import javax.servlet.http.HttpServletResponse; 40 import javax.servlet.http.HttpServletResponse;
41 import java.io.IOException; 41 import java.io.IOException;
42 import java.sql.SQLException; 42 import java.sql.SQLException;
43 import java.util.ArrayList;
44 import java.util.List;
43 import java.util.NoSuchElementException; 45 import java.util.NoSuchElementException;
46 import java.util.Optional;
44 47
45 import static de.uapcore.lightpit.Functions.fqn; 48 import static de.uapcore.lightpit.Functions.fqn;
46 49
47 @LightPITModule( 50 @LightPITModule(
48 bundleBaseName = "localization.projects", 51 bundleBaseName = "localization.projects",
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)
168 if (selectedProject == null) { 220 if (selectedProject == null) {
169 resp.sendError(HttpServletResponse.SC_FORBIDDEN); 221 resp.sendError(HttpServletResponse.SC_FORBIDDEN);
170 return ResponseType.NONE; 222 return ResponseType.NONE;
171 } 223 }
172 224
173 Version version = new Version(-1, selectedProject); 225 Version version = null;
174 try { 226 try {
175 version = new Version(getParameter(req, Integer.class, "id").orElseThrow(), selectedProject); 227 version = new Version(getParameter(req, Integer.class, "id").orElseThrow(), selectedProject);
176 version.setName(getParameter(req, String.class, "name").orElseThrow()); 228 version.setName(getParameter(req, String.class, "name").orElseThrow());
177 getParameter(req, Integer.class, "ordinal").ifPresent(version::setOrdinal); 229 getParameter(req, Integer.class, "ordinal").ifPresent(version::setOrdinal);
178 version.setStatus(VersionStatus.valueOf(getParameter(req, String.class, "status").orElseThrow())); 230 version.setStatus(VersionStatus.valueOf(getParameter(req, String.class, "status").orElseThrow()));
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)
217 if (selectedProject == null) { 274 if (selectedProject == null) {
218 resp.sendError(HttpServletResponse.SC_FORBIDDEN); 275 resp.sendError(HttpServletResponse.SC_FORBIDDEN);
219 return ResponseType.NONE; 276 return ResponseType.NONE;
220 } 277 }
221 278
222 Issue issue = new Issue(-1, selectedProject); 279 Issue issue = null;
223 try { 280 try {
224 issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow(), selectedProject); 281 issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow(), selectedProject);
225 282
226 // TODO: implement 283 // TODO: implement
227 284
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 }

mercurial