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