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.kernel.workflow.StatusConstants;
30  import com.liferay.portal.security.auth.PrincipalException;
31  import com.liferay.portal.service.ServiceContext;
32  import com.liferay.portal.service.ServiceContextFactory;
33  import com.liferay.portal.service.WorkflowDefinitionLinkLocalServiceUtil;
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(
128                             actionResponse);
129 
130                     response.setStatus(
131                         HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
132                 }
133 
134                 SessionErrors.add(actionRequest, e.getClass().getName());
135             }
136             else if (e instanceof AssetTagException) {
137                 SessionErrors.add(actionRequest, e.getClass().getName(), e);
138             }
139             else {
140                 throw e;
141             }
142         }
143     }
144 
145     public ActionForward render(
146             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
147             RenderRequest renderRequest, RenderResponse renderResponse)
148         throws Exception {
149 
150         try {
151             ActionUtil.getFileEntry(renderRequest);
152         }
153         catch (Exception e) {
154             if (e instanceof NoSuchFileEntryException ||
155                 e instanceof PrincipalException) {
156 
157                 SessionErrors.add(renderRequest, e.getClass().getName());
158 
159                 return mapping.findForward("portlet.document_library.error");
160             }
161             else {
162                 throw e;
163             }
164         }
165 
166         String forward = "portlet.document_library.edit_file_entry";
167 
168         return mapping.findForward(getForward(renderRequest, forward));
169     }
170 
171     protected void deleteFileEntry(ActionRequest actionRequest)
172         throws Exception {
173 
174         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
175             WebKeys.THEME_DISPLAY);
176 
177         long groupId = themeDisplay.getScopeGroupId();
178         long folderId = ParamUtil.getLong(actionRequest, "folderId");
179         String name = ParamUtil.getString(actionRequest, "name");
180         String version = ParamUtil.getString(actionRequest, "version");
181 
182         DLFileEntryServiceUtil.deleteFileEntry(
183             groupId, folderId, name, version);
184     }
185 
186     protected void lockFileEntry(ActionRequest actionRequest) throws Exception {
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 
194         DLFileEntryServiceUtil.lockFileEntry(groupId, folderId, name);
195     }
196 
197     protected void moveFileEntry(ActionRequest actionRequest) throws Exception {
198         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
199             WebKeys.THEME_DISPLAY);
200 
201         long groupId = themeDisplay.getScopeGroupId();
202         long folderId = ParamUtil.getLong(actionRequest, "folderId");
203         long newFolderId = ParamUtil.getLong(actionRequest, "newFolderId");
204         String name = ParamUtil.getString(actionRequest, "name");
205 
206         ServiceContext serviceContext = ServiceContextFactory.getInstance(
207             DLFileEntry.class.getName(), actionRequest);
208 
209         DLFileEntry fileEntry = DLFileEntryServiceUtil.getFileEntry(
210             groupId, folderId, name);
211 
212         DLFileEntryServiceUtil.updateFileEntry(
213             groupId, folderId, newFolderId, name, null, fileEntry.getTitle(),
214             fileEntry.getDescription(), null, false,
215             fileEntry.getExtraSettings(), (File)null, serviceContext);
216     }
217 
218     protected void revertFileEntry(ActionRequest actionRequest)
219         throws Exception {
220 
221         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
222             WebKeys.THEME_DISPLAY);
223 
224         long groupId = themeDisplay.getScopeGroupId();
225         long folderId = ParamUtil.getLong(actionRequest, "folderId");
226         String name = ParamUtil.getString(actionRequest, "name");
227 
228         DLFileVersion fileVersion =
229             DLFileVersionLocalServiceUtil.getLatestFileVersion(
230                 groupId, folderId, name);
231 
232         if (fileVersion.getStatus() != StatusConstants.DRAFT) {
233             return;
234         }
235 
236         DLFileEntryServiceUtil.deleteFileEntry(
237             groupId, folderId, name, fileVersion.getVersion());
238     }
239 
240     protected void unlockFileEntry(ActionRequest actionRequest)
241         throws Exception {
242 
243         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
244             WebKeys.THEME_DISPLAY);
245 
246         long groupId = themeDisplay.getScopeGroupId();
247         long folderId = ParamUtil.getLong(actionRequest, "folderId");
248         String name = ParamUtil.getString(actionRequest, "name");
249 
250         DLFileEntryServiceUtil.unlockFileEntry(groupId, folderId, name);
251     }
252 
253     protected void updateFileEntry(
254             ActionRequest actionRequest, ActionResponse actionResponse)
255         throws Exception {
256 
257         UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
258             actionRequest);
259 
260         String cmd = ParamUtil.getString(uploadRequest, Constants.CMD);
261 
262         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
263             WebKeys.THEME_DISPLAY);
264 
265         long groupId = themeDisplay.getScopeGroupId();
266         long folderId = ParamUtil.getLong(uploadRequest, "folderId");
267         long newFolderId = ParamUtil.getLong(uploadRequest, "newFolderId");
268         String name = ParamUtil.getString(uploadRequest, "name");
269         String sourceFileName = uploadRequest.getFileName("file");
270 
271         String title = ParamUtil.getString(uploadRequest, "title");
272         String description = ParamUtil.getString(uploadRequest, "description");
273         String versionDescription = ParamUtil.getString(
274             uploadRequest, "versionDescription");
275         boolean majorVersion = ParamUtil.getBoolean(
276             uploadRequest, "majorVersion");
277 
278         UnicodeProperties extraSettingsProperties =
279             PropertiesParamUtil.getProperties(
280                 actionRequest, "extraSettingsProperties(");
281 
282         String extraSettings = extraSettingsProperties.toString();
283 
284         File file = uploadRequest.getFile("file");
285 
286         if (Validator.isNotNull(sourceFileName) && !file.exists()) {
287             file.createNewFile();
288         }
289 
290         ServiceContext serviceContext = ServiceContextFactory.getInstance(
291             DLFileEntry.class.getName(), actionRequest);
292 
293         if (cmd.equals(Constants.ADD)) {
294 
295             // Add file entry
296 
297             if (WorkflowDefinitionLinkLocalServiceUtil.
298                     hasWorkflowDefinitionLink(
299                         themeDisplay.getCompanyId(), groupId,
300                         DLFileEntry.class.getName())) {
301 
302                 serviceContext.setStatus(StatusConstants.DRAFT);
303             }
304 
305             DLFileEntry fileEntry = DLFileEntryServiceUtil.addFileEntry(
306                 groupId, newFolderId, sourceFileName, title, description,
307                 versionDescription, extraSettings, file, serviceContext);
308 
309             AssetPublisherUtil.addAndStoreSelection(
310                 actionRequest, DLFileEntry.class.getName(),
311                 fileEntry.getFileEntryId(), -1);
312         }
313         else {
314 
315             // Update file entry
316 
317             DLFileEntry fileEntry = DLFileEntryLocalServiceUtil.getFileEntry(
318                 groupId, folderId, name);
319 
320             if (WorkflowInstanceLinkLocalServiceUtil.hasWorkflowInstanceLink(
321                     themeDisplay.getCompanyId(), groupId,
322                     DLFileEntry.class.getName(), fileEntry.getFileEntryId())) {
323 
324                 serviceContext.setStatus(StatusConstants.DRAFT);
325             }
326 
327             DLFileEntryServiceUtil.updateFileEntry(
328                 groupId, folderId, newFolderId, name, sourceFileName, title,
329                 description, versionDescription, majorVersion, extraSettings,
330                 file, serviceContext);
331         }
332 
333         AssetPublisherUtil.addRecentFolderId(
334             actionRequest, DLFileEntry.class.getName(), folderId);
335     }
336 
337 }