001    /**
002     * Copyright (c) 2000-present 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.trash.TrashHandler;
019    import com.liferay.portal.kernel.trash.TrashHandlerRegistryUtil;
020    import com.liferay.portal.kernel.trash.TrashRenderer;
021    import com.liferay.portal.kernel.util.Validator;
022    import com.liferay.portal.kernel.util.WebKeys;
023    import com.liferay.portal.kernel.workflow.WorkflowConstants;
024    import com.liferay.portal.model.LayoutConstants;
025    import com.liferay.portal.security.permission.PermissionChecker;
026    import com.liferay.portal.theme.ThemeDisplay;
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.trash.RestoreEntryException;
031    import com.liferay.portlet.trash.model.TrashEntry;
032    import com.liferay.portlet.wiki.asset.WikiNodeTrashRenderer;
033    import com.liferay.portlet.wiki.model.WikiNode;
034    import com.liferay.portlet.wiki.model.WikiPage;
035    import com.liferay.portlet.wiki.service.WikiNodeLocalServiceUtil;
036    import com.liferay.portlet.wiki.service.WikiPageLocalServiceUtil;
037    import com.liferay.portlet.wiki.service.permission.WikiNodePermission;
038    
039    import java.util.ArrayList;
040    import java.util.List;
041    
042    import javax.portlet.PortletRequest;
043    import javax.portlet.PortletURL;
044    
045    /**
046     * Implements trash handling for the wiki node entity.
047     *
048     * @author Eudaldo Alonso
049     * @author Roberto D??az
050     */
051    public class WikiNodeTrashHandler extends BaseWikiTrashHandler {
052    
053            @Override
054            public void checkRestorableEntry(
055                            TrashEntry trashEntry, long containerModelId, String newName)
056                    throws PortalException {
057    
058                    WikiNode node = WikiNodeLocalServiceUtil.getNode(
059                            trashEntry.getClassPK());
060    
061                    String originalTitle = trashEntry.getTypeSettingsProperty("title");
062    
063                    if (Validator.isNotNull(newName)) {
064                            originalTitle = newName;
065                    }
066    
067                    WikiNode duplicateNode = WikiNodeLocalServiceUtil.fetchNode(
068                            node.getGroupId(), originalTitle);
069    
070                    if (duplicateNode != null) {
071                            RestoreEntryException ree = new RestoreEntryException(
072                                    RestoreEntryException.DUPLICATE);
073    
074                            ree.setDuplicateEntryId(duplicateNode.getNodeId());
075                            ree.setOldName(duplicateNode.getName());
076                            ree.setTrashEntryId(trashEntry.getEntryId());
077    
078                            throw ree;
079                    }
080            }
081    
082            @Override
083            public void deleteTrashEntry(long classPK) throws PortalException {
084                    WikiNodeLocalServiceUtil.deleteNode(classPK);
085            }
086    
087            @Override
088            public String getClassName() {
089                    return WikiNode.class.getName();
090            }
091    
092            @Override
093            public String getRestoreContainedModelLink(
094                            PortletRequest portletRequest, long classPK)
095                    throws PortalException {
096    
097                    WikiNode node = WikiNodeLocalServiceUtil.getNode(classPK);
098    
099                    PortletURL portletURL = getRestoreURL(portletRequest, classPK, false);
100    
101                    portletURL.setParameter("nodeId", String.valueOf(node.getNodeId()));
102    
103                    return portletURL.toString();
104            }
105    
106            @Override
107            public String getRestoreContainerModelLink(
108                            PortletRequest portletRequest, long classPK)
109                    throws PortalException {
110    
111                    PortletURL portletURL = getRestoreURL(portletRequest, classPK, true);
112    
113                    return portletURL.toString();
114            }
115    
116            @Override
117            public String getRestoreMessage(
118                    PortletRequest portletRequest, long classPK) {
119    
120                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
121                            WebKeys.THEME_DISPLAY);
122    
123                    return themeDisplay.translate("wiki");
124            }
125    
126            @Override
127            public String getTrashContainedModelName() {
128                    return "wiki-pages";
129            }
130    
131            @Override
132            public int getTrashContainedModelsCount(long classPK) {
133                    return WikiPageLocalServiceUtil.getPagesCount(
134                            classPK, true, WorkflowConstants.STATUS_IN_TRASH);
135            }
136    
137            @Override
138            public List<TrashRenderer> getTrashContainedModelTrashRenderers(
139                            long classPK, int start, int end)
140                    throws PortalException {
141    
142                    List<TrashRenderer> trashRenderers = new ArrayList<TrashRenderer>();
143    
144                    List<WikiPage> pages = WikiPageLocalServiceUtil.getPages(
145                            classPK, true, WorkflowConstants.STATUS_IN_TRASH, start, end);
146    
147                    for (WikiPage page : pages) {
148                            WikiPage redirectPage = page.getRedirectPage();
149    
150                            if ((redirectPage != null) && redirectPage.isInTrash()) {
151                                    continue;
152                            }
153    
154                            TrashHandler trashHandler =
155                                    TrashHandlerRegistryUtil.getTrashHandler(
156                                            WikiPage.class.getName());
157    
158                            TrashRenderer trashRenderer = trashHandler.getTrashRenderer(
159                                    page.getResourcePrimKey());
160    
161                            trashRenderers.add(trashRenderer);
162                    }
163    
164                    return trashRenderers;
165            }
166    
167            @Override
168            public TrashEntry getTrashEntry(long classPK) throws PortalException {
169                    WikiNode node = WikiNodeLocalServiceUtil.getNode(classPK);
170    
171                    return node.getTrashEntry();
172            }
173    
174            @Override
175            public TrashRenderer getTrashRenderer(long classPK) throws PortalException {
176                    WikiNode node = WikiNodeLocalServiceUtil.getNode(classPK);
177    
178                    return new WikiNodeTrashRenderer(node);
179            }
180    
181            @Override
182            public boolean isContainerModel() {
183                    return true;
184            }
185    
186            @Override
187            public boolean isInTrash(long classPK) throws PortalException {
188                    WikiNode node = WikiNodeLocalServiceUtil.getNode(classPK);
189    
190                    return node.isInTrash();
191            }
192    
193            @Override
194            public void restoreTrashEntry(long userId, long classPK)
195                    throws PortalException {
196    
197                    WikiNode node = WikiNodeLocalServiceUtil.getNode(classPK);
198    
199                    WikiNodeLocalServiceUtil.restoreNodeFromTrash(userId, node);
200            }
201    
202            @Override
203            public void updateTitle(long classPK, String name) throws PortalException {
204                    WikiNode node = WikiNodeLocalServiceUtil.getNode(classPK);
205    
206                    node.setName(name);
207    
208                    WikiNodeLocalServiceUtil.updateWikiNode(node);
209            }
210    
211            protected PortletURL getRestoreURL(
212                            PortletRequest portletRequest, long classPK,
213                            boolean isContainerModel)
214                    throws PortalException {
215    
216                    String portletId = PortletKeys.WIKI;
217    
218                    WikiNode node = WikiNodeLocalServiceUtil.getNode(classPK);
219    
220                    long plid = PortalUtil.getPlidFromPortletId(
221                            node.getGroupId(), PortletKeys.WIKI);
222    
223                    if (plid == LayoutConstants.DEFAULT_PLID) {
224                            portletId = PortletKeys.WIKI_ADMIN;
225    
226                            plid = PortalUtil.getControlPanelPlid(portletRequest);
227                    }
228    
229                    PortletURL portletURL = PortletURLFactoryUtil.create(
230                            portletRequest, portletId, plid, PortletRequest.RENDER_PHASE);
231    
232                    if (!isContainerModel) {
233                            if (portletId.equals(PortletKeys.WIKI)) {
234                                    portletURL.setParameter(
235                                            "struts_action", "/wiki/view_all_pages");
236                            }
237                            else {
238                                    portletURL.setParameter(
239                                            "struts_action", "/wiki_admin/view_all_pages");
240                            }
241                    }
242    
243                    return portletURL;
244            }
245    
246            @Override
247            protected boolean hasPermission(
248                            PermissionChecker permissionChecker, long classPK, String actionId)
249                    throws PortalException {
250    
251                    return WikiNodePermission.contains(
252                            permissionChecker, classPK, actionId);
253            }
254    
255    }