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