KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > dotmarketing > portlets > files > action > UploadMultipleFilesAction


1 package com.dotmarketing.portlets.files.action;
2
3 import java.io.IOException JavaDoc;
4 import java.net.URLDecoder JavaDoc;
5 import java.util.Date JavaDoc;
6 import java.util.Iterator JavaDoc;
7 import java.util.List JavaDoc;
8
9 import javax.portlet.ActionRequest;
10 import javax.portlet.ActionResponse;
11 import javax.portlet.PortletConfig;
12 import javax.servlet.http.HttpServletRequest JavaDoc;
13
14 import org.apache.struts.action.ActionForm;
15 import org.apache.struts.action.ActionMapping;
16
17 import com.dotmarketing.beans.Host;
18 import com.dotmarketing.beans.Identifier;
19 import com.dotmarketing.beans.Permission;
20 import com.dotmarketing.cache.PermissionCache;
21 import com.dotmarketing.cache.WorkingCache;
22 import com.dotmarketing.db.DotHibernate;
23 import com.dotmarketing.factories.HostFactory;
24 import com.dotmarketing.factories.IdentifierFactory;
25 import com.dotmarketing.factories.InodeFactory;
26 import com.dotmarketing.factories.PermissionFactory;
27 import com.dotmarketing.factories.PublishFactory;
28 import com.dotmarketing.factories.WebAssetFactory;
29 import com.dotmarketing.portal.struts.DotPortletAction;
30 import com.dotmarketing.portlets.files.factories.FileFactory;
31 import com.dotmarketing.portlets.files.model.File;
32 import com.dotmarketing.portlets.files.struts.FileForm;
33 import com.dotmarketing.portlets.folders.factories.FolderFactory;
34 import com.dotmarketing.portlets.folders.model.Folder;
35 import com.dotmarketing.util.Config;
36 import com.dotmarketing.util.Logger;
37 import com.dotmarketing.util.UtilMethods;
38 import com.dotmarketing.util.WebKeys;
39 import com.liferay.portal.model.User;
40 import com.liferay.portal.struts.ActionException;
41 import com.liferay.portal.util.Constants;
42 import com.liferay.portal.util.PortalUtil;
43 import com.liferay.portlet.ActionRequestImpl;
44 import com.liferay.util.FileUtil;
45 import com.liferay.util.ParamUtil;
46 import com.liferay.util.servlet.SessionMessages;
47 import com.liferay.util.servlet.UploadPortletRequest;
48
49 /**
50  * @author Maria
51  */

