1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   *
12   *
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.security.auth.PrincipalException;
31  import com.liferay.portal.service.ServiceContext;
32  import com.liferay.portal.service.ServiceContextFactory;
33  import com.liferay.portal.struts.PortletAction;
34  import com.liferay.portal.util.PortalUtil;
35  import com.liferay.portlet.assetpublisher.util.AssetPublisherUtil;
36  import com.liferay.portlet.documentlibrary.DuplicateFolderNameException;
37  import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
38  import com.liferay.portlet.documentlibrary.NoSuchFolderException;
39  import com.liferay.portlet.documentlibrary.model.DLFileEntry;
40  import com.liferay.portlet.documentlibrary.service.DLFileEntryServiceUtil;
41  import com.liferay.portlet.tags.TagsEntryException;
42  
43  import java.io.File;
44  
45  import javax.portlet.ActionRequest;
46  import javax.portlet.ActionResponse;
47  import javax.portlet.PortletConfig;
48  import javax.portlet.RenderRequest;
49  import javax.portlet.RenderResponse;
50  
51  import javax.servlet.http.HttpServletResponse;
52  
53  import org.apache.struts.action.ActionForm;
54  import org.apache.struts.action.ActionForward;
55  import org.apache.struts.action.ActionMapping;
56  
57  /**
58   * <a href="EditFileEntryAction.java.html"><b><i>View Source</i></b></a>
59   *
60   * @author Brian Wing Shun Chan
61   * @author Alexander Chow
62   */
63  public class EditFileEntryAction extends PortletAction {
64  
65      public void processAction(
66              ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
67              ActionRequest actionRequest, ActionResponse actionResponse)
68          throws Exception {
69  
70          String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
71  
72          try {
73              if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
74                  updateFileEntry(actionRequest, actionResponse);
75              }
76              else if (cmd.equals(Constants.DELETE)) {
77                  deleteFileEntry(actionRequest);
78              }
79              else if (cmd.equals(Constants.LOCK)) {
80                  lockFileEntry(actionRequest);
81              }
82              else if (cmd.equals(Constants.UNLOCK)) {
83                  unlockFileEntry(actionRequest);
84              }
85  
86              sendRedirect(actionRequest, actionResponse);
87          }
88          catch (Exception e) {
89              if (e instanceof DuplicateLockException ||
90                  e instanceof NoSuchFileEntryException ||
91                  e instanceof PrincipalException) {
92  
93                  if (e instanceof DuplicateLockException) {
94                      DuplicateLockException dle = (DuplicateLockException)e;
95  
96                      SessionErrors.add(
97                          actionRequest, dle.getClass().getName(), dle.getLock());
98                  }
99                  else {
100                     SessionErrors.add(actionRequest, e.getClass().getName());
101                 }
102 
103                 setForward(actionRequest, "portlet.document_library.error");
104             }
105             else if (e instanceof DuplicateFileException ||
106                      e instanceof DuplicateFolderNameException ||
107                      e instanceof FileNameException ||
108                      e instanceof FileSizeException ||
109                      e instanceof NoSuchFolderException ||
110                      e instanceof SourceFileNameException) {
111 
112                 if (e instanceof DuplicateFileException) {
113                     HttpServletResponse response =
114                         PortalUtil.getHttpServletResponse(actionResponse);
115 
116                     response.setStatus(
117                         ServletResponseConstants.SC_DUPLICATE_FILE_EXCEPTION);
118                 }
119                 else if (e instanceof FileNameException) {
120                     HttpServletResponse response =
121                         PortalUtil.getHttpServletResponse(actionResponse);
122 
123                     response.setStatus(
124                         ServletResponseConstants.SC_FILE_NAME_EXCEPTION);
125                 }
126                 else if (e instanceof FileSizeException) {
127                     HttpServletResponse response =
128                         PortalUtil.getHttpServletResponse(actionResponse);
129 
130                     response.setStatus(
131                         ServletResponseConstants.SC_FILE_SIZE_EXCEPTION);
132                 }
133 
134                 SessionErrors.add(actionRequest, e.getClass().getName());
135             }
136             else if (e instanceof TagsEntryException) {
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         long folderId = ParamUtil.getLong(actionRequest, "folderId");
175         String name = ParamUtil.getString(actionRequest, "name");
176         double version = ParamUtil.getDouble(actionRequest, "version");
177 
178         DLFileEntryServiceUtil.deleteFileEntry(folderId, name, version);
179     }
180 
181     protected void lockFileEntry(ActionRequest actionRequest) throws Exception {
182         long folderId = ParamUtil.getLong(actionRequest, "folderId");
183         String name = ParamUtil.getString(actionRequest, "name");
184 
185         DLFileEntryServiceUtil.lockFileEntry(folderId, name);
186     }
187 
188     protected void unlockFileEntry(ActionRequest actionRequest)
189         throws Exception {
190 
191         long folderId = ParamUtil.getLong(actionRequest, "folderId");
192         String name = ParamUtil.getString(actionRequest, "name");
193 
194         DLFileEntryServiceUtil.unlockFileEntry(folderId, name);
195     }
196 
197     protected void updateFileEntry(
198             ActionRequest actionRequest, ActionResponse actionResponse)
199         throws Exception {
200 
201         UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
202             actionRequest);
203 
204         String cmd = ParamUtil.getString(uploadRequest, Constants.CMD);
205 
206         long folderId = ParamUtil.getLong(uploadRequest, "folderId");
207         long newFolderId = ParamUtil.getLong(uploadRequest, "newFolderId");
208         String name = ParamUtil.getString(uploadRequest, "name");
209         String sourceFileName = uploadRequest.getFileName("file");
210 
211         String title = ParamUtil.getString(uploadRequest, "title");
212         String description = ParamUtil.getString(uploadRequest, "description");
213         String versionDescription = ParamUtil.getString(
214             uploadRequest, "versionDescription");
215 
216         UnicodeProperties extraSettingsProperties =
217             PropertiesParamUtil.getProperties(
218                 actionRequest, "extraSettingsProperties(");
219 
220         String extraSettings = extraSettingsProperties.toString();
221 
222         File file = uploadRequest.getFile("file");
223 
224         if (Validator.isNotNull(sourceFileName) && !file.exists()) {
225             file.createNewFile();
226         }
227 
228         ServiceContext serviceContext = ServiceContextFactory.getInstance(
229             DLFileEntry.class.getName(), actionRequest);
230 
231         if (cmd.equals(Constants.ADD)) {
232 
233             // Add file entry
234 
235             DLFileEntry fileEntry = DLFileEntryServiceUtil.addFileEntry(
236                 folderId, sourceFileName, title, description,
237                 versionDescription, extraSettings, file, serviceContext);
238 
239             AssetPublisherUtil.addAndStoreSelection(
240                 actionRequest, DLFileEntry.class.getName(),
241                 fileEntry.getFileEntryId(), -1);
242         }
243         else {
244 
245             // Update file entry
246 
247             DLFileEntryServiceUtil.updateFileEntry(
248                 folderId, newFolderId, name, sourceFileName, title, description,
249                 versionDescription, extraSettings, file, serviceContext);
250         }
251 
252         AssetPublisherUtil.addRecentFolderId(
253             actionRequest, DLFileEntry.class.getName(), folderId);
254     }
255 
256 }