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