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.journal.action;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.exception.SystemException;
019    import com.liferay.portal.kernel.portlet.LiferayPortletConfig;
020    import com.liferay.portal.kernel.portlet.LiferayWindowState;
021    import com.liferay.portal.kernel.servlet.SessionErrors;
022    import com.liferay.portal.kernel.servlet.SessionMessages;
023    import com.liferay.portal.kernel.util.ArrayUtil;
024    import com.liferay.portal.kernel.util.Constants;
025    import com.liferay.portal.kernel.util.ParamUtil;
026    import com.liferay.portal.kernel.util.StringUtil;
027    import com.liferay.portal.kernel.util.Validator;
028    import com.liferay.portal.security.auth.PrincipalException;
029    import com.liferay.portal.service.ServiceContext;
030    import com.liferay.portal.service.ServiceContextFactory;
031    import com.liferay.portal.struts.PortletAction;
032    import com.liferay.portal.theme.ThemeDisplay;
033    import com.liferay.portal.util.PortalUtil;
034    import com.liferay.portal.util.WebKeys;
035    import com.liferay.portlet.PortletURLFactoryUtil;
036    import com.liferay.portlet.asset.AssetCategoryException;
037    import com.liferay.portlet.asset.AssetTagException;
038    import com.liferay.portlet.journal.DuplicateArticleIdException;
039    import com.liferay.portlet.journal.DuplicateFolderNameException;
040    import com.liferay.portlet.journal.NoSuchArticleException;
041    import com.liferay.portlet.journal.NoSuchFolderException;
042    import com.liferay.portlet.journal.model.JournalArticle;
043    import com.liferay.portlet.journal.model.JournalFolder;
044    import com.liferay.portlet.journal.service.JournalArticleServiceUtil;
045    import com.liferay.portlet.journal.service.JournalFolderServiceUtil;
046    import com.liferay.portlet.trash.util.TrashUtil;
047    
048    import java.util.HashMap;
049    import java.util.Map;
050    
051    import javax.portlet.ActionRequest;
052    import javax.portlet.ActionResponse;
053    import javax.portlet.PortletConfig;
054    import javax.portlet.PortletRequest;
055    import javax.portlet.PortletURL;
056    import javax.portlet.RenderRequest;
057    import javax.portlet.RenderResponse;
058    import javax.portlet.WindowState;
059    
060    import org.apache.struts.action.ActionForm;
061    import org.apache.struts.action.ActionForward;
062    import org.apache.struts.action.ActionMapping;
063    
064    /**
065     * @author Sergio Gonz??lez
066     */
067    public class EditEntryAction extends PortletAction {
068    
069            @Override
070            public void processAction(
071                            ActionMapping actionMapping, ActionForm actionForm,
072                            PortletConfig portletConfig, ActionRequest actionRequest,
073                            ActionResponse actionResponse)
074                    throws Exception {
075    
076                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
077    
078                    try {
079                            if (cmd.equals(Constants.DELETE) ||
080                                    cmd.equals(Constants.DELETE_VERSIONS)) {
081    
082                                    deleteEntries(
083                                            (LiferayPortletConfig)portletConfig, actionRequest, false);
084                            }
085                            else if (cmd.equals(Constants.EXPIRE)) {
086                                    expireEntries(actionRequest);
087                            }
088                            else if (cmd.equals(Constants.MOVE)) {
089                                    moveEntries(actionRequest);
090                            }
091                            else if (cmd.equals(Constants.MOVE_TO_TRASH)) {
092                                    deleteEntries(
093                                            (LiferayPortletConfig)portletConfig, actionRequest, true);
094                            }
095                            else if (cmd.equals(Constants.RESTORE)) {
096                                    restoreEntryFromTrash(actionRequest);
097                            }
098    
099                            String redirect = PortalUtil.escapeRedirect(
100                                    ParamUtil.getString(actionRequest, "redirect"));
101    
102                            if (cmd.equals(Constants.DELETE_VERSIONS) &&
103                                    !ActionUtil.hasArticle(actionRequest)) {
104    
105                                    String referringPortletResource = ParamUtil.getString(
106                                            actionRequest, "referringPortletResource");
107    
108                                    if (Validator.isNotNull(referringPortletResource)) {
109                                            setForward(
110                                                    actionRequest,
111                                                    "portlet.journal.asset.add_asset_redirect");
112    
113                                            return;
114                                    }
115                                    else {
116                                            ThemeDisplay themeDisplay =
117                                                    (ThemeDisplay)actionRequest.getAttribute(
118                                                            WebKeys.THEME_DISPLAY);
119    
120                                            PortletURL portletURL = PortletURLFactoryUtil.create(
121                                                    actionRequest, portletConfig.getPortletName(),
122                                                    themeDisplay.getPlid(), PortletRequest.RENDER_PHASE);
123    
124                                            redirect = portletURL.toString();
125                                    }
126                            }
127    
128                            WindowState windowState = actionRequest.getWindowState();
129    
130                            if (!windowState.equals(LiferayWindowState.POP_UP)) {
131                                    sendRedirect(actionRequest, actionResponse);
132                            }
133                            else if (Validator.isNotNull(redirect)) {
134                                    actionResponse.sendRedirect(redirect);
135                            }
136                    }
137                    catch (Exception e) {
138                            if (e instanceof NoSuchArticleException ||
139                                    e instanceof NoSuchFolderException ||
140                                    e instanceof PrincipalException) {
141    
142                                    SessionErrors.add(actionRequest, e.getClass());
143    
144                                    setForward(actionRequest, "portlet.journal.error");
145                            }
146                            else if (e instanceof DuplicateArticleIdException ||
147                                             e instanceof DuplicateFolderNameException ||
148                                             e instanceof NoSuchFolderException) {
149    
150                                    SessionErrors.add(actionRequest, e.getClass());
151                            }
152                            else if (e instanceof AssetCategoryException ||
153                                             e instanceof AssetTagException) {
154    
155                                    SessionErrors.add(actionRequest, e.getClass(), e);
156                            }
157                            else {
158                                    throw e;
159                            }
160                    }
161            }
162    
163            @Override
164            public ActionForward render(
165                            ActionMapping actionMapping, ActionForm actionForm,
166                            PortletConfig portletConfig, RenderRequest renderRequest,
167                            RenderResponse renderResponse)
168                    throws Exception {
169    
170                    try {
171                            ActionUtil.getArticles(renderRequest);
172                            ActionUtil.getFolders(renderRequest);
173                    }
174                    catch (Exception e) {
175                            if (e instanceof NoSuchArticleException ||
176                                    e instanceof PrincipalException) {
177    
178                                    SessionErrors.add(renderRequest, e.getClass());
179    
180                                    return actionMapping.findForward("portlet.journal.error");
181                            }
182                            else {
183                                    throw e;
184                            }
185                    }
186    
187                    String forward = "portlet.journal.edit_entry";
188    
189                    return actionMapping.findForward(getForward(renderRequest, forward));
190            }
191    
192            protected void deleteEntries(
193                            LiferayPortletConfig liferayPortletConfig,
194                            ActionRequest actionRequest, boolean moveToTrash)
195                    throws Exception {
196    
197                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
198                            WebKeys.THEME_DISPLAY);
199    
200                    String deleteEntryClassName = null;
201                    String deleteEntryTitle = null;
202    
203                    long[] deleteFolderIds = StringUtil.split(
204                            ParamUtil.getString(actionRequest, "folderIds"), 0L);
205    
206                    for (int i = 0; i < deleteFolderIds.length; i++) {
207                            long deleteFolderId = deleteFolderIds[i];
208    
209                            if (moveToTrash) {
210                                    JournalFolder folder =
211                                            JournalFolderServiceUtil.moveFolderToTrash(deleteFolderId);
212    
213                                    if (i == 0) {
214                                            deleteEntryClassName = JournalFolder.class.getName();
215    
216                                            deleteEntryTitle = TrashUtil.getOriginalTitle(
217                                                    folder.getName());
218                                    }
219                            }
220                            else {
221                                    JournalFolderServiceUtil.deleteFolder(deleteFolderId);
222                            }
223                    }
224    
225                    String[] deleteArticleIds = StringUtil.split(
226                            ParamUtil.getString(actionRequest, "articleIds"));
227    
228                    long[] restoreArticleIds = new long[deleteArticleIds.length];
229    
230                    for (int i = 0; i < deleteArticleIds.length; i++) {
231                            String deleteArticleId = deleteArticleIds[i];
232    
233                            if (moveToTrash) {
234                                    JournalArticle article =
235                                            JournalArticleServiceUtil.moveArticleToTrash(
236                                                    themeDisplay.getScopeGroupId(), deleteArticleId);
237    
238                                    if (i == 0) {
239                                            deleteEntryClassName = JournalArticle.class.getName();
240    
241                                            deleteEntryTitle = article.getTitle(
242                                                    themeDisplay.getLocale());
243                                    }
244    
245                                    restoreArticleIds[i] = article.getResourcePrimKey();
246                            }
247                            else {
248                                    ActionUtil.deleteArticle(actionRequest, deleteArticleId);
249                            }
250                    }
251    
252                    if (moveToTrash &&
253                            ((deleteArticleIds.length > 0) || (deleteFolderIds.length > 0))) {
254    
255                            Map<String, String[]> data = new HashMap<String, String[]>();
256    
257                            if (Validator.isNotNull(deleteEntryClassName)) {
258                                    data.put(
259                                            "deleteEntryClassName",
260                                            new String[] {deleteEntryClassName});
261                            }
262    
263                            if (Validator.isNotNull(deleteEntryTitle)) {
264                                    data.put("deleteEntryTitle", new String[] {deleteEntryTitle});
265                            }
266    
267                            data.put(
268                                    "restoreArticleIds",
269                                    ArrayUtil.toStringArray(restoreArticleIds));
270                            data.put(
271                                    "restoreFolderIds", ArrayUtil.toStringArray(deleteFolderIds));
272    
273                            SessionMessages.add(
274                                    actionRequest,
275                                    liferayPortletConfig.getPortletId() +
276                                            SessionMessages.KEY_SUFFIX_DELETE_SUCCESS_DATA, data);
277    
278                            hideDefaultSuccessMessage(liferayPortletConfig, actionRequest);
279                    }
280            }
281    
282            protected void expireEntries(ActionRequest actionRequest) throws Exception {
283                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
284                            WebKeys.THEME_DISPLAY);
285    
286                    long[] expireFolderIds = StringUtil.split(
287                            ParamUtil.getString(actionRequest, "folderIds"), 0L);
288    
289                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
290                            JournalArticle.class.getName(), actionRequest);
291    
292                    for (long expireFolderId : expireFolderIds) {
293                            ActionUtil.expireFolder(
294                                    themeDisplay.getScopeGroupId(), expireFolderId, serviceContext);
295                    }
296    
297                    String[] expireArticleIds = StringUtil.split(
298                            ParamUtil.getString(actionRequest, "articleIds"));
299    
300                    for (String expireArticleId : expireArticleIds) {
301                            ActionUtil.expireArticle(actionRequest, expireArticleId);
302                    }
303            }
304    
305            protected void moveEntries(ActionRequest actionRequest) throws Exception {
306                    long newFolderId = ParamUtil.getLong(actionRequest, "newFolderId");
307    
308                    long[] folderIds = StringUtil.split(
309                            ParamUtil.getString(actionRequest, "folderIds"), 0L);
310    
311                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
312                            JournalArticle.class.getName(), actionRequest);
313    
314                    for (long folderId : folderIds) {
315                            JournalFolderServiceUtil.moveFolder(
316                                    folderId, newFolderId, serviceContext);
317                    }
318    
319                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
320                            WebKeys.THEME_DISPLAY);
321    
322                    String[] articleIds = StringUtil.split(
323                            ParamUtil.getString(actionRequest, "articleIds"));
324    
325                    for (String articleId : articleIds) {
326                            JournalArticleServiceUtil.moveArticle(
327                                    themeDisplay.getScopeGroupId(), articleId, newFolderId);
328                    }
329            }
330    
331            protected void restoreEntryFromTrash(ActionRequest actionRequest)
332                    throws PortalException, SystemException {
333    
334                    long[] restoreFolderIds = StringUtil.split(
335                            ParamUtil.getString(actionRequest, "restoreFolderIds"), 0L);
336    
337                    for (long restoreFolderId : restoreFolderIds) {
338                            JournalFolderServiceUtil.restoreFolderFromTrash(restoreFolderId);
339                    }
340    
341                    long[] restoreArticleIds = StringUtil.split(
342                            ParamUtil.getString(actionRequest, "restoreArticleIds"), 0L);
343    
344                    for (long restoreEntryId : restoreArticleIds) {
345                            JournalArticleServiceUtil.restoreArticleFromTrash(restoreEntryId);
346                    }
347            }
348    
349    }