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.ServletResponseConstants;
23  import com.liferay.portal.kernel.servlet.SessionErrors;
24  import com.liferay.portal.kernel.upload.UploadPortletRequest;
25  import com.liferay.portal.kernel.util.Constants;
26  import com.liferay.portal.kernel.util.ParamUtil;
27  import com.liferay.portal.kernel.util.PropertiesParamUtil;
28  import com.liferay.portal.kernel.util.UnicodeProperties;
29  import com.liferay.portal.kernel.util.Validator;
30  import com.liferay.portal.kernel.workflow.WorkflowConstants;
31  import com.liferay.portal.security.auth.PrincipalException;
32  import com.liferay.portal.service.ServiceContext;
33  import com.liferay.portal.service.ServiceContextFactory;
34  import com.liferay.portal.service.WorkflowInstanceLinkLocalServiceUtil;
35  import com.liferay.portal.struts.PortletAction;
36  import com.liferay.portal.theme.ThemeDisplay;
37  import com.liferay.portal.util.PortalUtil;
38  import com.liferay.portal.util.WebKeys;
39  import com.liferay.portlet.asset.AssetTagException;
40  import com.liferay.portlet.assetpublisher.util.AssetPublisherUtil;
41  import com.liferay.portlet.documentlibrary.DuplicateFolderNameException;
42  import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
43  import com.liferay.portlet.documentlibrary.NoSuchFolderException;
44  import com.liferay.portlet.documentlibrary.model.DLFileEntry;
45  import com.liferay.portlet.documentlibrary.model.DLFileVersion;
46  import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
47  import com.liferay.portlet.documentlibrary.service.DLFileEntryServiceUtil;
48  import com.liferay.portlet.documentlibrary.service.DLFileVersionLocalServiceUtil;
49  
50  import java.io.File;
51  
52  import javax.portlet.ActionRequest;
53  import javax.portlet.ActionResponse;
54  import javax.portlet.PortletConfig;
55  import javax.portlet.RenderRequest;
56  import javax.portlet.RenderResponse;
57  
58  import javax.servlet.http.HttpServletResponse;
59  
60  import org.apache.struts.action.ActionForm;
61  import org.apache.struts.action.ActionForward;
62  import org.apache.struts.action.ActionMapping;
63  
64  /**
65   * <a href="EditFileEntryAction.java.html"><b><i>View Source</i></b></a>
66   *
67   * @author Brian Wing Shun Chan
68   * @author Alexander Chow
69   */
70  public class EditFileEntryAction extends PortletAction {
71  
72      public void processAction(
73              ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
74              ActionRequest actionRequest, ActionResponse actionResponse)
75          throws Exception {
76  
77          String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
78  
79          try {
80              if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
81                  updateFileEntry(actionRequest, actionResponse);
82              }
83              else if (cmd.equals(Constants.DELETE)) {
84                  deleteFileEntry(actionRequest);
85              }
86              else if (cmd.equals(Constants.LOCK)) {
87                  lockFileEntry(actionRequest);
88              }
89              else if (cmd.equals(Constants.MOVE)) {
90                  moveFileEntry(actionRequest);
91              }
92              else if (cmd.equals(Constants.REVERT)) {
93                  revertFileEntry(actionRequest);
94              }
95              else if (cmd.equals(Constants.UNLOCK)) {
96                  unlockFileEntry(actionRequest);
97              }
98  
99              sendRedirect(actionRequest, actionResponse);
100         }
101         catch (Exception e) {
102             if (e instanceof DuplicateLockException ||
103                 e instanceof NoSuchFileEntryException ||
104                 e instanceof PrincipalException) {
105 
106                 if (e instanceof DuplicateLockException) {
107                     DuplicateLockException dle = (DuplicateLockException)e;
108 
109                     SessionErrors.add(
110                         actionRequest, dle.getClass().getName(), dle.getLock());
111                 }
112                 else {
113                     SessionErrors.add(actionRequest, e.getClass().getName());
114                 }
115 
116                 setForward(actionRequest, "portlet.document_library.error");
117             }
118             else if (e instanceof DuplicateFileException ||
119                      e instanceof DuplicateFolderNameException ||
120                      e instanceof FileNameException ||
121                      e instanceof FileSizeException ||
122                      e instanceof NoSuchFolderException ||
123                      e instanceof SourceFileNameException) {
124 
125                 if (e instanceof DuplicateFileException) {
126                     HttpServletResponse response =
127                         PortalUtil.getHttpServletResponse(actionResponse);
128 
129                     response.setStatus(
130                         ServletResponseConstants.SC_DUPLICATE_FILE_EXCEPTION);
131                 }
132                 else if (e instanceof FileNameException) {
133                     HttpServletResponse response =
134                         PortalUtil.getHttpServletResponse(actionResponse);
135 
136                     response.setStatus(
137                         ServletResponseConstants.SC_FILE_NAME_EXCEPTION);
138                 }
139                 else if (e instanceof FileSizeException) {
140                     HttpServletResponse response =
141                         PortalUtil.getHttpServletResponse(actionResponse);
142 
143                     response.setStatus(
144                         ServletResponseConstants.SC_FILE_SIZE_EXCEPTION);
145                 }
146 
147                 SessionErrors.add(actionRequest, e.getClass().getName());
148             }
149             else if (e instanceof AssetTagException) {
150                 SessionErrors.add(actionRequest, e.getClass().getName(), e);
151             }
152             else {
153                 throw e;
154             }
155         }
156     }
157 
158     public ActionForward render(
159             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
160             RenderRequest renderRequest, RenderResponse renderResponse)
161         throws Exception {
162 
163         try {
164             ActionUtil.getFileEntry(renderRequest);
165         }
166         catch (Exception e) {
167             if (e instanceof NoSuchFileEntryException ||
168                 e instanceof PrincipalException) {
169 
170                 SessionErrors.add(renderRequest, e.getClass().getName());
171 
172                 return mapping.findForward("portlet.document_library.error");
173             }
174             else {
175                 throw e;
176             }
177         }
178 
179         String forward = "portlet.document_library.edit_file_entry";
180 
181         return mapping.findForward(getForward(renderRequest, forward));
182     }
183 
184     protected void deleteFileEntry(ActionRequest actionRequest)
185         throws Exception {
186 
187         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
188             WebKeys.THEME_DISPLAY);
189 
190         long groupId = themeDisplay.getScopeGroupId();
191         long folderId = ParamUtil.getLong(actionRequest, "folderId");
192         String name = ParamUtil.getString(actionRequest, "name");
193         String version = ParamUtil.getString(actionRequest, "version");
194 
195         DLFileEntryServiceUtil.deleteFileEntry(
196             groupId, folderId, name, version);
197     }
198 
199     protected void lockFileEntry(ActionRequest actionRequest) throws Exception {
200         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
201             WebKeys.THEME_DISPLAY);
202 
203         long groupId = themeDisplay.getScopeGroupId();
204         long folderId = ParamUtil.getLong(actionRequest, "folderId");
205         String name = ParamUtil.getString(actionRequest, "name");
206 
207         DLFileEntryServiceUtil.lockFileEntry(groupId, folderId, name);
208     }
209 
210     protected void moveFileEntry(ActionRequest actionRequest) throws Exception {
211         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
212             WebKeys.THEME_DISPLAY);
213 
214         long groupId = themeDisplay.getScopeGroupId();
215         long folderId = ParamUtil.getLong(actionRequest, "folderId");
216         long newFolderId = ParamUtil.getLong(actionRequest, "newFolderId");
217         String name = ParamUtil.getString(actionRequest, "name");
218 
219         ServiceContext serviceContext = ServiceContextFactory.getInstance(
220             DLFileEntry.class.getName(), actionRequest);
221 
222         DLFileEntry fileEntry = DLFileEntryServiceUtil.getFileEntry(
223             groupId, folderId, name);
224 
225         DLFileEntryServiceUtil.updateFileEntry(
226             groupId, folderId, newFolderId, name, null, fileEntry.getTitle(),
227             fileEntry.getDescription(), null, false,
228             fileEntry.getExtraSettings(), (File)null, serviceContext);
229     }
230 
231     protected void revertFileEntry(ActionRequest actionRequest)
232         throws Exception {
233 
234         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
235             WebKeys.THEME_DISPLAY);
236 
237         long groupId = themeDisplay.getScopeGroupId();
238         long folderId = ParamUtil.getLong(actionRequest, "folderId");
239         String name = ParamUtil.getString(actionRequest, "name");
240 
241         DLFileVersion fileVersion =
242             DLFileVersionLocalServiceUtil.getLatestFileVersion(
243                 groupId, folderId, name);
244 
245         if (fileVersion.getStatus() != WorkflowConstants.STATUS_DRAFT) {
246             return;
247         }
248 
249         DLFileEntryServiceUtil.deleteFileEntry(
250             groupId, folderId, name, fileVersion.getVersion());
251     }
252 
253     protected void unlockFileEntry(ActionRequest actionRequest)
254         throws Exception {
255 
256         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
257             WebKeys.THEME_DISPLAY);
258 
259         long groupId = themeDisplay.getScopeGroupId();
260         long folderId = ParamUtil.getLong(actionRequest, "folderId");
261         String name = ParamUtil.getString(actionRequest, "name");
262 
263         DLFileEntryServiceUtil.unlockFileEntry(groupId, folderId, name);
264     }
265 
266     protected void updateFileEntry(
267             ActionRequest actionRequest, ActionResponse actionResponse)
268         throws Exception {
269 
270         UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
271             actionRequest);
272 
273         String cmd = ParamUtil.getString(uploadRequest, Constants.CMD);
274 
275         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
276             WebKeys.THEME_DISPLAY);
277 
278         long groupId = themeDisplay.getScopeGroupId();
279         long folderId = ParamUtil.getLong(uploadRequest, "folderId");
280         long newFolderId = ParamUtil.getLong(uploadRequest, "newFolderId");
281         String name = ParamUtil.getString(uploadRequest, "name");
282         String sourceFileName = uploadRequest.getFileName("file");
283 
284         String title = ParamUtil.getString(uploadRequest, "title");
285         String description = ParamUtil.getString(uploadRequest, "description");
286         String versionDescription = ParamUtil.getString(
287             uploadRequest, "versionDescription");
288         boolean majorVersion = ParamUtil.getBoolean(
289             uploadRequest, "majorVersion");
290 
291         UnicodeProperties extraSettingsProperties =
292             PropertiesParamUtil.getProperties(
293                 actionRequest, "extraSettingsProperties--");
294 
295         String extraSettings = extraSettingsProperties.toString();
296 
297         File file = uploadRequest.getFile("file");
298 
299         if (Validator.isNotNull(sourceFileName) && !file.exists()) {
300             file.createNewFile();
301         }
302 
303         ServiceContext serviceContext = ServiceContextFactory.getInstance(
304             DLFileEntry.class.getName(), actionRequest);
305 
306         if (cmd.equals(Constants.ADD)) {
307 
308             // Add file entry
309 
310             DLFileEntry fileEntry = DLFileEntryServiceUtil.addFileEntry(
311                 groupId, newFolderId, sourceFileName, title, description,
312                 versionDescription, extraSettings, file, serviceContext);
313 
314             AssetPublisherUtil.addAndStoreSelection(
315                 actionRequest, DLFileEntry.class.getName(),
316                 fileEntry.getFileEntryId(), -1);
317         }
318         else {
319 
320             // Update file entry
321 
322             DLFileEntry fileEntry = DLFileEntryLocalServiceUtil.getFileEntry(
323                 groupId, folderId, name);
324 
325             if (WorkflowInstanceLinkLocalServiceUtil.hasWorkflowInstanceLink(
326                     themeDisplay.getCompanyId(), groupId,
327                     DLFileEntry.class.getName(), fileEntry.getFileEntryId())) {
328 
329                 serviceContext.setWorkflowAction(
330                     WorkflowConstants.ACTION_SAVE_DRAFT);
331             }
332 
333             DLFileEntryServiceUtil.updateFileEntry(
334                 groupId, folderId, newFolderId, name, sourceFileName, title,
335                 description, versionDescription, majorVersion, extraSettings,
336                 file, serviceContext);
337         }
338 
339         AssetPublisherUtil.addRecentFolderId(
340             actionRequest, DLFileEntry.class.getName(), folderId);
341     }
342 
343 }