KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > roller > ui > authoring > struts > actions > UploadFileFormAction


1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements. The ASF licenses this file to You
4  * under the Apache License, Version 2.0 (the "License"); you may not
5  * use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License. For additional information regarding
15  * copyright in this work, please see the NOTICE file in the top level
16  * directory of this distribution.
17  */

18
19 package org.apache.roller.ui.authoring.struts.actions;
20
21 import java.io.File JavaDoc;
22 import java.io.InputStream JavaDoc;
23 import java.util.ArrayList JavaDoc;
24 import java.util.Collections JavaDoc;
25 import java.util.Comparator JavaDoc;
26 import java.util.Iterator JavaDoc;
27 import java.util.List JavaDoc;
28 import javax.servlet.ServletContext JavaDoc;
29 import javax.servlet.http.HttpServletRequest JavaDoc;
30 import javax.servlet.http.HttpServletResponse JavaDoc;
31 import org.apache.commons.logging.Log;
32 import org.apache.commons.logging.LogFactory;
33 import org.apache.struts.action.ActionError;
34 import org.apache.struts.action.ActionErrors;
35 import org.apache.struts.action.ActionForm;
36 import org.apache.struts.action.ActionForward;
37 import org.apache.struts.action.ActionMapping;
38 import org.apache.struts.action.ActionMessage;
39 import org.apache.struts.action.ActionMessages;
40 import org.apache.struts.actions.DispatchAction;
41 import org.apache.struts.upload.FormFile;
42 import org.apache.roller.RollerException;
43 import org.apache.roller.config.RollerRuntimeConfig;
44 import org.apache.roller.model.FileManager;
45 import org.apache.roller.model.PropertiesManager;
46 import org.apache.roller.model.Roller;
47 import org.apache.roller.model.RollerFactory;
48 import org.apache.roller.pojos.WebsiteData;
49 import org.apache.roller.ui.core.BasePageModel;
50 import org.apache.roller.ui.core.RollerContext;
51 import org.apache.roller.ui.core.RollerRequest;
52 import org.apache.roller.ui.core.RollerSession;
53 import org.apache.roller.ui.authoring.struts.formbeans.UploadFileForm;
54 import org.apache.roller.ui.core.RequestConstants;
55 import org.apache.roller.util.RollerMessages;
56 import org.apache.roller.util.URLUtilities;
57
58
59 /**
60  * @struts.action name="uploadFiles" path="/roller-ui/authoring/uploadFiles"
61  * parameter="method" scope="request" validate="false"
62  *
63  * @struts.action-forward name="uploadFiles.page" path=".upload-file"
64  */

