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