KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > sslexplorer > tasks > actions > TaskProgressAction


1 package com.sslexplorer.tasks.actions;
2
3 import java.util.Collection JavaDoc;
4 import java.util.Locale JavaDoc;
5
6 import javax.servlet.http.HttpServletRequest JavaDoc;
7 import javax.servlet.http.HttpServletResponse JavaDoc;
8 import javax.servlet.http.HttpSession JavaDoc;
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 JavaDoc SESSION_DEBUG_TEST = null;
41     
42     final static Log log = LogFactory.getLog(TaskProgressAction.class);
43
44     public ActionForward update(ActionMapping mapping, ActionForm form, HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response) throws Exception JavaDoc {
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             // No need to check session
61
}
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 JavaDoc 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         // Only remove the task when client knows it has completed
80
if(task.isComplete()) {
81             TaskManager.getInstance().remove(task);
82         }
83         return null;
84     }
85
86     private String JavaDoc buildXML(HttpServletRequest JavaDoc request, Task task) {
87         StringBuffer JavaDoc xml = new StringBuffer JavaDoc();
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 JavaDoc 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 JavaDoc<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 JavaDoc l = (Locale JavaDoc)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 JavaDoc request, HttpServletResponse JavaDoc response) throws Exception JavaDoc {
139         String JavaDoc bundle = request.getParameter("bundle");
140         if(response instanceof GZIPResponseWrapper) {
141             ((GZIPResponseWrapper)response).setCompress(false);
142         }
143         if(bundle == null) {
144             throw new Exception JavaDoc("No bundle parameter");
145         }
146         String JavaDoc name = request.getParameter("name");
147         if(name == null) {
148             throw new Exception JavaDoc("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 JavaDoc request, HttpServletResponse JavaDoc 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 JavaDoc bundle, String JavaDoc name, HttpServletRequest JavaDoc req, HttpServletResponse JavaDoc 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 JavaDoc onFinish = getOnFinish();
177                 if(onFinish == null) {
178                     throw new Exception JavaDoc("No forward returned to go to when task is complete.");
179                 }
180                 if(onFinish.startsWith(".")) {
181                     throw new Exception JavaDoc("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 JavaDoc e) {
184                 throw new TaskException(TaskException.INTERNAL_ERROR, e);
185             }
186         }
187
188         public String JavaDoc getOnFinish() {
189             ActionForward fwd = (ActionForward)req.getAttribute(TaskHttpServletRequest.ATTR_TASK_FORWARD);
190             return fwd == null ? null : fwd.getPath();
191         }
192     }
193 }
194
Popular Tags