1   /**
2    * Copyright (c) 2000-2009 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   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
12   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
14   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
15   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
17   * SOFTWARE.
18   */
19  
20  package com.liferay.portlet.documentlibrary.action;
21  
22  import com.liferay.documentlibrary.DuplicateFileException;
23  import com.liferay.documentlibrary.FileNameException;
24  import com.liferay.documentlibrary.FileSizeException;
25  import com.liferay.documentlibrary.SourceFileNameException;
26  import com.liferay.lock.DuplicateLockException;
27  import com.liferay.portal.kernel.servlet.SessionErrors;
28  import com.liferay.portal.kernel.upload.UploadPortletRequest;
29  import com.liferay.portal.kernel.util.Constants;
30  import com.liferay.portal.kernel.util.ParamUtil;
31  import com.liferay.portal.kernel.util.PropertiesUtil;
32  import com.liferay.portal.security.auth.PrincipalException;
33  import com.liferay.portal.security.permission.ActionKeys;
34  import com.liferay.portal.service.ServiceContext;
35  import com.liferay.portal.service.ServiceContextFactory;
36  import com.liferay.portal.struts.PortletAction;
37  import com.liferay.portal.theme.ThemeDisplay;
38  import com.liferay.portal.util.PortalUtil;
39  import com.liferay.portal.util.WebKeys;
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.form.FileEntryForm;
45  import com.liferay.portlet.documentlibrary.model.DLFileEntry;
46  import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
47  import com.liferay.portlet.documentlibrary.service.DLFileEntryServiceUtil;
48  import com.liferay.portlet.documentlibrary.service.permission.DLFileEntryPermission;
49  import com.liferay.portlet.documentlibrary.service.permission.DLFolderPermission;
50  import com.liferay.portlet.tags.TagsEntryException;
51  
52  import java.io.File;
53  
54  import javax.portlet.ActionRequest;
55  import javax.portlet.ActionResponse;
56  import javax.portlet.PortletConfig;
57  import javax.portlet.RenderRequest;
58  import javax.portlet.RenderResponse;
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   */
71  public class EditFileEntryAction extends PortletAction {
72  
73      public void processAction(
74              ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
75              ActionRequest actionRequest, ActionResponse actionResponse)
76          throws Exception {
77  
78          FileEntryForm fileEntryForm = (FileEntryForm)form;
79  
80          String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
81  
82          try {
83              if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
84                  updateFileEntry(fileEntryForm, actionRequest, actionResponse);
85              }
86              else if (cmd.equals(Constants.DELETE)) {
87                  deleteFileEntry(actionRequest);
88              }
89              else if (cmd.equals(Constants.LOCK)) {
90                  lockFileEntry(actionRequest);
91              }
92              else if (cmd.equals(Constants.UNLOCK)) {
93                  unlockFileEntry(actionRequest);
94              }
95  
96              sendRedirect(actionRequest, actionResponse);
97          }
98          catch (Exception e) {
99              if (e instanceof DuplicateLockException ||
100                 e instanceof NoSuchFileEntryException ||
101                 e instanceof PrincipalException) {
102 
103                 if (e instanceof DuplicateLockException) {
104                     DuplicateLockException dle = (DuplicateLockException)e;
105 
106                     SessionErrors.add(
107                         actionRequest, dle.getClass().getName(), dle.getLock());
108                 }
109                 else {
110                     SessionErrors.add(actionRequest, e.getClass().getName());
111                 }
112 
113                 setForward(actionRequest, "portlet.document_library.error");
114             }
115             else if (e instanceof DuplicateFileException ||
116                      e instanceof DuplicateFolderNameException ||
117                      e instanceof FileNameException ||
118                      e instanceof FileSizeException ||
119                      e instanceof NoSuchFolderException ||
120                      e instanceof SourceFileNameException) {
121 
122                 SessionErrors.add(actionRequest, e.getClass().getName());
123             }
124             else if (e instanceof TagsEntryException) {
125                 SessionErrors.add(actionRequest, e.getClass().getName(), e);
126             }
127             else {
128                 throw e;
129             }
130         }
131     }
132 
133     public ActionForward render(
134             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
135             RenderRequest renderRequest, RenderResponse renderResponse)
136         throws Exception {
137 
138         try {
139             ActionUtil.getFileEntry(renderRequest);
140         }
141         catch (Exception e) {
142             if (e instanceof NoSuchFileEntryException ||
143                 e instanceof PrincipalException) {
144 
145                 SessionErrors.add(renderRequest, e.getClass().getName());
146 
147                 return mapping.findForward("portlet.document_library.error");
148             }
149             else {
150                 throw e;
151             }
152         }
153 
154         String forward = "portlet.document_library.edit_file_entry";
155 
156         return mapping.findForward(getForward(renderRequest, forward));
157     }
158 
159     protected void deleteFileEntry(ActionRequest actionRequest)
160         throws Exception {
161 
162         long folderId = ParamUtil.getLong(actionRequest, "folderId");
163         String name = ParamUtil.getString(actionRequest, "name");
164         double version = ParamUtil.getDouble(actionRequest, "version");
165 
166         DLFileEntryServiceUtil.deleteFileEntry(folderId, name, version);
167     }
168 
169     protected void lockFileEntry(ActionRequest actionRequest) throws Exception {
170         long folderId = ParamUtil.getLong(actionRequest, "folderId");
171         String name = ParamUtil.getString(actionRequest, "name");
172 
173         DLFileEntryServiceUtil.lockFileEntry(folderId, name);
174     }
175 
176     protected void unlockFileEntry(ActionRequest actionRequest)
177         throws Exception {
178 
179         long folderId = ParamUtil.getLong(actionRequest, "folderId");
180         String name = ParamUtil.getString(actionRequest, "name");
181 
182         DLFileEntryServiceUtil.unlockFileEntry(folderId, name);
183     }
184 
185     protected void updateFileEntry(
186             FileEntryForm fileEntryForm, ActionRequest actionRequest,
187             ActionResponse actionResponse)
188         throws Exception {
189 
190         UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
191             actionRequest);
192 
193         String cmd = ParamUtil.getString(uploadRequest, Constants.CMD);
194 
195         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
196             WebKeys.THEME_DISPLAY);
197 
198         long folderId = ParamUtil.getLong(uploadRequest, "folderId");
199         long newFolderId = ParamUtil.getLong(uploadRequest, "newFolderId");
200         String name = ParamUtil.getString(uploadRequest, "name");
201         String sourceFileName = uploadRequest.getFileName("file");
202 
203         String title = ParamUtil.getString(uploadRequest, "title");
204         String description = ParamUtil.getString(uploadRequest, "description");
205 
206         String extraSettings = PropertiesUtil.toString(
207             fileEntryForm.getExtraSettingsProperties());
208 
209         File file = uploadRequest.getFile("file");
210 
211         ServiceContext serviceContext = ServiceContextFactory.getInstance(
212             DLFileEntry.class.getName(), actionRequest);
213 
214         if (cmd.equals(Constants.ADD)) {
215 
216             // Add file entry
217 
218             DLFolderPermission.check(
219                 themeDisplay.getPermissionChecker(), folderId,
220                 ActionKeys.ADD_DOCUMENT);
221 
222             DLFileEntry entry = DLFileEntryLocalServiceUtil.addFileEntry(
223                 themeDisplay.getUserId(), folderId, sourceFileName, title,
224                 description, extraSettings, file, serviceContext);
225 
226             AssetPublisherUtil.addAndStoreSelection(
227                 actionRequest, DLFileEntry.class.getName(),
228                 entry.getFileEntryId(), -1);
229         }
230         else {
231 
232             // Update file entry
233 
234             DLFileEntryPermission.check(
235                 themeDisplay.getPermissionChecker(), folderId, name,
236                 ActionKeys.UPDATE);
237 
238             DLFileEntryLocalServiceUtil.updateFileEntry(
239                 themeDisplay.getUserId(), folderId, newFolderId, name,
240                 sourceFileName, title, description, extraSettings, file,
241                 serviceContext);
242         }
243 
244         AssetPublisherUtil.addRecentFolderId(
245             actionRequest, DLFileEntry.class.getName(), folderId);
246     }
247 
248 }