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