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.kernel.util.StringPool;
023    import com.liferay.portal.kernel.util.StringUtil;
024    import com.liferay.portal.kernel.util.Validator;
025    import com.liferay.portal.model.CompanyConstants;
026    import com.liferay.portal.model.Group;
027    import com.liferay.portal.model.LayoutConstants;
028    import com.liferay.portal.security.permission.PermissionChecker;
029    import com.liferay.portal.util.PortalUtil;
030    import com.liferay.portal.util.PortletKeys;
031    import com.liferay.portlet.PortletURLFactoryUtil;
032    import com.liferay.portlet.documentlibrary.NoSuchDirectoryException;
033    import com.liferay.portlet.documentlibrary.store.DLStoreUtil;
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.trash.util.TrashUtil;
038    import com.liferay.portlet.wiki.asset.WikiPageAssetRenderer;
039    import com.liferay.portlet.wiki.model.WikiPage;
040    import com.liferay.portlet.wiki.model.WikiPageConstants;
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.WikiPagePermission;
046    
047    import java.util.Date;
048    
049    import javax.portlet.PortletRequest;
050    import javax.portlet.PortletURL;
051    
052    /**
053     * Implements trash handling for the wiki page entity.
054     *
055     * @author Eudaldo Alonso
056     */
057    public class WikiPageTrashHandler extends BaseTrashHandler {
058    
059            public static final String CLASS_NAME = WikiPage.class.getName();
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 restoredTitle = page.getTitle();
074    
075                    if (Validator.isNotNull(newName)) {
076                            restoredTitle = newName;
077                    }
078    
079                    String originalTitle = TrashUtil.stripTrashNamespace(restoredTitle);
080    
081                    WikiPage duplicatePage = WikiPageLocalServiceUtil.fetchPage(
082                            containerModelId, originalTitle, page.getVersion());
083    
084                    if (duplicatePage != null) {
085                            DuplicateEntryException dee = new DuplicateEntryException();
086    
087                            dee.setDuplicateEntryId(duplicatePage.getPageId());
088                            dee.setOldName(duplicatePage.getTitle());
089                            dee.setTrashEntryId(trashEntry.getEntryId());
090    
091                            throw dee;
092                    }
093            }
094    
095            @Override
096            public void deleteTrashAttachments(Group group, Date date)
097                    throws PortalException, SystemException {
098    
099                    long repositoryId = CompanyConstants.SYSTEM;
100    
101                    String[] fileNames = null;
102    
103                    try {
104                            fileNames = DLStoreUtil.getFileNames(
105                                    group.getCompanyId(), repositoryId, "wiki");
106                    }
107                    catch (NoSuchDirectoryException nsde) {
108                            return;
109                    }
110    
111                    for (String fileName : fileNames) {
112                            String fileTitle = StringUtil.extractLast(
113                                    fileName, StringPool.FORWARD_SLASH);
114    
115                            if (fileTitle.startsWith(TrashUtil.TRASH_ATTACHMENTS_DIR)) {
116                                    String[] attachmentFileNames = DLStoreUtil.getFileNames(
117                                            group.getCompanyId(), repositoryId,
118                                            WikiPageConstants.BASE_ATTACHMENTS_DIR + fileTitle);
119    
120                                    TrashUtil.deleteEntriesAttachments(
121                                            group.getCompanyId(), repositoryId, date,
122                                            attachmentFileNames);
123                            }
124                    }
125            }
126    
127            public void deleteTrashEntries(long[] classPKs, boolean checkPermission)
128                    throws PortalException, SystemException {
129    
130                    for (long classPK : classPKs) {
131                            WikiPage page = WikiPageLocalServiceUtil.getPage(classPK);
132    
133                            if (checkPermission) {
134                                    WikiPageServiceUtil.deletePage(
135                                            page.getNodeId(), page.getTitle());
136                            }
137                            else {
138                                    WikiPageLocalServiceUtil.deletePage(
139                                            page.getNodeId(), page.getTitle());
140                            }
141                    }
142            }
143    
144            public String getClassName() {
145                    return CLASS_NAME;
146            }
147    
148            @Override
149            public String getRestoreLink(PortletRequest portletRequest, long classPK)
150                    throws PortalException, SystemException {
151    
152                    WikiPage page = WikiPageLocalServiceUtil.getPage(classPK);
153    
154                    long plid = PortalUtil.getPlidFromPortletId(
155                            page.getGroupId(), PortletKeys.WIKI);
156    
157                    if (plid == LayoutConstants.DEFAULT_PLID) {
158                            plid = PortalUtil.getControlPanelPlid(portletRequest);
159                    }
160    
161                    PortletURL portletURL = PortletURLFactoryUtil.create(
162                            portletRequest, PortletKeys.WIKI, plid,
163                            PortletRequest.RENDER_PHASE);
164    
165                    portletURL.setParameter("struts_action", "/wiki/view");
166                    portletURL.setParameter("nodeName", page.getNode().getName());
167                    portletURL.setParameter("title", HtmlUtil.unescape(page.getTitle()));
168    
169                    return portletURL.toString();
170            }
171    
172            @Override
173            public String getRestoreMessage(PortletRequest portletRequest, long classPK)
174                    throws PortalException, SystemException {
175    
176                    WikiPage page = WikiPageLocalServiceUtil.getPage(classPK);
177    
178                    return page.getTitle();
179            }
180    
181            @Override
182            public TrashRenderer getTrashRenderer(long classPK)
183                    throws PortalException, SystemException {
184    
185                    WikiPage page = WikiPageLocalServiceUtil.getPage(classPK);
186    
187                    return new WikiPageAssetRenderer(page);
188            }
189    
190            public boolean isInTrash(long classPK)
191                    throws PortalException, SystemException {
192    
193                    WikiPage page = WikiPageLocalServiceUtil.getPage(classPK);
194    
195                    if (page.isInTrash() || page.isInTrashFolder()) {
196                            return true;
197                    }
198    
199                    return false;
200            }
201    
202            public void restoreTrashEntries(long[] classPKs)
203                    throws PortalException, SystemException {
204    
205                    for (long classPK : classPKs) {
206                            WikiPageServiceUtil.restorePageFromTrash(classPK);
207                    }
208            }
209    
210            @Override
211            public void updateTitle(long classPK, String name)
212                    throws PortalException, SystemException {
213    
214                    WikiPage page = WikiPageLocalServiceUtil.getPage(classPK);
215    
216                    page.setTitle(name);
217    
218                    WikiPageLocalServiceUtil.updateWikiPage(page);
219    
220                    WikiPageResource pageResource =
221                            WikiPageResourceLocalServiceUtil.getPageResource(
222                                    page.getResourcePrimKey());
223    
224                    pageResource.setTitle(name);
225    
226                    WikiPageResourceLocalServiceUtil.updateWikiPageResource(pageResource);
227            }
228    
229            @Override
230            protected boolean hasPermission(
231                            PermissionChecker permissionChecker, long classPK, String actionId)
232                    throws PortalException, SystemException {
233    
234                    return WikiPagePermission.contains(
235                            permissionChecker, classPK, actionId);
236            }
237    
238    }