001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.documentlibrary.action;
016    
017    import com.liferay.portal.kernel.repository.model.Folder;
018    import com.liferay.portal.kernel.servlet.SessionErrors;
019    import com.liferay.portal.kernel.servlet.SessionMessages;
020    import com.liferay.portal.kernel.util.ArrayUtil;
021    import com.liferay.portal.kernel.util.Constants;
022    import com.liferay.portal.kernel.util.ParamUtil;
023    import com.liferay.portal.kernel.util.StringUtil;
024    import com.liferay.portal.kernel.util.Validator;
025    import com.liferay.portal.security.auth.PrincipalException;
026    import com.liferay.portal.service.ServiceContext;
027    import com.liferay.portal.service.ServiceContextFactory;
028    import com.liferay.portal.struts.PortletAction;
029    import com.liferay.portal.theme.ThemeDisplay;
030    import com.liferay.portal.util.PortalUtil;
031    import com.liferay.portal.util.WebKeys;
032    import com.liferay.portlet.assetpublisher.util.AssetPublisherUtil;
033    import com.liferay.portlet.documentlibrary.DuplicateFileException;
034    import com.liferay.portlet.documentlibrary.DuplicateFolderNameException;
035    import com.liferay.portlet.documentlibrary.FolderNameException;
036    import com.liferay.portlet.documentlibrary.InvalidFolderException;
037    import com.liferay.portlet.documentlibrary.NoSuchFolderException;
038    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
039    import com.liferay.portlet.documentlibrary.model.DLFolder;
040    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
041    import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
042    import com.liferay.portlet.trash.util.TrashUtil;
043    
044    import java.util.HashMap;
045    import java.util.Map;
046    
047    import javax.portlet.ActionRequest;
048    import javax.portlet.ActionResponse;
049    import javax.portlet.PortletConfig;
050    import javax.portlet.RenderRequest;
051    import javax.portlet.RenderResponse;
052    
053    import org.apache.struts.action.ActionForm;
054    import org.apache.struts.action.ActionForward;
055    import org.apache.struts.action.ActionMapping;
056    
057    /**
058     * @author Brian Wing Shun Chan
059     * @author Alexander Chow
060     * @author Sergio Gonz??lez
061     * @author Levente Hud??k
062     */
063    public class EditFolderAction extends PortletAction {
064    
065            @Override
066            public void processAction(
067                            ActionMapping actionMapping, ActionForm actionForm,
068                            PortletConfig portletConfig, ActionRequest actionRequest,
069                            ActionResponse actionResponse)
070                    throws Exception {
071    
072                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
073    
074                    try {
075                            if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
076                                    updateFolder(actionRequest);
077                            }
078                            else if (cmd.equals(Constants.DELETE)) {
079                                    deleteFolders(actionRequest, false);
080                            }
081                            else if (cmd.equals(Constants.MOVE)) {
082                                    moveFolders(actionRequest, false);
083                            }
084                            else if (cmd.equals(Constants.MOVE_FROM_TRASH)) {
085                                    moveFolders(actionRequest, true);
086                            }
087                            else if (cmd.equals(Constants.MOVE_TO_TRASH)) {
088                                    deleteFolders(actionRequest, true);
089                            }
090                            else if (cmd.equals(Constants.SUBSCRIBE)) {
091                                    subscribeFolder(actionRequest);
092                            }
093                            else if (cmd.equals(Constants.UNSUBSCRIBE)) {
094                                    unsubscribeFolder(actionRequest);
095                            }
096                            else if (cmd.equals("updateWorkflowDefinitions")) {
097                                    updateWorkflowDefinitions(actionRequest);
098                            }
099    
100                            sendRedirect(actionRequest, actionResponse);
101                    }
102                    catch (Exception e) {
103                            if (e instanceof NoSuchFolderException ||
104                                    e instanceof PrincipalException) {
105    
106                                    SessionErrors.add(actionRequest, e.getClass());
107    
108                                    setForward(actionRequest, "portlet.document_library.error");
109                            }
110                            else if (e instanceof DuplicateFileException ||
111                                             e instanceof DuplicateFolderNameException ||
112                                             e instanceof FolderNameException) {
113    
114                                    SessionErrors.add(actionRequest, e.getClass());
115                            }
116                            else if (e instanceof InvalidFolderException) {
117                                    SessionErrors.add(actionRequest, e.getClass(), e);
118                            }
119                            else {
120                                    throw e;
121                            }
122                    }
123            }
124    
125            @Override
126            public ActionForward render(
127                            ActionMapping actionMapping, ActionForm actionForm,
128                            PortletConfig portletConfig, RenderRequest renderRequest,
129                            RenderResponse renderResponse)
130                    throws Exception {
131    
132                    try {
133                            ActionUtil.getFolder(renderRequest);
134                    }
135                    catch (Exception e) {
136                            if (e instanceof NoSuchFolderException ||
137                                    e instanceof PrincipalException) {
138    
139                                    SessionErrors.add(renderRequest, e.getClass());
140    
141                                    return actionMapping.findForward(
142                                            "portlet.document_library.error");
143                            }
144                            else {
145                                    throw e;
146                            }
147                    }
148    
149                    return actionMapping.findForward(
150                            getForward(renderRequest, "portlet.document_library.edit_folder"));
151            }
152    
153            protected void deleteFolders(
154                            ActionRequest actionRequest, boolean moveToTrash)
155                    throws Exception {
156    
157                    String deleteEntryTitle = null;
158    
159                    long[] deleteFolderIds = null;
160    
161                    long folderId = ParamUtil.getLong(actionRequest, "folderId");
162    
163                    if (folderId > 0) {
164                            deleteFolderIds = new long[] {folderId};
165                    }
166                    else {
167                            deleteFolderIds = StringUtil.split(
168                                    ParamUtil.getString(actionRequest, "folderIds"), 0L);
169                    }
170    
171                    for (int i = 0; i < deleteFolderIds.length; i++) {
172                            long deleteFolderId = deleteFolderIds[i];
173    
174                            if (moveToTrash) {
175                                    Folder folder = DLAppServiceUtil.moveFolderToTrash(
176                                            deleteFolderId);
177    
178                                    if (i == 0) {
179                                            deleteEntryTitle = TrashUtil.getOriginalTitle(
180                                                    folder.getName());
181                                    }
182                            }
183                            else {
184                                    DLAppServiceUtil.deleteFolder(deleteFolderId);
185                            }
186    
187                            AssetPublisherUtil.removeRecentFolderId(
188                                    actionRequest, DLFileEntry.class.getName(), deleteFolderId);
189                    }
190    
191                    if (moveToTrash && (deleteFolderIds.length > 0)) {
192                            Map<String, String[]> data = new HashMap<String, String[]>();
193    
194                            data.put(
195                                    "deleteEntryClassName",
196                                    new String[] {DLFolder.class.getName()});
197    
198                            if (Validator.isNotNull(deleteEntryTitle)) {
199                                    data.put("deleteEntryTitle", new String[] {deleteEntryTitle});
200                            }
201    
202                            data.put(
203                                    "restoreFolderIds", ArrayUtil.toStringArray(deleteFolderIds));
204    
205                            SessionMessages.add(
206                                    actionRequest,
207                                    PortalUtil.getPortletId(actionRequest) +
208                                            SessionMessages.KEY_SUFFIX_DELETE_SUCCESS_DATA, data);
209    
210                            hideDefaultSuccessMessage(actionRequest);
211                    }
212            }
213    
214            protected void moveFolders(
215                            ActionRequest actionRequest, boolean moveFromTrash)
216                    throws Exception {
217    
218                    long[] folderIds = null;
219    
220                    long folderId = ParamUtil.getLong(actionRequest, "folderId");
221    
222                    if (folderId > 0) {
223                            folderIds = new long[] {folderId};
224                    }
225                    else {
226                            folderIds = StringUtil.split(
227                                    ParamUtil.getString(actionRequest, "folderIds"), 0L);
228                    }
229    
230                    long parentFolderId = ParamUtil.getLong(
231                            actionRequest, "parentFolderId");
232    
233                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
234                            DLFileEntry.class.getName(), actionRequest);
235    
236                    for (long moveFolderId : folderIds) {
237                            if (moveFromTrash) {
238                                    DLAppServiceUtil.moveFolderFromTrash(
239                                            moveFolderId, parentFolderId, serviceContext);
240                            }
241                            else {
242                                    DLAppServiceUtil.moveFolder(
243                                            moveFolderId, parentFolderId, serviceContext);
244                            }
245                    }
246            }
247    
248            protected void subscribeFolder(ActionRequest actionRequest)
249                    throws Exception {
250    
251                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
252                            WebKeys.THEME_DISPLAY);
253    
254                    long folderId = ParamUtil.getLong(actionRequest, "folderId");
255    
256                    DLAppServiceUtil.subscribeFolder(
257                            themeDisplay.getScopeGroupId(), folderId);
258            }
259    
260            protected void unsubscribeFolder(ActionRequest actionRequest)
261                    throws Exception {
262    
263                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
264                            WebKeys.THEME_DISPLAY);
265    
266                    long folderId = ParamUtil.getLong(actionRequest, "folderId");
267    
268                    DLAppServiceUtil.unsubscribeFolder(
269                            themeDisplay.getScopeGroupId(), folderId);
270            }
271    
272            protected void updateFolder(ActionRequest actionRequest) throws Exception {
273                    long folderId = ParamUtil.getLong(actionRequest, "folderId");
274    
275                    long repositoryId = ParamUtil.getLong(actionRequest, "repositoryId");
276                    long parentFolderId = ParamUtil.getLong(
277                            actionRequest, "parentFolderId");
278                    String name = ParamUtil.getString(actionRequest, "name");
279                    String description = ParamUtil.getString(actionRequest, "description");
280    
281                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
282                            DLFolder.class.getName(), actionRequest);
283    
284                    if (folderId <= 0) {
285    
286                            // Add folder
287    
288                            DLAppServiceUtil.addFolder(
289                                    repositoryId, parentFolderId, name, description,
290                                    serviceContext);
291                    }
292                    else {
293    
294                            // Update folder
295    
296                            DLAppServiceUtil.updateFolder(
297                                    folderId, name, description, serviceContext);
298                    }
299            }
300    
301            protected void updateWorkflowDefinitions(ActionRequest actionRequest)
302                    throws Exception {
303    
304                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
305                            DLFileEntry.class.getName(), actionRequest);
306    
307                    DLAppServiceUtil.updateFolder(
308                            DLFolderConstants.DEFAULT_PARENT_FOLDER_ID, null, null,
309                            serviceContext);
310            }
311    
312    }