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

changeset 109
2e0669e814ff
parent 107
b5f740a87af4
child 110
9d0be0b1580f
equal deleted inserted replaced
108:6657dad897ea 109:2e0669e814ff
40 import javax.servlet.http.HttpServletRequest; 40 import javax.servlet.http.HttpServletRequest;
41 import javax.servlet.http.HttpServletResponse; 41 import javax.servlet.http.HttpServletResponse;
42 import java.io.IOException; 42 import java.io.IOException;
43 import java.sql.Date; 43 import java.sql.Date;
44 import java.sql.SQLException; 44 import java.sql.SQLException;
45 import java.util.ArrayList;
46 import java.util.NoSuchElementException; 45 import java.util.NoSuchElementException;
47 import java.util.Optional; 46 import java.util.Optional;
48 import java.util.stream.Collectors; 47 import java.util.stream.Collectors;
49 import java.util.stream.Stream; 48 import java.util.stream.Stream;
50 49
64 private static final String PARAMETER_SELECTED_VERSION = "vid"; 63 private static final String PARAMETER_SELECTED_VERSION = "vid";
65 64
66 @Override 65 @Override
67 protected String getResourceBundleName() { 66 protected String getResourceBundleName() {
68 return "localization.projects"; 67 return "localization.projects";
69 }
70
71 private String queryParams(Project p, Version v) {
72 return String.format("pid=%d&vid=%d",
73 p == null ? -1 : p.getId(),
74 v == null ? -1 : v.getId()
75 );
76 }
77
78 /**
79 * Creates the navigation menu.
80 *
81 * @param req the servlet request
82 * @param viewModel the current view model
83 */
84 private void setNavigationMenu(HttpServletRequest req, ProjectView viewModel) {
85 final Project selectedProject = Optional.ofNullable(viewModel.getProjectInfo()).map(ProjectInfo::getProject).orElse(null);
86
87 final var navigation = new ArrayList<MenuEntry>();
88
89 for (ProjectInfo plistInfo : viewModel.getProjectList()) {
90 final var proj = plistInfo.getProject();
91 final var projEntry = new MenuEntry(
92 proj.getName(),
93 "projects/view?" + queryParams(proj, null)
94 );
95 navigation.add(projEntry);
96 if (proj.equals(selectedProject)) {
97 final var projInfo = viewModel.getProjectInfo();
98 projEntry.setActive(true);
99
100 // ****************
101 // Versions Section
102 // ****************
103 {
104 final var entry = new MenuEntry(1,
105 new ResourceKey(getResourceBundleName(), "menu.versions"),
106 "projects/view?" + queryParams(proj, null)
107 );
108 navigation.add(entry);
109 }
110
111 final var level2 = new ArrayList<MenuEntry>();
112 {
113 final var entry = new MenuEntry(
114 new ResourceKey(getResourceBundleName(), "filter.none"),
115 "projects/view?" + queryParams(proj, null)
116 );
117 if (viewModel.getVersionFilter() == null) entry.setActive(true);
118 level2.add(entry);
119 }
120
121 for (Version version : projInfo.getVersions()) {
122 final var entry = new MenuEntry(
123 version.getName(),
124 "projects/view?" + queryParams(proj, version)
125 );
126 if (version.equals(viewModel.getVersionFilter())) entry.setActive(true);
127 level2.add(entry);
128 }
129
130 level2.forEach(e -> e.setLevel(2));
131 navigation.addAll(level2);
132 }
133 }
134
135 setNavigationMenu(req, navigation);
136 } 68 }
137 69
138 private int syncParamWithSession(HttpServletRequest req, String param, String attr) { 70 private int syncParamWithSession(HttpServletRequest req, String param, String attr) {
139 final var session = req.getSession(); 71 final var session = req.getSession();
140 final var idParam = getParameter(req, Integer.class, param); 72 final var idParam = getParameter(req, Integer.class, param);
177 109
178 private ResponseType forwardView(HttpServletRequest req, ProjectView viewModel, String name) { 110 private ResponseType forwardView(HttpServletRequest req, ProjectView viewModel, String name) {
179 setViewModel(req, viewModel); 111 setViewModel(req, viewModel);
180 setContentPage(req, name); 112 setContentPage(req, name);
181 setStylesheet(req, "projects"); 113 setStylesheet(req, "projects");
182 setNavigationMenu(req, viewModel); 114 setNavigationMenu(req, "project-navmenu");
183 return ResponseType.HTML; 115 return ResponseType.HTML;
184 } 116 }
185 117
186 @RequestMapping(method = HttpMethod.GET) 118 @RequestMapping(method = HttpMethod.GET)
187 public ResponseType index(HttpServletRequest req, DataAccessObjects dao) throws SQLException { 119 public ResponseType index(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
230 ownerId -> ownerId >= 0 ? new User(ownerId) : null 162 ownerId -> ownerId >= 0 ? new User(ownerId) : null
231 ).ifPresent(project::setOwner); 163 ).ifPresent(project::setOwner);
232 164
233 dao.getProjectDao().saveOrUpdate(project); 165 dao.getProjectDao().saveOrUpdate(project);
234 166
235 setRedirectLocation(req, "./projects/view?pid="+project.getId()); 167 setRedirectLocation(req, "./projects/versions?pid="+project.getId());
236 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); 168 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL);
237 LOG.debug("Successfully updated project {}", project.getName()); 169 LOG.debug("Successfully updated project {}", project.getName());
238 170
239 return ResponseType.HTML; 171 return ResponseType.HTML;
240 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { 172 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) {
268 detailView.updateDetails(issues, version); 200 detailView.updateDetails(issues, version);
269 201
270 return forwardView(req, viewModel, "project-details"); 202 return forwardView(req, viewModel, "project-details");
271 } 203 }
272 204
205 @RequestMapping(requestPath = "versions", method = HttpMethod.GET)
206 public ResponseType versions(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException, SQLException {
207 final var viewModel = new VersionsView();
208 populate(viewModel, req, dao);
209 viewModel.setVersionFilter(null);
210
211 final var projectInfo = viewModel.getProjectInfo();
212 if (projectInfo == null) {
213 resp.sendError(HttpServletResponse.SC_NOT_FOUND, "No project selected.");
214 return ResponseType.NONE;
215 }
216
217 final var issueDao = dao.getIssueDao();
218 final var issues = issueDao.list(projectInfo.getProject());
219 for (var issue : issues) issueDao.joinVersionInformation(issue);
220 viewModel.update(projectInfo.getVersions(), issues);
221
222 return forwardView(req, viewModel, "versions");
223 }
224
273 @RequestMapping(requestPath = "versions/edit", method = HttpMethod.GET) 225 @RequestMapping(requestPath = "versions/edit", method = HttpMethod.GET)
274 public ResponseType editVersion(HttpServletRequest req, DataAccessObjects dao) throws SQLException { 226 public ResponseType editVersion(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
275 final var viewModel = new VersionEditView(); 227 final var viewModel = new VersionEditView();
276 populate(viewModel, req, dao); 228 populate(viewModel, req, dao);
277 229
295 getParameter(req, Integer.class, "ordinal").ifPresent(version::setOrdinal); 247 getParameter(req, Integer.class, "ordinal").ifPresent(version::setOrdinal);
296 version.setStatus(VersionStatus.valueOf(getParameter(req, String.class, "status").orElseThrow())); 248 version.setStatus(VersionStatus.valueOf(getParameter(req, String.class, "status").orElseThrow()));
297 dao.getVersionDao().saveOrUpdate(version); 249 dao.getVersionDao().saveOrUpdate(version);
298 250
299 // specifying the pid parameter will purposely reset the session selected version! 251 // specifying the pid parameter will purposely reset the session selected version!
300 setRedirectLocation(req, "./projects/view?pid=" + version.getProject().getId()); 252 setRedirectLocation(req, "./projects/versions?pid=" + version.getProject().getId());
301 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); 253 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL);
302 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) { 254 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) {
303 LOG.warn("Form validation failure: {}", ex.getMessage()); 255 LOG.warn("Form validation failure: {}", ex.getMessage());
304 LOG.debug("Details:", ex); 256 LOG.debug("Details:", ex);
305 final var viewModel = new VersionEditView(); 257 final var viewModel = new VersionEditView();

mercurial