public ActionForward update(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
if(response instanceof GZIPResponseWrapper) {
((GZIPResponseWrapper)response).setCompress(false);
}
Task task = TaskManager.getInstance().getTask(Integer.parseInt(request.getParameter("id")));
if(task == null) {
log.warn("Unknown task ID requested.");
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return null;
}
if(request.getSession().isNew()) {
log.warn("Update request must not be a new session.");
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return null;
}
if(ContextHolder.getContext().isSetupMode()) {
// No need to check session
}
else {
SessionInfo sessionInfo =
LogonControllerFactory.getInstance().getSessionInfo(request);
if(sessionInfo != task.getSession()) {
log.warn("Not task owner.");
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return null;
}
}
task.waitForConfiguration();
String xml = buildXML(request, task);
response.setContentType("text/xml");
byte[] arr = xml.getBytes(request.getCharacterEncoding() == null ? "utf-8" : request.getCharacterEncoding());
response.setContentLength(arr.length);
Util.noCache(response);
response.getOutputStream().write(arr);
// Only remove the task when client knows it has completed
if(task.isComplete()) {
TaskManager.getInstance().remove(task);
}
return null;
}