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