65 public final class UploadFileFormAction extends DispatchAction {
66     
67     private static Log mLogger = LogFactory.getLog(UploadFileFormAction.class);
68     
69     /**
70      * Display upload file page.
71      */

72     public ActionForward unspecified(
73             ActionMapping mapping,
74             ActionForm actionForm,
75             HttpServletRequest JavaDoc request,
76             HttpServletResponse JavaDoc response)
77             throws Exception JavaDoc {
78         
79         ActionForward fwd = mapping.findForward("access-denied");
80         RollerSession rses = RollerSession.getRollerSession(request);
81         WebsiteData website = getWebsite(request);
82         
83         if (rses.isUserAuthorizedToAuthor(website)) {
84             UploadFilePageModel pageModel = new UploadFilePageModel(
85                     request, response, mapping, website);
86             pageModel.setWebsite(website);
87             request.setAttribute("model", pageModel);
88             fwd = mapping.findForward("uploadFiles.page");
89         }
90         return fwd;
91     }
92     
93     
94     /**
95      * Request to upload files
96      */

97     public ActionForward upload(
98             ActionMapping mapping,
99             ActionForm actionForm,
100             HttpServletRequest JavaDoc request,
101             HttpServletResponse JavaDoc response)
102             throws Exception JavaDoc {
103         
104         ActionForward fwd = mapping.findForward("access-denied");
105         WebsiteData website = getWebsite(request);
106         RollerMessages rollerMessages = new RollerMessages();
107         RollerSession rses = RollerSession.getRollerSession(request);
108         List JavaDoc lastUploads = new ArrayList JavaDoc();
109         
110         if ( rses.isUserAuthorizedToAuthor(website)) {
111             
112             FileManager fmgr = RollerFactory.getRoller().getFileManager();
113             fwd = mapping.findForward("uploadFiles.page");
114             ActionMessages messages = new ActionMessages();
115             ActionErrors errors = new ActionErrors();
116             UploadFileForm theForm = (UploadFileForm)actionForm;
117             if (theForm.getUploadedFiles().length > 0) {
118                 ServletContext JavaDoc app = servlet.getServletConfig().getServletContext();
119                 
120                 boolean uploadEnabled =
121                         RollerRuntimeConfig.getBooleanProperty("uploads.enabled");
122                 
123                 if ( !uploadEnabled ) {
124                     errors.add(ActionErrors.GLOBAL_ERROR,
125                             new ActionError("error.upload.disabled", ""));
126                     saveErrors(request, errors);
127                     return fwd;
128                 }
129                 
130                 //this line is here for when the input page is upload-utf8.jsp,
131
//it sets the correct character encoding for the response
132
String JavaDoc encoding = request.getCharacterEncoding();
133                 if ((encoding != null) && (encoding.equalsIgnoreCase("utf-8"))) {
134                     response.setContentType("text/html; charset=utf-8");
135                 }
136                 
137                 //retrieve the file representation
138
FormFile[] files = theForm.getUploadedFiles();
139                 int fileSize = 0;
140                 try {
141                     for (int i=0; i<files.length; i++) {
142                         if (files[i] == null) continue;
143                         
144                         // retrieve the file name
145
String JavaDoc fileName= files[i].getFileName();
146                         int terminated = fileName.indexOf("\000");
147                         if (terminated != -1) {
148                             // disallow sneaky null terminated strings
149
fileName = fileName.substring(0, terminated).trim();
150                         }
151                         
152                         fileSize = files[i].getFileSize();
153                         
154                         //retrieve the file data
155
if (fmgr.canSave(website.getHandle(), fileName,
156                                 files[i].getContentType(), fileSize, rollerMessages)) {
157                             InputStream JavaDoc stream = files[i].getInputStream();
158                             fmgr.saveFile(website.getHandle(), fileName,
159                                     files[i].getContentType(), fileSize, stream);
160                             lastUploads.add(fileName);
161                         }
162                         
163                         //destroy the temporary file created
164
files[i].destroy();
165                     }
166                 } catch (Exception JavaDoc e) {
167                     errors.add(ActionErrors.GLOBAL_ERROR,
168                             new ActionError("error.upload.file",e.toString()));
169                     mLogger.error("Error saving uploaded file", e);
170                 }
171             }
172             
173             UploadFilePageModel pageModel = new UploadFilePageModel(
174                     request, response, mapping, website, lastUploads);
175             request.setAttribute("model", pageModel);
176             pageModel.setWebsite(website);
177             
178             RollerContext rctx = RollerContext.getRollerContext();
179             String JavaDoc baseURL = RollerRuntimeConfig.getAbsoluteContextURL();
180             String JavaDoc resourcesBaseURL = baseURL + fmgr.getUploadUrl() + "/" + website.getHandle();
181             Iterator JavaDoc uploads = lastUploads.iterator();
182             if (uploads.hasNext()) {
183                 messages.add(ActionMessages.GLOBAL_MESSAGE,
184                         new ActionMessage("uploadFiles.uploadedFiles"));
185             }
186             while (uploads.hasNext()) {
187                 messages.add(ActionMessages.GLOBAL_MESSAGE,
188                         new ActionMessage("uploadFiles.uploadedFile",
189                         URLUtilities.getWeblogResourceURL(website, (String JavaDoc)uploads.next(), true)));
190             }
191             saveMessages(request, messages);
192             
193             Iterator JavaDoc iter = rollerMessages.getErrors();
194             while (iter.hasNext()) {
195                 RollerMessages.RollerMessage error =
196                         (RollerMessages.RollerMessage)iter.next();
197                 errors.add(ActionErrors.GLOBAL_ERROR,
198                         new ActionError(error.getKey(), error.getArgs()));
199             }
200             saveErrors(request, errors);
201         }
202         return fwd;
203     }
204     
205     
206     /**
207      * Request to delete files
208      */

209     public ActionForward delete(
210             ActionMapping mapping,
211             ActionForm actionForm,
212             HttpServletRequest JavaDoc request,
213             HttpServletResponse JavaDoc response)
214             throws Exception JavaDoc {
215         
216         ActionMessages messages = new ActionMessages();
217         ActionErrors errors = new ActionErrors();
218         UploadFileForm theForm = (UploadFileForm)actionForm;
219         ActionForward fwd = mapping.findForward("access-denied");
220         WebsiteData website = getWebsite(request);
221         
222         int count = 0;
223         RollerSession rses = RollerSession.getRollerSession(request);
224         if (rses.isUserAuthorizedToAuthor(website)) {
225             fwd = mapping.findForward("uploadFiles.page");
226             try {
227                 FileManager fmgr = RollerFactory.getRoller().getFileManager();
228                 String JavaDoc[] deleteFiles = theForm.getDeleteFiles();
229                 for (int i=0; i<deleteFiles.length; i++) {
230                     if ( deleteFiles[i].trim().startsWith("/")
231                     || deleteFiles[i].trim().startsWith("\\")
232                     || deleteFiles[i].indexOf("..") != -1) {
233                         // ignore absolute paths, or paths that contiain '..'
234
} else {
235                         fmgr.deleteFile(website.getHandle(), deleteFiles[i]);
236                         count++;
237                     }
238                 }
239             } catch (Exception JavaDoc e) {
240                 errors.add(ActionErrors.GLOBAL_ERROR,
241                         new ActionError("error.upload.file",e.toString()));
242                 saveErrors(request,errors);
243             }
244             
245             messages.add(ActionMessages.GLOBAL_MESSAGE,
246                     new ActionMessage("uploadFiles.deletedFiles", new Integer JavaDoc(count)));
247             saveMessages(request, messages);
248             
249             UploadFilePageModel pageModel = new UploadFilePageModel(
250                     request, response, mapping, website);
251             pageModel.setWebsite(website);
252             request.setAttribute("model", pageModel);
253         }
254         return fwd;
255     }
256     
257     
258     /**
259      * Other actions can get the website handle from request params, but
260      * request params don't come accross in a file-upload post so we have to
261      * stash the website handle in the session.
262      */

263     public static WebsiteData getWebsite(HttpServletRequest JavaDoc request) throws RollerException {
264         RollerRequest rreq = RollerRequest.getRollerRequest(request);
265         WebsiteData website = rreq.getWebsite();
266         if (website != null) {
267             request.getSession().setAttribute(RequestConstants.WEBLOG_SESSION_STASH, website.getHandle());
268         } else {
269             String JavaDoc handle = (String JavaDoc)request.getSession().getAttribute(RequestConstants.WEBLOG_SESSION_STASH);
270             Roller roller = RollerFactory.getRoller();
271             website = roller.getUserManager().getWebsiteByHandle(handle);
272         }
273         return website;
274     }
275     
276     
277     /** All information we'll need on the UploadFile page */
278     public class UploadFilePageModel extends BasePageModel {
279         private String JavaDoc resourcesBaseURL = null;
280         private boolean uploadEnabled = true;
281         private boolean overQuota = false;
282         private String JavaDoc maxDirMB = null; // in megabytes
283
private String JavaDoc maxFileMB = null; // in megabytes
284
private List JavaDoc files = null;
285         private long totalSize = 0;
286         private List JavaDoc lastUploads = null;
287         
288         public UploadFilePageModel(
289                 HttpServletRequest JavaDoc req,
290                 HttpServletResponse JavaDoc res,
291                 ActionMapping mapping,
292                 WebsiteData weblog) throws RollerException {
293             this(req, res, mapping, weblog, null);
294         }
295         
296         public UploadFilePageModel(
297                 HttpServletRequest JavaDoc req,
298                 HttpServletResponse JavaDoc res,
299                 ActionMapping mapping,
300                 WebsiteData weblog,
301                 List JavaDoc lastUploads) throws RollerException {
302             
303             super("uploadFiles.title", req, res, mapping);
304             
305             Roller roller = RollerFactory.getRoller();
306             PropertiesManager pmgr = roller.getPropertiesManager();
307             FileManager fmgr = roller.getFileManager();
308             
309             String JavaDoc dir = fmgr.getUploadDir();
310             resourcesBaseURL = URLUtilities.getWeblogResourceURL(weblog, "", false);
311             
312             RollerRequest rreq = RollerRequest.getRollerRequest(req);
313             WebsiteData website = UploadFileFormAction.getWebsite(req);
314             maxDirMB = RollerRuntimeConfig.getProperty("uploads.dir.maxsize");
315             maxFileMB = RollerRuntimeConfig.getProperty("uploads.file.maxsize");
316             
317             overQuota = fmgr.overQuota(weblog.getHandle());
318             uploadEnabled = RollerRuntimeConfig.getBooleanProperty("uploads.enabled");
319             
320             files = new ArrayList JavaDoc();
321             File JavaDoc[] rawFiles = fmgr.getFiles(weblog.getHandle());
322             for (int i=0; i<rawFiles.length; i++) {
323                 files.add(new FileBean(rawFiles[i]));
324                 totalSize += rawFiles[i].length();
325             }
326             Collections.sort(files, new FileBeanNameComparator());
327         }
328         public boolean isUploadEnabled() {
329             return uploadEnabled;
330         }
331         public boolean isOverQuota() {
332             return overQuota;
333         }
334         public String JavaDoc getMaxDirMB() {
335             return maxDirMB;
336         }
337         public String JavaDoc getMaxFileMB() {
338             return maxFileMB;
339         }
340         public String JavaDoc getResourcesBaseURL() {
341             return resourcesBaseURL;
342         }
343         public long getTotalSize() {
344             return totalSize;
345         }
346         public List JavaDoc getFiles() {
347             return files;
348         }
349         public List JavaDoc getLastUploads() {
350             return lastUploads;
351         }
352     }
353     
354     
355     /**
356      * If java.io.File followed bean conventions we wouldn't need this. (perhaps
357      * we shouldn't be using files directly here in the presentation layer)
358      */

359     public class FileBean {
360         private File JavaDoc file;
361         public FileBean(File JavaDoc file) {
362             this.file = file;
363         }
364         public String JavaDoc getName() { return file.getName(); }
365         public long getLength() { return file.length(); }
366     }
367     
368     
369     public class FileBeanNameComparator implements Comparator JavaDoc {
370         public int compare(Object JavaDoc o1, Object JavaDoc o2) {
371             FileBean fb1 = (FileBean)o1;
372             FileBean fb2 = (FileBean)o2;
373             return fb1.getName().compareTo(fb2.getName());
374         }
375         public boolean equals(Object JavaDoc o1, Object JavaDoc o2) {
376             FileBean fb1 = (FileBean)o1;
377             FileBean fb2 = (FileBean)o2;
378             return fb1.getName().equals(fb2.getName());
379         }
380     }
381     
382 }
383
Popular Tags