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