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