001    /**
002     * Copyright (c) 2000-2012 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.portlet.LiferayPortletConfig;
018    import com.liferay.portal.kernel.portlet.LiferayWindowState;
019    import com.liferay.portal.kernel.servlet.SessionErrors;
020    import com.liferay.portal.kernel.servlet.SessionMessages;
021    import com.liferay.portal.kernel.util.ArrayUtil;
022    import com.liferay.portal.kernel.util.Constants;
023    import com.liferay.portal.kernel.util.ParamUtil;
024    import com.liferay.portal.kernel.util.StringUtil;
025    import com.liferay.portal.kernel.util.Validator;
026    import com.liferay.portal.security.auth.PrincipalException;
027    import com.liferay.portal.service.ServiceContext;
028    import com.liferay.portal.service.ServiceContextFactory;
029    import com.liferay.portal.struts.PortletAction;
030    import com.liferay.portal.theme.ThemeDisplay;
031    import com.liferay.portal.util.PortalUtil;
032    import com.liferay.portal.util.WebKeys;
033    import com.liferay.portlet.PortletURLFactoryUtil;
034    import com.liferay.portlet.asset.AssetCategoryException;
035    import com.liferay.portlet.asset.AssetTagException;
036    import com.liferay.portlet.journal.DuplicateArticleIdException;
037    import com.liferay.portlet.journal.DuplicateFolderNameException;
038    import com.liferay.portlet.journal.NoSuchArticleException;
039    import com.liferay.portlet.journal.NoSuchFolderException;
040    import com.liferay.portlet.journal.model.JournalArticle;
041    import com.liferay.portlet.journal.service.JournalArticleServiceUtil;
042    import com.liferay.portlet.journal.service.JournalFolderServiceUtil;
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.PortletRequest;
051    import javax.portlet.PortletURL;
052    import javax.portlet.RenderRequest;
053    import javax.portlet.RenderResponse;
054    import javax.portlet.WindowState;
055    
056    import org.apache.struts.action.ActionForm;
057    import org.apache.struts.action.ActionForward;
058    import org.apache.struts.action.ActionMapping;
059    
060    /**
061     * @author Sergio González
062     */
063    public class EditEntryAction extends PortletAction {
064    
065            @Override
066            public void processAction(
067                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
068                            ActionRequest actionRequest, ActionResponse actionResponse)
069                    throws Exception {
070    
071                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
072    
073                    try {
074                            if (cmd.equals(Constants.DELETE) ||
075                                    cmd.equals(Constants.DELETE_VERSIONS)) {
076    
077                                    deleteEntries(
078                                            (LiferayPortletConfig)portletConfig, actionRequest, false);
079                            }
080                            else if (cmd.equals(Constants.EXPIRE)) {
081                                    expireEntries(actionRequest);
082                            }
083                            else if (cmd.equals(Constants.MOVE)) {
084                                    moveEntries(actionRequest);
085                            }
086                            else if (cmd.equals(Constants.MOVE_TO_TRASH)) {
087                                    deleteEntries(
088                                            (LiferayPortletConfig)portletConfig, actionRequest, true);
089                            }
090    
091                            String redirect = PortalUtil.escapeRedirect(
092                                    ParamUtil.getString(actionRequest, "redirect"));
093    
094                            if (cmd.equals(Constants.DELETE_VERSIONS) &&
095                                    !ActionUtil.hasArticle(actionRequest)) {
096    
097                                    String referringPortletResource = ParamUtil.getString(
098                                            actionRequest, "referringPortletResource");
099    
100                                    if (Validator.isNotNull(referringPortletResource)) {
101                                            setForward(
102                                                    actionRequest,
103                                                    "portlet.journal.asset.add_asset_redirect");
104    
105                                            return;
106                                    }
107                                    else {
108                                            ThemeDisplay themeDisplay =
109                                                    (ThemeDisplay)actionRequest.getAttribute(
110                                                            WebKeys.THEME_DISPLAY);
111    
112                                            PortletURL portletURL = PortletURLFactoryUtil.create(
113                                                    actionRequest, portletConfig.getPortletName(),
114                                                    themeDisplay.getPlid(), PortletRequest.RENDER_PHASE);
115    
116                                            redirect = portletURL.toString();
117                                    }
118                            }
119    
120                            WindowState windowState = actionRequest.getWindowState();
121    
122                            if (!windowState.equals(LiferayWindowState.POP_UP)) {
123                                    sendRedirect(actionRequest, actionResponse);
124                            }
125                            else if (Validator.isNotNull(redirect)) {
126                                    actionResponse.sendRedirect(redirect);
127                            }
128                    }
129                    catch (Exception e) {
130                            if (e instanceof NoSuchArticleException ||
131                                    e instanceof NoSuchFolderException ||
132                                    e instanceof PrincipalException) {
133    
134                                    SessionErrors.add(actionRequest, e.getClass());
135    
136                                    setForward(actionRequest, "portlet.journal.error");
137                            }
138                            else if (e instanceof DuplicateArticleIdException ||
139                                             e instanceof DuplicateFolderNameException ||
140                                             e instanceof NoSuchFolderException) {
141    
142                                    SessionErrors.add(actionRequest, e.getClass());
143                            }
144                            else if (e instanceof AssetCategoryException ||
145                                             e instanceof AssetTagException) {
146    
147                                    SessionErrors.add(actionRequest, e.getClass(), e);
148                            }
149                            else {
150                                    throw e;
151                            }
152                    }
153            }
154    
155            @Override
156            public ActionForward render(
157                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
158                            RenderRequest renderRequest, RenderResponse renderResponse)
159                    throws Exception {
160    
161                    try {
162                            ActionUtil.getArticles(renderRequest);
163                            ActionUtil.getFolders(renderRequest);
164                    }
165                    catch (Exception e) {
166                            if (e instanceof NoSuchArticleException ||
167                                    e instanceof PrincipalException) {
168    
169                                    SessionErrors.add(renderRequest, e.getClass());
170    
171                                    return mapping.findForward("portlet.journal.error");
172                            }
173                            else {
174                                    throw e;
175                            }
176                    }
177    
178                    String forward = "portlet.journal.edit_entry";
179    
180                    return mapping.findForward(getForward(renderRequest, forward));
181            }
182    
183            protected void deleteEntries(
184                            LiferayPortletConfig liferayPortletConfig,
185                            ActionRequest actionRequest, boolean moveToTrash)
186                    throws Exception {
187    
188                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
189                            WebKeys.THEME_DISPLAY);
190    
191                    long[] deleteFolderIds = StringUtil.split(
192                            ParamUtil.getString(actionRequest, "folderIds"), 0L);
193    
194                    for (long deleteFolderId : deleteFolderIds) {
195                            JournalFolderServiceUtil.deleteFolder(deleteFolderId);
196                    }
197    
198                    String[] deleteArticleIds = StringUtil.split(
199                            ParamUtil.getString(actionRequest, "articleIds"));
200    
201                    for (String deleteArticleId : deleteArticleIds) {
202                            if (moveToTrash) {
203                                    JournalArticleServiceUtil.moveArticleToTrash(
204                                            themeDisplay.getScopeGroupId(), deleteArticleId);
205                            }
206                            else {
207                                    ActionUtil.deleteArticle(actionRequest, deleteArticleId);
208                            }
209                    }
210    
211                    if (moveToTrash && (deleteArticleIds.length > 0)) {
212                            Map<String, String[]> data = new HashMap<String, String[]>();
213    
214                            data.put(
215                                    "restoreEntryIds", ArrayUtil.toStringArray(deleteArticleIds));
216    
217                            SessionMessages.add(
218                                    actionRequest,
219                                    liferayPortletConfig.getPortletId() +
220                                            SessionMessages.KEY_SUFFIX_DELETE_SUCCESS_DATA, data);
221    
222                            SessionMessages.add(
223                                    actionRequest,
224                                    liferayPortletConfig.getPortletId() +
225                                            SessionMessages.KEY_SUFFIX_HIDE_DEFAULT_SUCCESS_MESSAGE);
226                    }
227            }
228    
229            protected void expireEntries(ActionRequest actionRequest) throws Exception {
230                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
231                            WebKeys.THEME_DISPLAY);
232    
233                    long[] expireFolderIds = StringUtil.split(
234                            ParamUtil.getString(actionRequest, "folderIds"), 0L);
235    
236                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
237                            JournalArticle.class.getName(), actionRequest);
238    
239                    for (long expireFolderId : expireFolderIds) {
240                            ActionUtil.expireFolder(
241                                    themeDisplay.getScopeGroupId(), expireFolderId, serviceContext);
242                    }
243    
244                    String[] expireArticleIds = StringUtil.split(
245                            ParamUtil.getString(actionRequest, "articleIds"));
246    
247                    for (String expireArticleId : expireArticleIds) {
248                            ActionUtil.expireArticle(actionRequest, expireArticleId);
249                    }
250            }
251    
252            protected void moveEntries(ActionRequest actionRequest) throws Exception {
253                    long newFolderId = ParamUtil.getLong(actionRequest, "newFolderId");
254    
255                    long[] folderIds = StringUtil.split(
256                            ParamUtil.getString(actionRequest, "folderIds"), 0L);
257    
258                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
259                            JournalArticle.class.getName(), actionRequest);
260    
261                    for (long folderId : folderIds) {
262                            JournalFolderServiceUtil.moveFolder(
263                                    folderId, newFolderId, serviceContext);
264                    }
265    
266                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
267                            WebKeys.THEME_DISPLAY);
268    
269                    String[] articleIds = StringUtil.split(
270                            ParamUtil.getString(actionRequest, "articleIds"));
271    
272                    for (String articleId : articleIds) {
273                            JournalArticleServiceUtil.moveArticle(
274                                    themeDisplay.getScopeGroupId(), articleId, newFolderId);
275                    }
276            }
277    
278    }