52
53 public class UploadMultipleFilesAction extends DotPortletAction {
54     
55     public void processAction(
56              ActionMapping mapping, ActionForm form, PortletConfig config,
57              ActionRequest req, ActionResponse res)
58          throws Exception JavaDoc {
59
60         String JavaDoc cmd = req.getParameter(Constants.CMD);
61         String JavaDoc referer = req.getParameter("referer");
62
63         //wraps request to get session object
64
ActionRequestImpl reqImpl = (ActionRequestImpl)req;
65         HttpServletRequest JavaDoc httpReq = reqImpl.getHttpServletRequest();
66
67         if ((referer!=null) && (referer.length()!=0)) {
68             referer = URLDecoder.decode(referer,"UTF-8");
69         }
70
71         Logger.debug(this, "UploadMultipleFilesAction cmd=" + cmd);
72
73         DotHibernate.startTransaction();
74
75         User user = _getUser(req);
76
77         try {
78             Logger.debug(this, "Calling Edit Method");
79             _editWebAsset(req, res, config, form, user);
80
81         }
82         catch (Exception JavaDoc e) {
83             
84         }
85            
86         if ((cmd != null) && cmd.equals(Constants.ADD)) {
87             try {
88                 
89                 Logger.debug(this, "Calling Save Method");
90
91                 String JavaDoc subcmd = req.getParameter("subcmd");
92
93                 _saveWebAsset(req, res, config, form, user, subcmd);
94
95                 _sendToReferral(req,res,referer);
96
97             } catch (ActionException ae) {
98                 _handleException(ae, req);
99                 if (ae.getMessage().equals("message.file_asset.error.filename.exists")) {
100                     _sendToReferral(req,res,referer);
101                 }
102                 else if (ae.getMessage().equals(WebKeys.USER_PERMISSIONS_EXCEPTION)) {
103                     SessionMessages.add(httpReq, "message", "message.insufficient.permissions.to.save");
104                     _sendToReferral(req,res,referer);
105                 }
106             }
107             
108         }
109         Logger.debug(this, "Unspecified Action");
110         DotHibernate.commitTransaction();
111         setForward(req, "portlet.ext.files.upload_multiple");
112     }
113
114     public void _editWebAsset(ActionRequest req, ActionResponse res,PortletConfig config,ActionForm form, User user)
115     throws Exception JavaDoc {
116
117         Folder parentFolder = (Folder) com.dotmarketing.factories.InodeFactory.getInode(req.getParameter("parent"), Folder.class);
118
119         //setting parent folder path and inode on the form bean
120
FileForm cf = (FileForm) form;
121         cf.setSelectedparent(parentFolder.getName());
122         cf.setParent(parentFolder.getInode());
123         cf.setSelectedparentPath(parentFolder.getPath());
124         
125         req.setAttribute("PARENT_FOLDER",parentFolder);
126
127     }
128
129     public void _saveWebAsset(ActionRequest req, ActionResponse res,PortletConfig config,ActionForm form, User user, String JavaDoc subcmd)
130         throws Exception JavaDoc {
131             
132             long maxsize = 50;
133             long maxwidth = 3000;
134             long maxheight = 3000;
135             long minheight = 10;
136             
137             //wraps request to get session object
138
ActionRequestImpl reqImpl = (ActionRequestImpl)req;
139             HttpServletRequest JavaDoc httpReq = reqImpl.getHttpServletRequest();
140
141             try {
142                 UploadPortletRequest uploadReq = PortalUtil.getUploadPortletRequest(req);
143                 
144                 String JavaDoc parent = ParamUtil.getString(req, "parent");
145                 int countFiles = ParamUtil.getInteger(req, "countFiles");
146                 
147                 //parent folder
148
Folder folder = (Folder) InodeFactory.getInode(parent, Folder.class);
149
150                 //check permissions
151
_checkUserPermissions(folder, user, Config.getIntProperty("PERMISSION_WRITE"));
152                 
153                 //gets user id from request for mod user
154
String JavaDoc userId = user.getUserId();
155                 
156
157                 String JavaDoc customMessage = "Some file does not match the filters specified by the folder: ";
158                 boolean filterError = false;
159                 for (int k=0;k<countFiles;k++) {
160     
161                     File file = new File();
162                     String JavaDoc title = ParamUtil.getString(req, "title"+k);
163                     String JavaDoc friendlyName = ParamUtil.getString(req, "friendlyName"+k);
164                     
165                     
166                     
167                     Date JavaDoc publishDate = new Date JavaDoc();
168                     String JavaDoc fileName = ParamUtil.getString(req, "fileName"+k);
169                     
170                     if(!FolderFactory.matchFilter(folder,fileName))
171                     {
172                        customMessage += fileName + ", ";
173                        filterError = true;
174                        continue;
175                     }
176                     
177                     if (fileName.length()>0) {
178                     
179                         //gets the real path to the assets directory
180
String JavaDoc webInfPath = Config.CONTEXT.getRealPath("/META-INF");
181                         
182                         javax.activation.MimetypesFileTypeMap JavaDoc mimeTypeFileTypeMap = new javax.activation.MimetypesFileTypeMap JavaDoc(webInfPath + java.io.File.separator + "mime.types");
183                         String JavaDoc mimeType = mimeTypeFileTypeMap.getContentType(fileName);
184         
185                         String JavaDoc URI = folder.getPath() + fileName;
186                     
187                         //gets file extension
188
String JavaDoc suffix = UtilMethods.getFileExtension(fileName);
189                         //sets filename for this new file
190
file.setTitle(title);
191                         file.setFileName(fileName);
192                         file.setFriendlyName(friendlyName);
193                         file.setPublishDate(publishDate);
194                         //persists the file
195
file.setModUser(userId);
196                         InodeFactory.saveInode(file);
197         
198                         //gets the real path to the assets directory
199
String JavaDoc filePath = FileFactory.getRealAssetsRootPath();
200                         new java.io.File JavaDoc(filePath).mkdir();
201                         
202                         byte[] bytes = FileUtil.getBytes(uploadReq.getFile("uploadedFile"+k));
203                         
204                         Logger.debug(this, "bytes" + bytes.length);
205         
206                         //sets bytes size from reuqest uploaded object
207
file.setSize(bytes.length-2);
208                         file.setMimeType(mimeType);
209                     
210                         //get the file Identifier
211
Host host = HostFactory.getCurrentHost(httpReq);
212                         Identifier ident = IdentifierFactory.getIdentifierByURI(URI,host);
213                     
214                         String JavaDoc message = "";
215                         
216                         //checks if another identifer with the same name exists in the same folder
217
if ((FileFactory.existsFileName(folder,fileName))) {
218                             InodeFactory.deleteInode(file);
219                             message = "The uploaded file " + fileName + " already exists in this folder";
220                             SessionMessages.add(req, "custommessage", message);
221                         }
222                         else {
223                     
224                             //creates the path where to save this file based on the inode
225
String JavaDoc fileInodePath = String.valueOf(file.getInode());
226                             if (fileInodePath.length()==1) {
227                                 fileInodePath = fileInodePath + "0";
228                             }
229                             //creates the path with inode{1} + inode{2}
230
fileInodePath = fileInodePath.substring(0,1) + java.io.File.separator + fileInodePath.substring(1,2);
231                             //creates directory for first level directory in case it doesn't exist
232
new java.io.File JavaDoc(filePath + java.io.File.separator + fileInodePath.substring(0,1)).mkdir();
233                             //creates directory for second level directory in case it doesn't exist
234
new java.io.File JavaDoc(filePath + java.io.File.separator + fileInodePath).mkdir();
235             
236                             //creates the new file as inode{1}/inode{2}/inode.file_extension
237
java.io.File JavaDoc f = new java.io.File JavaDoc(filePath + java.io.File.separator + fileInodePath + java.io.File.separator + file.getInode() + "." + suffix);
238             
239                             //gets outputstream from the file
240
java.io.FileOutputStream JavaDoc fout = new java.io.FileOutputStream JavaDoc(f);
241                             //gets buffered outputstrem to write the data in the file
242
java.io.BufferedOutputStream JavaDoc bout = new java.io.BufferedOutputStream JavaDoc(fout);
243         
244                             //writes all data from input in output
245
bout.write(bytes);
246                             //closes all streams
247
bout.flush();
248                             bout.close();
249                             //bin.close();
250

251                             Logger.debug(this, "SaveFileAction New File in =" + filePath + java.io.File.separator + fileInodePath + java.io.File.separator + file.getInode() + "." + suffix);
252                             
253         
254                             //checks if it's an image
255
if (suffix.equals("jpg") || suffix.equals("gif")) {
256             
257                                 com.dotmarketing.util.Thumbnail.resizeImage(filePath + java.io.File.separator + fileInodePath + java.io.File.separator,String.valueOf(file.getInode()),suffix);
258                             
259                                 //gets image height
260
int height = javax.imageio.ImageIO.read(f).getHeight();
261                                 file.setHeight(height);
262                                 Logger.debug(this, "File height=" + height);
263                                 //gets image width
264
int width = javax.imageio.ImageIO.read(f).getWidth();
265                                 file.setWidth(width);
266                                 Logger.debug(this, "File width=" + width);
267                                 //gets image size
268
long size = (f.length() / 1024);
269             
270                                 if (file.getMaxSize()!=0) maxsize = file.getMaxSize();
271                                 if (file.getMaxWidth()!=0) maxwidth = file.getMaxWidth();
272                                 if (file.getMaxHeight()!=0) maxheight = file.getMaxHeight();
273                                 if (file.getMinHeight()!=0) minheight = file.getMinHeight();
274                             
275                                 if (width > maxwidth) {
276                                     message = "The uploaded file " + fileName + " is too wide: " + width + "px. Maximum width allowed is: " + maxwidth + "px";
277                                     f.delete();
278                                     InodeFactory.deleteInode(file);
279                                     Logger.debug(this, "message from File Upload=" + message);
280                                     SessionMessages.add(req, "custommessage", message);
281                                 }
282                                 else if (height > maxheight) {
283                                     message = "The uploaded file " + fileName + " is too tall: " + height + "px. Maximum height allowed is: " + maxheight + "px";
284                                     f.delete();
285                                     InodeFactory.deleteInode(file);
286                                     Logger.debug(this, "message from File Upload=" + message);
287                                     SessionMessages.add(req, "custommessage", message);
288                                 }
289                                 else {
290                                     //creates a new file
291
WebAssetFactory.createAsset(file,userId,folder);
292                                 }
293                             }
294                             else {
295                                     //it's a file
296
//it saves or updates the asset
297
WebAssetFactory.createAsset(file,userId,folder);
298                             }
299                             WorkingCache.addToWorkingAssetToCache(file);
300                             
301                             //Setting the file permissions
302
_setFilePermissions (folder, file, user);
303                             
304                             if ((subcmd != null) && subcmd.equals(com.dotmarketing.util.Constants.PUBLISH)) {
305                                 PublishFactory.publishAsset(file,httpReq);
306                             }
307                         }
308                     }
309                 }
310                 if(filterError)
311                 {
312                     customMessage = customMessage.substring(0,customMessage.lastIndexOf(","));
313                     SessionMessages.add(req, "custommessage",customMessage);
314                 }
315                 SessionMessages.add(req, "message", "message.file_asset.save");
316             }
317             catch (IOException JavaDoc e) {
318                 e.printStackTrace(System.out);
319                 Logger.error(this, "\n\n\nEXCEPTION IN FILE SAVING!!!");
320                 Logger.error(this, e.getMessage());
321                 throw new ActionException(e.getMessage());
322             }
323     }
324     
325     
326     private void _setFilePermissions (Folder folder, File file, User user) {
327         
328         
329         Identifier id = IdentifierFactory.getIdentifierByInode(file);
330
331         if (id.getInode() == 0) return;
332
333         List JavaDoc perms = PermissionFactory.getPermissions(folder);
334         
335         //Adding roles
336
Iterator JavaDoc it = perms.iterator();
337         
338         while (it.hasNext()) {
339             Permission folderPerm = (Permission) it.next();
340             Permission permission = new Permission(id.getInode(), folderPerm.getRoleId(), folderPerm.getPermission());
341             PermissionFactory.savePermission(permission);
342         }
343         
344         //Update the permissions cache
345
PermissionCache.addToPermissionCache(file);
346         
347     }
348
349 }
350
Popular Tags