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