001    /**
002     * Copyright (c) 2000-2013 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.wiki.trash;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.exception.SystemException;
019    import com.liferay.portal.kernel.repository.model.FileEntry;
020    import com.liferay.portal.kernel.trash.BaseTrashHandler;
021    import com.liferay.portal.kernel.trash.TrashActionKeys;
022    import com.liferay.portal.kernel.trash.TrashRenderer;
023    import com.liferay.portal.kernel.util.HtmlUtil;
024    import com.liferay.portal.kernel.util.Validator;
025    import com.liferay.portal.kernel.workflow.WorkflowConstants;
026    import com.liferay.portal.model.ContainerModel;
027    import com.liferay.portal.model.LayoutConstants;
028    import com.liferay.portal.model.SystemEvent;
029    import com.liferay.portal.model.TrashedModel;
030    import com.liferay.portal.portletfilerepository.PortletFileRepositoryUtil;
031    import com.liferay.portal.security.permission.ActionKeys;
032    import com.liferay.portal.security.permission.PermissionChecker;
033    import com.liferay.portal.util.PortalUtil;
034    import com.liferay.portal.util.PortletKeys;
035    import com.liferay.portlet.PortletURLFactoryUtil;
036    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
037    import com.liferay.portlet.trash.DuplicateEntryException;
038    import com.liferay.portlet.trash.TrashEntryConstants;
039    import com.liferay.portlet.trash.model.TrashEntry;
040    import com.liferay.portlet.wiki.asset.WikiPageAssetRenderer;
041    import com.liferay.portlet.wiki.model.WikiNode;
042    import com.liferay.portlet.wiki.model.WikiPage;
043    import com.liferay.portlet.wiki.model.WikiPageResource;
044    import com.liferay.portlet.wiki.service.WikiPageLocalServiceUtil;
045    import com.liferay.portlet.wiki.service.WikiPageResourceLocalServiceUtil;
046    import com.liferay.portlet.wiki.service.WikiPageServiceUtil;
047    import com.liferay.portlet.wiki.service.permission.WikiNodePermission;
048    import com.liferay.portlet.wiki.service.permission.WikiPagePermission;
049    import com.liferay.portlet.wiki.util.WikiPageAttachmentsUtil;
050    
051    import java.util.ArrayList;
052    import java.util.List;
053    
054    import javax.portlet.PortletRequest;
055    import javax.portlet.PortletURL;
056    
057    /**
058     * Implements trash handling for the wiki page entity.
059     *
060     * @author Eudaldo Alonso
061     */
062    public class WikiPageTrashHandler extends BaseTrashHandler {
063    
064            @Override
065            public SystemEvent addDeletionSystemEvent(
066                            long userId, long groupId, long classPK, String classUuid,
067                            String referrerClassName)
068                    throws PortalException, SystemException {
069    
070                    WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
071                            classPK, WorkflowConstants.STATUS_ANY, false);
072    
073                    return super.addDeletionSystemEvent(
074                            userId, groupId, page.getPageId(), classUuid, referrerClassName);
075            }
076    
077            @Override
078            public void checkDuplicateTrashEntry(
079                            TrashEntry trashEntry, long containerModelId, String newName)
080                    throws PortalException, SystemException {
081    
082                    WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
083                            trashEntry.getClassPK(), WorkflowConstants.STATUS_ANY, false);
084    
085                    if (containerModelId == TrashEntryConstants.DEFAULT_CONTAINER_ID) {
086                            containerModelId = page.getNodeId();
087                    }
088    
089                    String originalTitle = trashEntry.getTypeSettingsProperty("title");
090    
091                    if (Validator.isNotNull(newName)) {
092                            originalTitle = newName;
093                    }
094    
095                    WikiPageResource pageResource =
096                            WikiPageResourceLocalServiceUtil.fetchPageResource(
097                                    containerModelId, originalTitle);
098    
099                    if (pageResource != null) {
100                            DuplicateEntryException dee = new DuplicateEntryException();
101    
102                            WikiPage duplicatePage = WikiPageLocalServiceUtil.getLatestPage(
103                                    pageResource.getResourcePrimKey(), WorkflowConstants.STATUS_ANY,
104                                    false);
105    
106                            dee.setDuplicateEntryId(duplicatePage.getResourcePrimKey());
107                            dee.setOldName(duplicatePage.getTitle());
108                            dee.setTrashEntryId(trashEntry.getEntryId());
109    
110                            throw dee;
111                    }
112            }
113    
114            @Override
115            public void deleteTrashEntry(long classPK)
116                    throws PortalException, SystemException {
117    
118                    WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
119                            classPK, WorkflowConstants.STATUS_ANY, false);
120    
121                    WikiPageLocalServiceUtil.deletePage(page);
122            }
123    
124            @Override
125            public String getClassName() {
126                    return WikiPage.class.getName();
127            }
128    
129            @Override
130            public String getContainerModelClassName() {
131                    return WikiNode.class.getName();
132            }
133    
134            @Override
135            public String getContainerModelName() {
136                    return "wiki-node";
137            }
138    
139            @Override
140            public ContainerModel getParentContainerModel(long classPK)
141                    throws PortalException, SystemException {
142    
143                    WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
144                            classPK, WorkflowConstants.STATUS_ANY, false);
145    
146                    return page.getNode();
147            }
148    
149            @Override
150            public ContainerModel getParentContainerModel(TrashedModel trashedModel) {
151                    WikiPage page = (WikiPage)trashedModel;
152    
153                    return page.getNode();
154            }
155    
156            @Override
157            public List<ContainerModel> getParentContainerModels(long classPK)
158                    throws PortalException, SystemException {
159    
160                    List<ContainerModel> containerModels = new ArrayList<ContainerModel>();
161    
162                    containerModels.add(getParentContainerModel(classPK));
163    
164                    return containerModels;
165            }
166    
167            @Override
168            public String getRestoreContainedModelLink(
169                            PortletRequest portletRequest, long classPK)
170                    throws PortalException, SystemException {
171    
172                    WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
173                            classPK, WorkflowConstants.STATUS_ANY, false);
174    
175                    WikiNode node = page.getNode();
176    
177                    PortletURL portletURL = getRestoreURL(portletRequest, classPK, false);
178    
179                    portletURL.setParameter("nodeName", node.getName());
180                    portletURL.setParameter("title", HtmlUtil.unescape(page.getTitle()));
181    
182                    return portletURL.toString();
183            }
184    
185            @Override
186            public String getRestoreContainerModelLink(
187                            PortletRequest portletRequest, long classPK)
188                    throws PortalException, SystemException {
189    
190                    WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
191                            classPK, WorkflowConstants.STATUS_ANY, false);
192    
193                    WikiNode node = page.getNode();
194    
195                    PortletURL portletURL = getRestoreURL(portletRequest, classPK, true);
196    
197                    portletURL.setParameter("nodeId", String.valueOf(node.getNodeId()));
198    
199                    return portletURL.toString();
200            }
201    
202            @Override
203            public String getRestoreMessage(PortletRequest portletRequest, long classPK)
204                    throws PortalException, SystemException {
205    
206                    WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
207                            classPK, WorkflowConstants.STATUS_ANY, false);
208    
209                    WikiNode node = page.getNode();
210    
211                    return node.getName();
212            }
213    
214            @Override
215            public TrashEntry getTrashEntry(long classPK)
216                    throws PortalException, SystemException {
217    
218                    WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
219                            classPK, WorkflowConstants.STATUS_ANY, false);
220    
221                    return page.getTrashEntry();
222            }
223    
224            @Override
225            public TrashRenderer getTrashRenderer(long classPK)
226                    throws PortalException, SystemException {
227    
228                    WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
229                            classPK, WorkflowConstants.STATUS_ANY, false);
230    
231                    return new WikiPageAssetRenderer(page);
232            }
233    
234            @Override
235            public boolean hasTrashPermission(
236                            PermissionChecker permissionChecker, long groupId, long classPK,
237                            String trashActionId)
238                    throws PortalException, SystemException {
239    
240                    if (trashActionId.equals(TrashActionKeys.MOVE)) {
241                            WikiNodePermission.check(
242                                    permissionChecker, classPK, ActionKeys.ADD_PAGE);
243                    }
244    
245                    return super.hasTrashPermission(
246                            permissionChecker, groupId, classPK, trashActionId);
247            }
248    
249            @Override
250            public boolean isInTrash(long classPK)
251                    throws PortalException, SystemException {
252    
253                    WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
254                            classPK, WorkflowConstants.STATUS_ANY, false);
255    
256                    return page.isInTrash();
257            }
258    
259            @Override
260            public boolean isInTrashContainer(long classPK)
261                    throws PortalException, SystemException {
262    
263                    WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
264                            classPK, WorkflowConstants.STATUS_ANY, false);
265    
266                    return page.isInTrashContainer();
267            }
268    
269            @Override
270            public void restoreRelatedTrashEntry(String className, long classPK)
271                    throws PortalException, SystemException {
272    
273                    if (!className.equals(DLFileEntry.class.getName())) {
274                            return;
275                    }
276    
277                    FileEntry fileEntry = PortletFileRepositoryUtil.getPortletFileEntry(
278                            classPK);
279    
280                    WikiPage page = WikiPageAttachmentsUtil.getPage(classPK);
281    
282                    WikiPageServiceUtil.restorePageAttachmentFromTrash(
283                            page.getNodeId(), page.getTitle(), fileEntry.getTitle());
284            }
285    
286            @Override
287            public void restoreTrashEntry(long userId, long classPK)
288                    throws PortalException, SystemException {
289    
290                    WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
291                            classPK, WorkflowConstants.STATUS_ANY, false);
292    
293                    WikiPageLocalServiceUtil.restorePageFromTrash(userId, page);
294            }
295    
296            @Override
297            public void updateTitle(long classPK, String name)
298                    throws PortalException, SystemException {
299    
300                    WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
301                            classPK, WorkflowConstants.STATUS_ANY, false);
302    
303                    page.setTitle(name);
304    
305                    WikiPageLocalServiceUtil.updateWikiPage(page);
306    
307                    WikiPageResource pageResource =
308                            WikiPageResourceLocalServiceUtil.getPageResource(
309                                    page.getResourcePrimKey());
310    
311                    pageResource.setTitle(name);
312    
313                    WikiPageResourceLocalServiceUtil.updateWikiPageResource(pageResource);
314            }
315    
316            protected PortletURL getRestoreURL(
317                            PortletRequest portletRequest, long classPK,
318                            boolean isContainerModel)
319                    throws PortalException, SystemException {
320    
321                    String portletId = PortletKeys.WIKI;
322    
323                    WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
324                            classPK, WorkflowConstants.STATUS_ANY, false);
325    
326                    long plid = PortalUtil.getPlidFromPortletId(
327                            page.getGroupId(), PortletKeys.WIKI);
328    
329                    if (plid == LayoutConstants.DEFAULT_PLID) {
330                            portletId = PortletKeys.WIKI_ADMIN;
331    
332                            plid = PortalUtil.getControlPanelPlid(portletRequest);
333                    }
334    
335                    PortletURL portletURL = PortletURLFactoryUtil.create(
336                            portletRequest, portletId, plid, PortletRequest.RENDER_PHASE);
337    
338                    if (isContainerModel) {
339                            if (portletId.equals(PortletKeys.WIKI)) {
340                                    portletURL.setParameter(
341                                            "struts_action", "/wiki/view_all_pages");
342                            }
343                            else {
344                                    portletURL.setParameter(
345                                            "struts_action", "/wiki_admin/view_all_pages");
346                            }
347                    }
348                    else {
349                            if (portletId.equals(PortletKeys.WIKI)) {
350                                    portletURL.setParameter("struts_action", "/wiki/view");
351                            }
352                            else {
353                                    portletURL.setParameter("struts_action", "/wiki_admin/view");
354                            }
355                    }
356    
357                    return portletURL;
358            }
359    
360            @Override
361            protected boolean hasPermission(
362                            PermissionChecker permissionChecker, long classPK, String actionId)
363                    throws PortalException, SystemException {
364    
365                    return WikiPagePermission.contains(
366                            permissionChecker, classPK, actionId);
367            }
368    
369    }