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.kernel.util.StringUtil;
33  import com.liferay.portal.security.auth.PrincipalException;
34  import com.liferay.portal.security.permission.ActionKeys;
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.documentlibrary.DuplicateFolderNameException;
40  import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
41  import com.liferay.portlet.documentlibrary.NoSuchFolderException;
42  import com.liferay.portlet.documentlibrary.form.FileEntryForm;
43  import com.liferay.portlet.documentlibrary.model.DLFileEntry;
44  import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
45  import com.liferay.portlet.documentlibrary.service.DLFileEntryServiceUtil;
46  import com.liferay.portlet.documentlibrary.service.permission.DLFileEntryPermission;
47  import com.liferay.portlet.documentlibrary.service.permission.DLFolderPermission;
48  import com.liferay.portlet.taggedcontent.util.AssetPublisherUtil;
49  import com.liferay.portlet.tags.TagsEntryException;
50  
51  import java.io.File;
52  
53  import javax.portlet.ActionRequest;
54  import javax.portlet.ActionResponse;
55  import javax.portlet.PortletConfig;
56  import javax.portlet.RenderRequest;
57  import javax.portlet.RenderResponse;
58  
59  import org.apache.struts.action.ActionForm;
60  import org.apache.struts.action.ActionForward;
61  import org.apache.struts.action.ActionMapping;
62  
63  /**
64   * <a href="EditFileEntryAction.java.html"><b><i>View Source</i></b></a>
65   *
66   * @author Brian Wing Shun Chan
67   * @author Alexander Chow
68   *
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          FileEntryForm fileEntryForm = (FileEntryForm)form;
78  
79          String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
80  
81          try {
82              if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
83                  updateFileEntry(fileEntryForm, actionRequest, actionResponse);
84              }
85              else if (cmd.equals(Constants.DELETE)) {
86                  deleteFileEntry(actionRequest);
87              }
88              else if (cmd.equals(Constants.LOCK)) {
89                  lockFileEntry(actionRequest);
90              }
91              else if (cmd.equals(Constants.UNLOCK)) {
92                  unlockFileEntry(actionRequest);
93              }
94  
95              sendRedirect(actionRequest, actionResponse);
96          }
97          catch (Exception e) {
98              if (e instanceof DuplicateLockException ||
99                  e instanceof NoSuchFileEntryException ||
100                 e instanceof PrincipalException) {
101 
102                 if (e instanceof DuplicateLockException) {
103                     DuplicateLockException dle = (DuplicateLockException)e;
104 
105                     SessionErrors.add(
106                         actionRequest, dle.getClass().getName(), dle.getLock());
107                 }
108                 else {
109                     SessionErrors.add(actionRequest, e.getClass().getName());
110                 }
111 
112                 setForward(actionRequest, "portlet.document_library.error");
113             }
114             else if (e instanceof DuplicateFileException ||
115                      e instanceof DuplicateFolderNameException ||
116                      e instanceof FileNameException ||
117                      e instanceof FileSizeException ||
118                      e instanceof NoSuchFolderException ||
119                      e instanceof SourceFileNameException) {
120 
121                 SessionErrors.add(actionRequest, e.getClass().getName());
122             }
123             else if (e instanceof TagsEntryException) {
124                 SessionErrors.add(actionRequest, e.getClass().getName(), e);
125             }
126             else {
127                 throw e;
128             }
129         }
130     }
131 
132     public ActionForward render(
133             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
134             RenderRequest renderRequest, RenderResponse renderResponse)
135         throws Exception {
136 
137         try {
138             ActionUtil.getFileEntry(renderRequest);
139         }
140         catch (Exception e) {
141             if (e instanceof NoSuchFileEntryException ||
142                 e instanceof PrincipalException) {
143 
144                 SessionErrors.add(renderRequest, e.getClass().getName());
145 
146                 return mapping.findForward("portlet.document_library.error");
147             }
148             else {
149                 throw e;
150             }
151         }
152 
153         String forward = "portlet.document_library.edit_file_entry";
154 
155         return mapping.findForward(getForward(renderRequest, forward));
156     }
157 
158     protected void deleteFileEntry(ActionRequest actionRequest)
159         throws Exception {
160 
161         long folderId = ParamUtil.getLong(actionRequest, "folderId");
162         String name = ParamUtil.getString(actionRequest, "name");
163         double version = ParamUtil.getDouble(actionRequest, "version");
164 
165         DLFileEntryServiceUtil.deleteFileEntry(folderId, name, version);
166     }
167 
168     protected void lockFileEntry(ActionRequest actionRequest) throws Exception {
169         long folderId = ParamUtil.getLong(actionRequest, "folderId");
170         String name = ParamUtil.getString(actionRequest, "name");
171 
172         DLFileEntryServiceUtil.lockFileEntry(folderId, name);
173     }
174 
175     protected void unlockFileEntry(ActionRequest actionRequest)
176         throws Exception {
177 
178         long folderId = ParamUtil.getLong(actionRequest, "folderId");
179         String name = ParamUtil.getString(actionRequest, "name");
180 
181         DLFileEntryServiceUtil.unlockFileEntry(folderId, name);
182     }
183 
184     protected void updateFileEntry(
185             FileEntryForm fileEntryForm, ActionRequest actionRequest,
186             ActionResponse actionResponse)
187         throws Exception {
188 
189         UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
190             actionRequest);
191 
192         String cmd = ParamUtil.getString(uploadRequest, Constants.CMD);
193 
194         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
195             WebKeys.THEME_DISPLAY);
196 
197         long folderId = ParamUtil.getLong(uploadRequest, "folderId");
198         long newFolderId = ParamUtil.getLong(uploadRequest, "newFolderId");
199         String name = ParamUtil.getString(uploadRequest, "name");
200         String sourceFileName = uploadRequest.getFileName("file");
201 
202         String title = ParamUtil.getString(uploadRequest, "title");
203         String description = ParamUtil.getString(uploadRequest, "description");
204 
205         String[] tagsEntries = StringUtil.split(
206             ParamUtil.getString(uploadRequest, "tagsEntries"));
207 
208         String extraSettings = PropertiesUtil.toString(
209             fileEntryForm.getExtraSettingsProperties());
210 
211         File file = uploadRequest.getFile("file");
212 
213         String[] communityPermissions = actionRequest.getParameterValues(
214             "communityPermissions");
215         String[] guestPermissions = actionRequest.getParameterValues(
216             "guestPermissions");
217 
218         if (cmd.equals(Constants.ADD)) {
219 
220             // Add file entry
221 
222             DLFolderPermission.check(
223                 themeDisplay.getPermissionChecker(), folderId,
224                 ActionKeys.ADD_DOCUMENT);
225 
226             DLFileEntry entry = DLFileEntryLocalServiceUtil.addFileEntry(
227                 themeDisplay.getUserId(), folderId, sourceFileName, title,
228                 description, tagsEntries, extraSettings, file,
229                 communityPermissions, guestPermissions);
230 
231             AssetPublisherUtil.addAndStoreSelection(
232                 actionRequest, DLFileEntry.class.getName(),
233                 entry.getFileEntryId(), -1);
234         }
235         else {
236 
237             // Update file entry
238 
239             DLFileEntryPermission.check(
240                 themeDisplay.getPermissionChecker(), folderId, name,
241                 ActionKeys.UPDATE);
242 
243             DLFileEntryLocalServiceUtil.updateFileEntry(
244                 themeDisplay.getUserId(), folderId, newFolderId, name,
245                 sourceFileName, title, description, tagsEntries, extraSettings,
246                 file);
247         }
248 
249         AssetPublisherUtil.addRecentFolderId(
250             actionRequest, DLFileEntry.class.getName(), folderId);
251     }
252 
253 }