1 package com.sslexplorer.tasks.actions; 2 3 import java.util.Collection ; 4 import java.util.Locale ; 5 6 import javax.servlet.http.HttpServletRequest ; 7 import javax.servlet.http.HttpServletResponse ; 8 import javax.servlet.http.HttpSession ; 9 10 import org.apache.commons.logging.Log; 11 import org.apache.commons.logging.LogFactory; 12 import org.apache.struts.Globals; 13 import org.apache.struts.action.ActionForm; 14 import org.apache.struts.action.ActionForward; 15 import org.apache.struts.action.ActionMapping; 16 import org.apache.struts.util.MessageResources; 17 18 import com.sslexplorer.boot.ContextHolder; 19 import com.sslexplorer.boot.Util; 20 import com.sslexplorer.core.BundleActionMessage; 21 import com.sslexplorer.core.CoreRequestProcessor; 22 import com.sslexplorer.core.CoreServlet; 23 import com.sslexplorer.core.CoreUtil; 24 import com.sslexplorer.core.actions.AuthenticatedDispatchAction; 25 import com.sslexplorer.core.filters.GZIPResponseWrapper; 26 import com.sslexplorer.security.LogonControllerFactory; 27 import com.sslexplorer.security.SessionInfo; 28 import com.sslexplorer.tasks.AbstractTask; 29 import com.sslexplorer.tasks.Task; 30 import com.sslexplorer.tasks.TaskException; 31 import com.sslexplorer.tasks.TaskHttpServletRequest; 32 import com.sslexplorer.tasks.TaskHttpServletResponse; 33 import com.sslexplorer.tasks.TaskManager; 34 import com.sslexplorer.tasks.TaskProgressBar; 35 import com.sslexplorer.tasks.forms.TaskProgressForm; 36 import com.sslexplorer.util.Utils; 37 38 public class TaskProgressAction extends AuthenticatedDispatchAction { 39 40 static HttpSession SESSION_DEBUG_TEST = null; 41 42 final static Log log = LogFactory.getLog(TaskProgressAction.class); 43 44 public ActionForward update(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 45 if(response instanceof GZIPResponseWrapper) { 46 ((GZIPResponseWrapper)response).setCompress(false); 47 } 48 Task task = TaskManager.getInstance().getTask(Integer.parseInt(request.getParameter("id"))); 49 if(task == null) { 50 log.warn("Unknown task ID requested."); 51 response.sendError(HttpServletResponse.SC_BAD_REQUEST); 52 return null; 53 } 54 if(request.getSession().isNew()) { 55 log.warn("Update request must not be a new session."); 56 response.sendError(HttpServletResponse.SC_BAD_REQUEST); 57 return null; 58 } 59 if(ContextHolder.getContext().isSetupMode()) { 60 } 62 else { 63 SessionInfo sessionInfo = 64 LogonControllerFactory.getInstance().getSessionInfo(request); 65 if(sessionInfo != task.getSession()) { 66 log.warn("Not task owner."); 67 response.sendError(HttpServletResponse.SC_BAD_REQUEST); 68 return null; 69 } 70 } 71 task.waitForConfiguration(); 72 String xml = buildXML(request, task); 73 response.setContentType("text/xml"); 74 byte[] arr = xml.getBytes(request.getCharacterEncoding() == null ? "utf-8" : request.getCharacterEncoding()); 75 response.setContentLength(arr.length); 76 Util.noCache(response); 77 response.getOutputStream().write(arr); 78 79 if(task.isComplete()) { 81 TaskManager.getInstance().remove(task); 82 } 83 return null; 84 } 85 86 private String buildXML(HttpServletRequest request, Task task) { 87 StringBuffer xml = new StringBuffer (); 88 xml.append("<task>"); 89 xml.append("<taskId>"); 90 xml.append(task.hashCode()); 91 xml.append("</taskId>"); 92 xml.append("<taskComplete>"); 93 xml.append(task.isComplete()); 94 xml.append("</taskComplete>"); 95 if(task.isComplete()) { 96 String onFinish = task.getOnFinish(); 97 if(!Util.isNullOrTrimmedBlank(onFinish)) { 98 xml.append("<onFinish>"); 99 xml.append(Util.urlEncode(onFinish)); 100 xml.append("</onFinish>"); 101 } 102 } 103 xml.append("<progressBars>"); 104 Collection <TaskProgressBar> progressBars = task.getProgressBars(); 105 for(TaskProgressBar bar : progressBars) { 106 xml.append("<progressBar>"); 107 xml.append("<progressBarId>"); 108 xml.append(bar.getId()); 109 xml.append("</progressBarId>"); 110 xml.append("<progressBarMin>"); 111 xml.append(bar.getMinValue()); 112 xml.append("</progressBarMin>"); 113 xml.append("<progressBarMax>"); 114 xml.append(bar.getMaxValue()); 115 xml.append("</progressBarMax>"); 116 xml.append("<progressBarValue>"); 117 xml.append(bar.getValue()); 118 xml.append("</progressBarValue>"); 119 xml.append("<progressBarNote>"); 120 if(bar.getNote() != null) { 121 BundleActionMessage bam = bar.getNote(); 122 MessageResources mr = CoreUtil.getMessageResources(request.getSession(), bam.getBundle()); 123 Locale l = (Locale )request.getSession().getAttribute(Globals.LOCALE_KEY); 124 xml.append(Utils.htmlescape(mr.getMessage(l, bar.getNote().getKey(), 125 bam.getArg0(), bam.getArg1(), bam.getArg2(), bam.getArg3()))); 126 } 127 else { 128 xml.append("No note"); 129 } 130 xml.append("</progressBarNote>"); 131 xml.append("</progressBar>"); 132 } 133 xml.append("</progressBars>"); 134 xml.append("</task>\n"); 135 return xml.toString(); 136 } 137 138 public ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 139 String bundle = request.getParameter("bundle"); 140 if(response instanceof GZIPResponseWrapper) { 141 ((GZIPResponseWrapper)response).setCompress(false); 142 } 143 if(bundle == null) { 144 throw new Exception ("No bundle parameter"); 145 } 146 String name = request.getParameter("name"); 147 if(name == null) { 148 throw new Exception ("No name parameter"); 149 } 150 151 Task t = new WrappedServletTask(bundle, name, request, response); 152 ((TaskProgressForm)form).setTask(t); 153 TaskManager.getInstance().startTask(t, getSessionInfo(request)); 154 t.waitForConfiguration(); 155 Util.noCache(response); 156 return mapping.findForward("display"); 157 } 158 159 public int getNavigationContext(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { 160 return SessionInfo.ALL_CONTEXTS; 161 } 162 163 class WrappedServletTask extends AbstractTask { 164 private TaskHttpServletRequest req; 165 private TaskHttpServletResponse res; 166 167 WrappedServletTask(String bundle, String name, HttpServletRequest req, HttpServletResponse res) { 168 super(bundle, name); 169 this.req = new TaskHttpServletRequest(req, this); 170 this.res = new TaskHttpServletResponse(res); 171 } 172 173 public void run() throws TaskException { 174 try { 175 CoreServlet.getServlet().service(req, res); 176 String onFinish = getOnFinish(); 177 if(onFinish == null) { 178 throw new Exception ("No forward returned to go to when task is complete."); 179 } 180 if(onFinish.startsWith(".")) { 181 throw new Exception ("Forward returned to go to when task is complete is a tile (" + onFinish + "), this is not allowed. The forward must point an absolute or relative URL."); 182 } 183 } catch(Exception e) { 184 throw new TaskException(TaskException.INTERNAL_ERROR, e); 185 } 186 } 187 188 public String getOnFinish() { 189 ActionForward fwd = (ActionForward)req.getAttribute(TaskHttpServletRequest.ATTR_TASK_FORWARD); 190 return fwd == null ? null : fwd.getPath(); 191 } 192 } 193 } 194 | Popular Tags |