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            public void deleteTrashEntry(long classPK)
098                    throws PortalException, SystemException {
099    
100                    WikiPage page = WikiPageLocalServiceUtil.getPage(classPK);
101    
102                    WikiPageLocalServiceUtil.deletePage(page.getNodeId(), page.getTitle());
103            }
104    
105            public String getClassName() {
106                    return WikiPage.class.getName();
107            }
108    
109            @Override
110            public String getContainerModelClassName() {
111                    return WikiNode.class.getName();
112            }
113    
114            @Override
115            public String getContainerModelName() {
116                    return "wiki-node";
117            }
118    
119            @Override
120            public ContainerModel getParentContainerModel(long classPK)
121                    throws PortalException, SystemException {
122    
123                    WikiPage page = WikiPageLocalServiceUtil.getPage(classPK);
124    
125                    return page.getNode();
126            }
127    
128            @Override
129            public List<ContainerModel> getParentContainerModels(long classPK)
130                    throws PortalException, SystemException {
131    
132                    List<ContainerModel> containerModels = new ArrayList<ContainerModel>();
133    
134                    containerModels.add(getParentContainerModel(classPK));
135    
136                    return containerModels;
137            }
138    
139            @Override
140            public String getRestoreLink(PortletRequest portletRequest, long classPK)
141                    throws PortalException, SystemException {
142    
143                    String portletId = PortletKeys.WIKI;
144    
145                    WikiPage page = WikiPageLocalServiceUtil.getPage(classPK);
146    
147                    long plid = PortalUtil.getPlidFromPortletId(
148                            page.getGroupId(), PortletKeys.WIKI);
149    
150                    if (plid == LayoutConstants.DEFAULT_PLID) {
151                            portletId = PortletKeys.WIKI_ADMIN;
152    
153                            plid = PortalUtil.getControlPanelPlid(portletRequest);
154                    }
155    
156                    PortletURL portletURL = PortletURLFactoryUtil.create(
157                            portletRequest, portletId, plid, PortletRequest.RENDER_PHASE);
158    
159                    WikiNode node = page.getNode();
160    
161                    if (portletId.equals(PortletKeys.WIKI)) {
162                            portletURL.setParameter("struts_action", "/wiki/view");
163                    }
164                    else {
165                            portletURL.setParameter("struts_action", "/wiki_admin/view");
166                    }
167    
168                    portletURL.setParameter("nodeName", node.getName());
169                    portletURL.setParameter("title", HtmlUtil.unescape(page.getTitle()));
170    
171                    return portletURL.toString();
172            }
173    
174            @Override
175            public String getRestoreMessage(PortletRequest portletRequest, long classPK)
176                    throws PortalException, SystemException {
177    
178                    WikiPage page = WikiPageLocalServiceUtil.getPage(classPK);
179    
180                    return page.getTitle();
181            }
182    
183            @Override
184            public ContainerModel getTrashContainer(long classPK)
185                    throws PortalException, SystemException {
186    
187                    WikiPage page = WikiPageLocalServiceUtil.getPage(classPK);
188    
189                    return page.getTrashContainer();
190            }
191    
192            @Override
193            public TrashRenderer getTrashRenderer(long classPK)
194                    throws PortalException, SystemException {
195    
196                    WikiPage page = WikiPageLocalServiceUtil.getPage(classPK);
197    
198                    return new WikiPageAssetRenderer(page);
199            }
200    
201            @Override
202            public boolean hasTrashPermission(
203                            PermissionChecker permissionChecker, long groupId, long classPK,
204                            String trashActionId)
205                    throws PortalException, SystemException {
206    
207                    if (trashActionId.equals(TrashActionKeys.MOVE)) {
208                            WikiNodePermission.check(
209                                    permissionChecker, classPK, ActionKeys.ADD_PAGE);
210                    }
211    
212                    return super.hasTrashPermission(
213                            permissionChecker, groupId, classPK, trashActionId);
214            }
215    
216            public boolean isInTrash(long classPK)
217                    throws PortalException, SystemException {
218    
219                    WikiPage page = WikiPageLocalServiceUtil.getPage(classPK);
220    
221                    return page.isInTrash();
222            }
223    
224            @Override
225            public boolean isInTrashContainer(long classPK)
226                    throws PortalException, SystemException {
227    
228                    WikiPage page = WikiPageLocalServiceUtil.getPage(classPK);
229    
230                    return page.isInTrashContainer();
231            }
232    
233            @Override
234            public void restoreRelatedTrashEntry(String className, long classPK)
235                    throws PortalException, SystemException {
236    
237                    if (!className.equals(DLFileEntry.class.getName())) {
238                            return;
239                    }
240    
241                    FileEntry fileEntry = PortletFileRepositoryUtil.getPortletFileEntry(
242                            classPK);
243    
244                    WikiPage page = WikiPageAttachmentsUtil.getPage(classPK);
245    
246                    WikiPageServiceUtil.restorePageAttachmentFromTrash(
247                            page.getNodeId(), page.getTitle(), fileEntry.getTitle());
248    
249            }
250    
251            public void restoreTrashEntry(long userId, long classPK)
252                    throws PortalException, SystemException {
253    
254                    WikiPage page = WikiPageLocalServiceUtil.getPage(classPK);
255    
256                    WikiPageLocalServiceUtil.restorePageFromTrash(userId, page);
257            }
258    
259            @Override
260            public void updateTitle(long classPK, String name)
261                    throws PortalException, SystemException {
262    
263                    WikiPage page = WikiPageLocalServiceUtil.getPage(classPK);
264    
265                    page.setTitle(name);
266    
267                    WikiPageLocalServiceUtil.updateWikiPage(page);
268    
269                    WikiPageResource pageResource =
270                            WikiPageResourceLocalServiceUtil.getPageResource(
271                                    page.getResourcePrimKey());
272    
273                    pageResource.setTitle(name);
274    
275                    WikiPageResourceLocalServiceUtil.updateWikiPageResource(pageResource);
276            }
277    
278            @Override
279            protected boolean hasPermission(
280                            PermissionChecker permissionChecker, long classPK, String actionId)
281                    throws PortalException, SystemException {
282    
283                    return WikiPagePermission.contains(
284                            permissionChecker, classPK, actionId);
285            }
286    
287    }