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