Thu, 22 Oct 2020 12:00:34 +0200
fixes creation of redirect link when commenting an issue
1 /*
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3 *
4 * Copyright 2018 Mike Becker. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29 package de.uapcore.lightpit.modules;
32 import de.uapcore.lightpit.*;
33 import de.uapcore.lightpit.dao.DataAccessObjects;
34 import de.uapcore.lightpit.entities.*;
35 import de.uapcore.lightpit.types.WebColor;
36 import de.uapcore.lightpit.viewmodel.*;
37 import de.uapcore.lightpit.viewmodel.util.IssueSorter;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
41 import javax.servlet.annotation.WebServlet;
42 import javax.servlet.http.HttpServletRequest;
43 import javax.servlet.http.HttpServletResponse;
44 import java.io.IOException;
45 import java.sql.Date;
46 import java.sql.SQLException;
47 import java.util.List;
48 import java.util.NoSuchElementException;
49 import java.util.Optional;
50 import java.util.stream.Collectors;
51 import java.util.stream.Stream;
53 @WebServlet(
54 name = "ProjectsModule",
55 urlPatterns = "/projects/*"
56 )
57 public final class ProjectsModule extends AbstractLightPITServlet {
59 private static final Logger LOG = LoggerFactory.getLogger(ProjectsModule.class);
61 @Override
62 protected String getResourceBundleName() {
63 return "localization.projects";
64 }
66 private void populate(ProjectView viewModel, PathParameters pathParameters, DataAccessObjects dao) throws SQLException {
67 final var projectDao = dao.getProjectDao();
68 final var versionDao = dao.getVersionDao();
69 final var componentDao = dao.getComponentDao();
71 projectDao.list().stream().map(ProjectInfo::new).forEach(viewModel.getProjectList()::add);
73 if (pathParameters == null)
74 return;
76 // Select Project
77 final int pid = Functions.parseIntOrZero(pathParameters.get("project"));
78 if (pid > 0) {
79 final var project = projectDao.find(pid);
80 if (project != null) {
81 final var info = new ProjectInfo(project);
82 info.setVersions(versionDao.list(project));
83 info.setComponents(componentDao.list(project));
84 info.setIssueSummary(projectDao.getIssueSummary(project));
85 viewModel.setProjectInfo(info);
86 }
87 }
89 // Select Version
90 final var pathParamVersion = pathParameters.get("version");
91 if ("no-version".equals(pathParamVersion)) {
92 viewModel.setVersionFilter(ProjectView.NO_VERSION);
93 } else if ("all-versions".equals(pathParamVersion)) {
94 viewModel.setVersionFilter(ProjectView.ALL_VERSIONS);
95 } else {
96 final int vid = Functions.parseIntOrZero(pathParamVersion);
97 if (vid > 0) {
98 viewModel.setVersionFilter(versionDao.find(vid));
99 }
100 }
102 // Select Component
103 final var pathParamComponent = pathParameters.get("component");
104 if ("no-component".equals(pathParamComponent)) {
105 viewModel.setComponentFilter(ProjectView.NO_COMPONENT);
106 } else if ("all-components".equals(pathParamComponent)) {
107 viewModel.setComponentFilter(ProjectView.ALL_COMPONENTS);
108 } else {
109 final int cid = Functions.parseIntOrZero(pathParamComponent);
110 if (cid > 0) {
111 viewModel.setComponentFilter(componentDao.find(cid));
112 }
113 }
114 }
116 private ResponseType forwardView(HttpServletRequest req, ProjectView viewModel, String name) {
117 setViewModel(req, viewModel);
118 setContentPage(req, name);
119 setStylesheet(req, "projects");
120 setNavigationMenu(req, "project-navmenu");
121 return ResponseType.HTML;
122 }
124 @RequestMapping(method = HttpMethod.GET)
125 public ResponseType index(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
126 final var viewModel = new ProjectView();
127 populate(viewModel, null, dao);
129 final var projectDao = dao.getProjectDao();
130 final var versionDao = dao.getVersionDao();
132 for (var info : viewModel.getProjectList()) {
133 info.setVersions(versionDao.list(info.getProject()));
134 info.setIssueSummary(projectDao.getIssueSummary(info.getProject()));
135 }
137 return forwardView(req, viewModel, "projects");
138 }
140 private void configureProjectEditor(ProjectEditView viewModel, Project project, DataAccessObjects dao) throws SQLException {
141 viewModel.setProject(project);
142 viewModel.setUsers(dao.getUserDao().list());
143 }
145 @RequestMapping(requestPath = "$project/edit", method = HttpMethod.GET)
146 public ResponseType edit(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DataAccessObjects dao) throws IOException, SQLException {
147 final var viewModel = new ProjectEditView();
148 populate(viewModel, pathParams, dao);
150 if (!viewModel.isProjectInfoPresent()) {
151 resp.sendError(HttpServletResponse.SC_NOT_FOUND);
152 return ResponseType.NONE;
153 }
155 configureProjectEditor(viewModel, viewModel.getProjectInfo().getProject(), dao);
156 return forwardView(req, viewModel, "project-form");
157 }
159 @RequestMapping(requestPath = "create", method = HttpMethod.GET)
160 public ResponseType create(HttpServletRequest req, DataAccessObjects dao) throws SQLException {
161 final var viewModel = new ProjectEditView();
162 populate(viewModel, null, dao);
163 configureProjectEditor(viewModel, new Project(-1), dao);
164 return forwardView(req, viewModel, "project-form");
165 }
167 @RequestMapping(requestPath = "commit", method = HttpMethod.POST)
168 public ResponseType commit(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException {
170 try {
171 final var project = new Project(getParameter(req, Integer.class, "pid").orElseThrow());
172 project.setName(getParameter(req, String.class, "name").orElseThrow());
173 getParameter(req, String.class, "description").ifPresent(project::setDescription);
174 getParameter(req, String.class, "repoUrl").ifPresent(project::setRepoUrl);
175 getParameter(req, Integer.class, "owner").map(
176 ownerId -> ownerId >= 0 ? new User(ownerId) : null
177 ).ifPresent(project::setOwner);
179 dao.getProjectDao().saveOrUpdate(project);
181 setRedirectLocation(req, "./projects/");
182 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL);
183 LOG.debug("Successfully updated project {}", project.getName());
185 return ResponseType.HTML;
186 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) {
187 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
188 // TODO: implement - fix issue #21
189 return ResponseType.NONE;
190 }
191 }
193 @RequestMapping(requestPath = "$project/$component/$version/issues/", method = HttpMethod.GET)
194 public ResponseType issues(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParams, DataAccessObjects dao) throws SQLException, IOException {
195 final var viewModel = new ProjectDetailsView();
196 populate(viewModel, pathParams, dao);
198 if (!viewModel.isEveryFilterValid()) {
199 resp.sendError(HttpServletResponse.SC_NOT_FOUND);
200 return ResponseType.NONE;
201 }
203 final var project = viewModel.getProjectInfo().getProject();
204 final var version = viewModel.getVersionFilter();
205 final var component = viewModel.getComponentFilter();
207 final var issueDao = dao.getIssueDao();
209 final List<Issue> issues;
210 if (version.equals(ProjectView.NO_VERSION)) {
211 if (component.equals(ProjectView.ALL_COMPONENTS)) {
212 issues = issueDao.list(project, (Version) null);
213 } else if (component.equals(ProjectView.NO_COMPONENT)) {
214 issues = issueDao.list(project, null, null);
215 } else {
216 issues = issueDao.list(project, component, null);
217 }
218 } else if (version.equals(ProjectView.ALL_VERSIONS)) {
219 if (component.equals(ProjectView.ALL_COMPONENTS)) {
220 issues = issueDao.list(project);
221 } else if (component.equals(ProjectView.NO_COMPONENT)) {
222 issues = issueDao.list(project, (Component)null);
223 } else {
224 issues = issueDao.list(project, component);
225 }
226 } else {
227 if (component.equals(ProjectView.ALL_COMPONENTS)) {
228 issues = issueDao.list(project, version);
229 } else if (component.equals(ProjectView.NO_COMPONENT)) {
230 issues = issueDao.list(project, null, version);
231 } else {
232 issues = issueDao.list(project, component, version);
233 }
234 }
236 for (var issue : issues) issueDao.joinVersionInformation(issue);
237 issues.sort(new IssueSorter(
238 new IssueSorter.Criteria(IssueSorter.Field.PHASE, true),
239 new IssueSorter.Criteria(IssueSorter.Field.ETA, true),
240 new IssueSorter.Criteria(IssueSorter.Field.UPDATED, false)
241 ));
244 viewModel.getProjectDetails().updateDetails(issues);
245 if (version.getId() > 0)
246 viewModel.getProjectDetails().updateVersionInfo(version);
248 return forwardView(req, viewModel, "project-details");
249 }
251 @RequestMapping(requestPath = "$project/versions/", method = HttpMethod.GET)
252 public ResponseType versions(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException {
253 final var viewModel = new VersionsView();
254 populate(viewModel, pathParameters, dao);
256 final var projectInfo = viewModel.getProjectInfo();
257 if (projectInfo == null) {
258 resp.sendError(HttpServletResponse.SC_NOT_FOUND);
259 return ResponseType.NONE;
260 }
262 final var issueDao = dao.getIssueDao();
263 final var issues = issueDao.list(projectInfo.getProject());
264 for (var issue : issues) issueDao.joinVersionInformation(issue);
265 viewModel.update(projectInfo.getVersions(), issues);
267 return forwardView(req, viewModel, "versions");
268 }
270 @RequestMapping(requestPath = "$project/versions/$version/edit", method = HttpMethod.GET)
271 public ResponseType editVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException {
272 final var viewModel = new VersionEditView();
273 populate(viewModel, pathParameters, dao);
275 if (viewModel.getProjectInfo() == null || viewModel.getVersionFilter() == null) {
276 resp.sendError(HttpServletResponse.SC_NOT_FOUND);
277 return ResponseType.NONE;
278 }
280 viewModel.setVersion(viewModel.getVersionFilter());
282 return forwardView(req, viewModel, "version-form");
283 }
285 @RequestMapping(requestPath = "$project/create-version", method = HttpMethod.GET)
286 public ResponseType createVersion(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException {
287 final var viewModel = new VersionEditView();
288 populate(viewModel, pathParameters, dao);
290 if (viewModel.getProjectInfo() == null) {
291 resp.sendError(HttpServletResponse.SC_NOT_FOUND);
292 return ResponseType.NONE;
293 }
295 viewModel.setVersion(viewModel.getVersionFilter());
297 return forwardView(req, viewModel, "version-form");
298 }
300 @RequestMapping(requestPath = "commit-version", method = HttpMethod.POST)
301 public ResponseType commitVersion(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException {
303 try {
304 final var project = new Project(getParameter(req, Integer.class, "pid").orElseThrow());
305 final var version = new Version(getParameter(req, Integer.class, "id").orElseThrow());
306 version.setName(getParameter(req, String.class, "name").orElseThrow());
307 getParameter(req, Integer.class, "ordinal").ifPresent(version::setOrdinal);
308 version.setStatus(VersionStatus.valueOf(getParameter(req, String.class, "status").orElseThrow()));
309 dao.getVersionDao().saveOrUpdate(version, project);
311 setRedirectLocation(req, "./projects/" + project.getId() + "/versions/");
312 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL);
313 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) {
314 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
315 // TODO: implement - fix issue #21
316 return ResponseType.NONE;
317 }
319 return ResponseType.HTML;
320 }
322 @RequestMapping(requestPath = "$project/components/", method = HttpMethod.GET)
323 public ResponseType components(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException {
324 final var viewModel = new ComponentsView();
325 populate(viewModel, pathParameters, dao);
327 final var projectInfo = viewModel.getProjectInfo();
328 if (projectInfo == null) {
329 resp.sendError(HttpServletResponse.SC_NOT_FOUND);
330 return ResponseType.NONE;
331 }
333 final var issueDao = dao.getIssueDao();
334 final var issues = issueDao.list(projectInfo.getProject());
335 viewModel.update(projectInfo.getComponents(), issues);
337 return forwardView(req, viewModel, "components");
338 }
340 @RequestMapping(requestPath = "$project/components/$component/edit", method = HttpMethod.GET)
341 public ResponseType editComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException {
342 final var viewModel = new ComponentEditView();
343 populate(viewModel, pathParameters, dao);
345 if (viewModel.getProjectInfo() == null || viewModel.getComponentFilter() == null) {
346 resp.sendError(HttpServletResponse.SC_NOT_FOUND);
347 return ResponseType.NONE;
348 }
350 viewModel.setComponent(viewModel.getComponentFilter());
351 viewModel.setUsers(dao.getUserDao().list());
353 return forwardView(req, viewModel, "component-form");
354 }
356 @RequestMapping(requestPath = "$project/create-component", method = HttpMethod.GET)
357 public ResponseType createComponent(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException {
358 final var viewModel = new ComponentEditView();
359 populate(viewModel, pathParameters, dao);
361 if (viewModel.getProjectInfo() == null) {
362 resp.sendError(HttpServletResponse.SC_NOT_FOUND);
363 return ResponseType.NONE;
364 }
366 viewModel.setComponent(new Component(-1));
367 viewModel.setUsers(dao.getUserDao().list());
369 return forwardView(req, viewModel, "component-form");
370 }
372 @RequestMapping(requestPath = "commit-component", method = HttpMethod.POST)
373 public ResponseType commitComponent(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException {
375 try {
376 final var project = new Project(getParameter(req, Integer.class, "pid").orElseThrow());
377 final var component = new Component(getParameter(req, Integer.class, "id").orElseThrow());
378 component.setName(getParameter(req, String.class, "name").orElseThrow());
379 component.setColor(getParameter(req, WebColor.class, "color").orElseThrow());
380 getParameter(req, Integer.class, "ordinal").ifPresent(component::setOrdinal);
381 getParameter(req, Integer.class, "lead").map(
382 userid -> userid >= 0 ? new User(userid) : null
383 ).ifPresent(component::setLead);
384 getParameter(req, String.class, "description").ifPresent(component::setDescription);
386 dao.getComponentDao().saveOrUpdate(component, project);
388 setRedirectLocation(req, "./projects/" + project.getId() + "/components/");
389 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL);
390 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) {
391 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
392 // TODO: implement - fix issue #21
393 return ResponseType.NONE;
394 }
396 return ResponseType.HTML;
397 }
399 private void configureIssueEditor(IssueEditView viewModel, Issue issue, DataAccessObjects dao) throws SQLException {
400 final var project = viewModel.getProjectInfo().getProject();
401 issue.setProject(project);
402 viewModel.setIssue(issue);
403 viewModel.configureVersionSelectors(viewModel.getProjectInfo().getVersions());
404 viewModel.setUsers(dao.getUserDao().list());
405 viewModel.setComponents(dao.getComponentDao().list(project));
406 if (issue.getId() >= 0) {
407 viewModel.setComments(dao.getIssueDao().listComments(issue));
408 }
409 }
411 @RequestMapping(requestPath = "$project/issues/$issue/edit", method = HttpMethod.GET)
412 public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException {
413 final var viewModel = new IssueEditView();
414 populate(viewModel, pathParameters, dao);
416 final var projectInfo = viewModel.getProjectInfo();
417 if (projectInfo == null) {
418 resp.sendError(HttpServletResponse.SC_NOT_FOUND);
419 return ResponseType.NONE;
420 }
422 final var issueDao = dao.getIssueDao();
423 final var issue = issueDao.find(Functions.parseIntOrZero(pathParameters.get("issue")));
424 if (issue == null) {
425 resp.sendError(HttpServletResponse.SC_NOT_FOUND);
426 return ResponseType.NONE;
427 }
429 issueDao.joinVersionInformation(issue);
430 configureIssueEditor(viewModel, issue, dao);
432 return forwardView(req, viewModel, "issue-form");
433 }
435 @RequestMapping(requestPath = "$project/create-issue", method = HttpMethod.GET)
436 public ResponseType createIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException {
437 final var viewModel = new IssueEditView();
438 populate(viewModel, pathParameters, dao);
440 final var projectInfo = viewModel.getProjectInfo();
441 if (projectInfo == null) {
442 resp.sendError(HttpServletResponse.SC_NOT_FOUND);
443 return ResponseType.NONE;
444 }
446 final var issue = new Issue(-1);
447 issue.setProject(projectInfo.getProject());
448 configureIssueEditor(viewModel, issue, dao);
450 return forwardView(req, viewModel, "issue-form");
451 }
453 @RequestMapping(requestPath = "commit-issue", method = HttpMethod.POST)
454 public ResponseType commitIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws IOException {
455 try {
456 final var issue = new Issue(getParameter(req, Integer.class, "id").orElseThrow());
457 final var componentId = getParameter(req, Integer.class, "component");
458 final Component component;
459 if (componentId.isPresent()) {
460 component = dao.getComponentDao().find(componentId.get());
461 } else {
462 component = null;
463 }
464 issue.setProject(new Project(getParameter(req, Integer.class, "pid").orElseThrow()));
465 getParameter(req, String.class, "category").map(IssueCategory::valueOf).ifPresent(issue::setCategory);
466 getParameter(req, String.class, "status").map(IssueStatus::valueOf).ifPresent(issue::setStatus);
467 issue.setSubject(getParameter(req, String.class, "subject").orElseThrow());
468 issue.setComponent(component);
469 getParameter(req, Integer.class, "assignee").map(userid -> {
470 if (userid >= 0) {
471 return new User(userid);
472 } else if (userid == -2) {
473 return Optional.ofNullable(component).map(Component::getLead).orElse(null);
474 } else {
475 return null;
476 }
477 }
478 ).ifPresent(issue::setAssignee);
479 getParameter(req, String.class, "description").ifPresent(issue::setDescription);
480 getParameter(req, Date.class, "eta").ifPresent(issue::setEta);
482 getParameter(req, Integer[].class, "affected")
483 .map(Stream::of)
484 .map(stream ->
485 stream.map(Version::new).collect(Collectors.toList())
486 ).ifPresent(issue::setAffectedVersions);
487 getParameter(req, Integer[].class, "resolved")
488 .map(Stream::of)
489 .map(stream ->
490 stream.map(Version::new).collect(Collectors.toList())
491 ).ifPresent(issue::setResolvedVersions);
493 dao.getIssueDao().saveOrUpdate(issue, issue.getProject());
495 // TODO: fix issue #14
496 setRedirectLocation(req, "./projects/" + issue.getProject().getId() + "/all-components/all-versions/issues/");
497 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL);
499 return ResponseType.HTML;
500 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) {
501 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
502 // TODO: implement - fix issue #21
503 return ResponseType.NONE;
504 }
505 }
507 @RequestMapping(requestPath = "commit-issue-comment", method = HttpMethod.POST)
508 public ResponseType commentIssue(HttpServletRequest req, HttpServletResponse resp, DataAccessObjects dao) throws SQLException, IOException {
509 final var issueIdParam = getParameter(req, Integer.class, "issueid");
510 if (issueIdParam.isEmpty()) {
511 resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Detected manipulated form.");
512 return ResponseType.NONE;
513 }
514 final var issue = dao.getIssueDao().find(issueIdParam.get());
515 if (issue == null) {
516 resp.sendError(HttpServletResponse.SC_NOT_FOUND);
517 return ResponseType.NONE;
518 }
519 try {
520 final var issueComment = new IssueComment(getParameter(req, Integer.class, "commentid").orElse(-1), issue);
521 issueComment.setComment(getParameter(req, String.class, "comment").orElse(""));
523 if (issueComment.getComment().isBlank()) {
524 throw new IllegalArgumentException("comment.null");
525 }
527 LOG.debug("User {} is commenting on issue #{}", req.getRemoteUser(), issue.getId());
528 if (req.getRemoteUser() != null) {
529 dao.getUserDao().findByUsername(req.getRemoteUser()).ifPresent(issueComment::setAuthor);
530 }
532 dao.getIssueDao().saveComment(issueComment);
534 // TODO: fix redirect location (e.g. after fixing #24)
535 setRedirectLocation(req, "./projects/" + issue.getProject().getId()+"/issues/"+issue.getId()+"/edit");
536 setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL);
538 return ResponseType.HTML;
539 } catch (NoSuchElementException | IllegalArgumentException | SQLException ex) {
540 resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
541 // TODO: implement - fix issue #21
542 return ResponseType.NONE;
543 }
544 }
545 }