1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portlet.documentlibrary.action;
16  
17  import com.liferay.documentlibrary.DuplicateFileException;
18  import com.liferay.documentlibrary.FileNameException;
19  import com.liferay.documentlibrary.FileSizeException;
20  import com.liferay.documentlibrary.SourceFileNameException;
21  import com.liferay.portal.DuplicateLockException;
22  import com.liferay.portal.kernel.servlet.SessionErrors;
23  import com.liferay.portal.kernel.upload.UploadPortletRequest;
24  import com.liferay.portal.kernel.util.Constants;
25  import com.liferay.portal.kernel.util.ParamUtil;
26  import com.liferay.portal.kernel.util.PropertiesParamUtil;
27  import com.liferay.portal.kernel.util.UnicodeProperties;
28  import com.liferay.portal.kernel.util.Validator;
29  import com.liferay.portal.security.auth.PrincipalException;
30  import com.liferay.portal.service.ServiceContext;
31  import com.liferay.portal.service.ServiceContextFactory;
32  import com.liferay.portal.struts.PortletAction;
33  import com.liferay.portal.theme.ThemeDisplay;
34  import com.liferay.portal.util.PortalUtil;
35  import com.liferay.portal.util.WebKeys;
36  import com.liferay.portlet.asset.AssetTagException;
37  import com.liferay.portlet.assetpublisher.util.AssetPublisherUtil;
38  import com.liferay.portlet.documentlibrary.DuplicateFolderNameException;
39  import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
40  import com.liferay.portlet.documentlibrary.NoSuchFolderException;
41  import com.liferay.portlet.documentlibrary.model.DLFileEntry;
42  import com.liferay.portlet.documentlibrary.service.DLFileEntryServiceUtil;
43  
44  import java.io.File;
45  
46  import javax.portlet.ActionRequest;
47  import javax.portlet.ActionResponse;
48  import javax.portlet.PortletConfig;
49  import javax.portlet.RenderRequest;
50  import javax.portlet.RenderResponse;
51  
52  import org.apache.struts.action.ActionForm;
53  import org.apache.struts.action.ActionForward;
54  import org.apache.struts.action.ActionMapping;
55  
56  /**
57   * <a href="EditFileEntryAction.java.html"><b><i>View Source</i></b></a>
58   *
59   * @author Brian Wing Shun Chan
60   * @author Alexander Chow
61   */
62  public class EditFileEntryAction extends PortletAction {
63  
64      public void processAction(
65              ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
66              ActionRequest actionRequest, ActionResponse actionResponse)
67          throws Exception {
68  
69          String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
70  
71          try {
72              if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
73                  updateFileEntry(actionRequest, actionResponse);
74              }
75              else if (cmd.equals(Constants.DELETE)) {
76                  deleteFileEntry(actionRequest);
77              }
78              else if (cmd.equals(Constants.LOCK)) {
79                  lockFileEntry(actionRequest);
80              }
81              else if (cmd.equals(Constants.MOVE)) {
82                  moveFileEntry(actionRequest);
83              }
84              else if (cmd.equals(Constants.UNLOCK)) {
85                  unlockFileEntry(actionRequest);
86              }
87  
88              sendRedirect(actionRequest, actionResponse);
89          }
90          catch (Exception e) {
91              if (e instanceof DuplicateLockException ||
92                  e instanceof NoSuchFileEntryException ||
93                  e instanceof PrincipalException) {
94  
95                  if (e instanceof DuplicateLockException) {
96                      DuplicateLockException dle = (DuplicateLockException)e;
97  
98                      SessionErrors.add(
99                          actionRequest, dle.getClass().getName(), dle.getLock());
100                 }
101                 else {
102                     SessionErrors.add(actionRequest, e.getClass().getName());
103                 }
104 
105                 setForward(actionRequest, "portlet.document_library.error");
106             }
107             else if (e instanceof DuplicateFileException ||
108                      e instanceof DuplicateFolderNameException ||
109                      e instanceof FileNameException ||
110                      e instanceof FileSizeException ||
111                      e instanceof NoSuchFolderException ||
112                      e instanceof SourceFileNameException) {
113 
114                 SessionErrors.add(actionRequest, e.getClass().getName());
115             }
116             else if (e instanceof AssetTagException) {
117                 SessionErrors.add(actionRequest, e.getClass().getName(), e);
118             }
119             else {
120                 throw e;
121             }
122         }
123     }
124 
125     public ActionForward render(
126             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
127             RenderRequest renderRequest, RenderResponse renderResponse)
128         throws Exception {
129 
130         try {
131             ActionUtil.getFileEntry(renderRequest);
132         }
133         catch (Exception e) {
134             if (e instanceof NoSuchFileEntryException ||
135                 e instanceof PrincipalException) {
136 
137                 SessionErrors.add(renderRequest, e.getClass().getName());
138 
139                 return mapping.findForward("portlet.document_library.error");
140             }
141             else {
142                 throw e;
143             }
144         }
145 
146         String forward = "portlet.document_library.edit_file_entry";
147 
148         return mapping.findForward(getForward(renderRequest, forward));
149     }
150 
151     protected void deleteFileEntry(ActionRequest actionRequest)
152         throws Exception {
153 
154         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
155             WebKeys.THEME_DISPLAY);
156 
157         long groupId = themeDisplay.getScopeGroupId();
158         long folderId = ParamUtil.getLong(actionRequest, "folderId");
159         String name = ParamUtil.getString(actionRequest, "name");
160         String version = ParamUtil.getString(actionRequest, "version");
161 
162         DLFileEntryServiceUtil.deleteFileEntry(
163             groupId, folderId, name, version);
164     }
165 
166     protected void lockFileEntry(ActionRequest actionRequest) throws Exception {
167         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
168             WebKeys.THEME_DISPLAY);
169 
170         long groupId = themeDisplay.getScopeGroupId();
171         long folderId = ParamUtil.getLong(actionRequest, "folderId");
172         String name = ParamUtil.getString(actionRequest, "name");
173 
174         DLFileEntryServiceUtil.lockFileEntry(groupId, folderId, name);
175     }
176 
177     protected void moveFileEntry(ActionRequest actionRequest) throws Exception {
178         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
179             WebKeys.THEME_DISPLAY);
180 
181         long groupId = themeDisplay.getScopeGroupId();
182         long folderId = ParamUtil.getLong(actionRequest, "folderId");
183         long newFolderId = ParamUtil.getLong(actionRequest, "newFolderId");
184         String name = ParamUtil.getString(actionRequest, "name");
185 
186         ServiceContext serviceContext = ServiceContextFactory.getInstance(
187             DLFileEntry.class.getName(), actionRequest);
188 
189         DLFileEntry fileEntry = DLFileEntryServiceUtil.getFileEntry(
190             groupId, folderId, name);
191 
192         DLFileEntryServiceUtil.updateFileEntry(
193             groupId, folderId, newFolderId, name, null, fileEntry.getTitle(),
194             fileEntry.getDescription(), null, false,
195             fileEntry.getExtraSettings(), (File)null, serviceContext);
196     }
197 
198     protected void unlockFileEntry(ActionRequest actionRequest)
199         throws Exception {
200 
201         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
202             WebKeys.THEME_DISPLAY);
203 
204         long groupId = themeDisplay.getScopeGroupId();
205         long folderId = ParamUtil.getLong(actionRequest, "folderId");
206         String name = ParamUtil.getString(actionRequest, "name");
207 
208         DLFileEntryServiceUtil.unlockFileEntry(groupId, folderId, name);
209     }
210 
211     protected void updateFileEntry(
212             ActionRequest actionRequest, ActionResponse actionResponse)
213         throws Exception {
214 
215         UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
216             actionRequest);
217 
218         String cmd = ParamUtil.getString(uploadRequest, Constants.CMD);
219 
220         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
221             WebKeys.THEME_DISPLAY);
222 
223         long groupId = themeDisplay.getScopeGroupId();
224         long folderId = ParamUtil.getLong(uploadRequest, "folderId");
225         long newFolderId = ParamUtil.getLong(uploadRequest, "newFolderId");
226         String name = ParamUtil.getString(uploadRequest, "name");
227         String sourceFileName = uploadRequest.getFileName("file");
228 
229         String title = ParamUtil.getString(uploadRequest, "title");
230         String description = ParamUtil.getString(uploadRequest, "description");
231         String versionDescription = ParamUtil.getString(
232             uploadRequest, "versionDescription");
233         boolean majorVersion = ParamUtil.getBoolean(
234             uploadRequest, "majorVersion");
235 
236         UnicodeProperties extraSettingsProperties =
237             PropertiesParamUtil.getProperties(
238                 actionRequest, "extraSettingsProperties(");
239 
240         String extraSettings = extraSettingsProperties.toString();
241 
242         File file = uploadRequest.getFile("file");
243 
244         if (Validator.isNotNull(sourceFileName) && !file.exists()) {
245             file.createNewFile();
246         }
247 
248         ServiceContext serviceContext = ServiceContextFactory.getInstance(
249             DLFileEntry.class.getName(), actionRequest);
250 
251         if (cmd.equals(Constants.ADD)) {
252 
253             // Add file entry
254 
255             DLFileEntry fileEntry = DLFileEntryServiceUtil.addFileEntry(
256                 groupId, newFolderId, sourceFileName, title, description,
257                 versionDescription, extraSettings, file, serviceContext);
258 
259             AssetPublisherUtil.addAndStoreSelection(
260                 actionRequest, DLFileEntry.class.getName(),
261                 fileEntry.getFileEntryId(), -1);
262         }
263         else {
264 
265             // Update file entry
266 
267             DLFileEntryServiceUtil.updateFileEntry(
268                 groupId, folderId, newFolderId, name, sourceFileName, title,
269                 description, versionDescription, majorVersion, extraSettings,
270                 file, serviceContext);
271         }
272 
273         AssetPublisherUtil.addRecentFolderId(
274             actionRequest, DLFileEntry.class.getName(), folderId);
275     }
276 
277 }