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.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.util.PortalUtil;
34  import com.liferay.portlet.assetpublisher.util.AssetPublisherUtil;
35  import com.liferay.portlet.documentlibrary.DuplicateFolderNameException;
36  import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
37  import com.liferay.portlet.documentlibrary.NoSuchFolderException;
38  import com.liferay.portlet.documentlibrary.model.DLFileEntry;
39  import com.liferay.portlet.documentlibrary.service.DLFileEntryServiceUtil;
40  import com.liferay.portlet.tags.TagsEntryException;
41  
42  import java.io.File;
43  
44  import javax.portlet.ActionRequest;
45  import javax.portlet.ActionResponse;
46  import javax.portlet.PortletConfig;
47  import javax.portlet.RenderRequest;
48  import javax.portlet.RenderResponse;
49  
50  import javax.servlet.http.HttpServletResponse;
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.UNLOCK)) {
82                  unlockFileEntry(actionRequest);
83              }
84  
85              sendRedirect(actionRequest, actionResponse);
86          }
87          catch (Exception e) {
88              if (e instanceof DuplicateLockException ||
89                  e instanceof NoSuchFileEntryException ||
90                  e instanceof PrincipalException) {
91  
92                  if (e instanceof DuplicateLockException) {
93                      DuplicateLockException dle = (DuplicateLockException)e;
94  
95                      SessionErrors.add(
96                          actionRequest, dle.getClass().getName(), dle.getLock());
97                  }
98                  else {
99                      SessionErrors.add(actionRequest, e.getClass().getName());
100                 }
101 
102                 setForward(actionRequest, "portlet.document_library.error");
103             }
104             else if (e instanceof DuplicateFileException ||
105                      e instanceof DuplicateFolderNameException ||
106                      e instanceof FileNameException ||
107                      e instanceof FileSizeException ||
108                      e instanceof NoSuchFolderException ||
109                      e instanceof SourceFileNameException) {
110 
111                 if (e instanceof DuplicateFileException) {
112                     HttpServletResponse response =
113                         PortalUtil.getHttpServletResponse(
114                             actionResponse);
115 
116                     response.setStatus(
117                         HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
118                 }
119 
120                 SessionErrors.add(actionRequest, e.getClass().getName());
121             }
122             else if (e instanceof TagsEntryException) {
123                 SessionErrors.add(actionRequest, e.getClass().getName(), e);
124             }
125             else {
126                 throw e;
127             }
128         }
129     }
130 
131     public ActionForward render(
132             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
133             RenderRequest renderRequest, RenderResponse renderResponse)
134         throws Exception {
135 
136         try {
137             ActionUtil.getFileEntry(renderRequest);
138         }
139         catch (Exception e) {
140             if (e instanceof NoSuchFileEntryException ||
141                 e instanceof PrincipalException) {
142 
143                 SessionErrors.add(renderRequest, e.getClass().getName());
144 
145                 return mapping.findForward("portlet.document_library.error");
146             }
147             else {
148                 throw e;
149             }
150         }
151 
152         String forward = "portlet.document_library.edit_file_entry";
153 
154         return mapping.findForward(getForward(renderRequest, forward));
155     }
156 
157     protected void deleteFileEntry(ActionRequest actionRequest)
158         throws Exception {
159 
160         long folderId = ParamUtil.getLong(actionRequest, "folderId");
161         String name = ParamUtil.getString(actionRequest, "name");
162         double version = ParamUtil.getDouble(actionRequest, "version");
163 
164         DLFileEntryServiceUtil.deleteFileEntry(folderId, name, version);
165     }
166 
167     protected void lockFileEntry(ActionRequest actionRequest) throws Exception {
168         long folderId = ParamUtil.getLong(actionRequest, "folderId");
169         String name = ParamUtil.getString(actionRequest, "name");
170 
171         DLFileEntryServiceUtil.lockFileEntry(folderId, name);
172     }
173 
174     protected void unlockFileEntry(ActionRequest actionRequest)
175         throws Exception {
176 
177         long folderId = ParamUtil.getLong(actionRequest, "folderId");
178         String name = ParamUtil.getString(actionRequest, "name");
179 
180         DLFileEntryServiceUtil.unlockFileEntry(folderId, name);
181     }
182 
183     protected void updateFileEntry(
184             ActionRequest actionRequest, ActionResponse actionResponse)
185         throws Exception {
186 
187         UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
188             actionRequest);
189 
190         String cmd = ParamUtil.getString(uploadRequest, Constants.CMD);
191 
192         long folderId = ParamUtil.getLong(uploadRequest, "folderId");
193         long newFolderId = ParamUtil.getLong(uploadRequest, "newFolderId");
194         String name = ParamUtil.getString(uploadRequest, "name");
195         String sourceFileName = uploadRequest.getFileName("file");
196 
197         String title = ParamUtil.getString(uploadRequest, "title");
198         String description = ParamUtil.getString(uploadRequest, "description");
199         String versionDescription = ParamUtil.getString(
200             uploadRequest, "versionDescription");
201 
202         UnicodeProperties extraSettingsProperties =
203             PropertiesParamUtil.getProperties(
204                 actionRequest, "extraSettingsProperties(");
205 
206         String extraSettings = extraSettingsProperties.toString();
207 
208         File file = uploadRequest.getFile("file");
209 
210         if (Validator.isNotNull(sourceFileName) && !file.exists()) {
211             file.createNewFile();
212         }
213 
214         ServiceContext serviceContext = ServiceContextFactory.getInstance(
215             DLFileEntry.class.getName(), actionRequest);
216 
217         if (cmd.equals(Constants.ADD)) {
218 
219             // Add file entry
220 
221             DLFileEntry fileEntry = DLFileEntryServiceUtil.addFileEntry(
222                 folderId, sourceFileName, title, description,
223                 versionDescription, extraSettings, file, serviceContext);
224 
225             AssetPublisherUtil.addAndStoreSelection(
226                 actionRequest, DLFileEntry.class.getName(),
227                 fileEntry.getFileEntryId(), -1);
228         }
229         else {
230 
231             // Update file entry
232 
233             DLFileEntryServiceUtil.updateFileEntry(
234                 folderId, newFolderId, name, sourceFileName, title, description,
235                 versionDescription, extraSettings, file, serviceContext);
236         }
237 
238         AssetPublisherUtil.addRecentFolderId(
239             actionRequest, DLFileEntry.class.getName(), folderId);
240     }
241 
242 }