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