001
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.TrashActionKeys;
022 import com.liferay.portal.kernel.trash.TrashRenderer;
023 import com.liferay.portal.kernel.util.HtmlUtil;
024 import com.liferay.portal.kernel.util.Validator;
025 import com.liferay.portal.kernel.workflow.WorkflowConstants;
026 import com.liferay.portal.model.ContainerModel;
027 import com.liferay.portal.model.LayoutConstants;
028 import com.liferay.portal.model.SystemEvent;
029 import com.liferay.portal.model.TrashedModel;
030 import com.liferay.portal.portletfilerepository.PortletFileRepositoryUtil;
031 import com.liferay.portal.security.permission.ActionKeys;
032 import com.liferay.portal.security.permission.PermissionChecker;
033 import com.liferay.portal.util.PortalUtil;
034 import com.liferay.portal.util.PortletKeys;
035 import com.liferay.portlet.PortletURLFactoryUtil;
036 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
037 import com.liferay.portlet.trash.DuplicateEntryException;
038 import com.liferay.portlet.trash.TrashEntryConstants;
039 import com.liferay.portlet.trash.model.TrashEntry;
040 import com.liferay.portlet.wiki.asset.WikiPageAssetRenderer;
041 import com.liferay.portlet.wiki.model.WikiNode;
042 import com.liferay.portlet.wiki.model.WikiPage;
043 import com.liferay.portlet.wiki.model.WikiPageResource;
044 import com.liferay.portlet.wiki.service.WikiPageLocalServiceUtil;
045 import com.liferay.portlet.wiki.service.WikiPageResourceLocalServiceUtil;
046 import com.liferay.portlet.wiki.service.WikiPageServiceUtil;
047 import com.liferay.portlet.wiki.service.permission.WikiNodePermission;
048 import com.liferay.portlet.wiki.service.permission.WikiPagePermission;
049 import com.liferay.portlet.wiki.util.WikiPageAttachmentsUtil;
050
051 import java.util.ArrayList;
052 import java.util.List;
053
054 import javax.portlet.PortletRequest;
055 import javax.portlet.PortletURL;
056
057
062 public class WikiPageTrashHandler extends BaseTrashHandler {
063
064 @Override
065 public SystemEvent addDeletionSystemEvent(
066 long userId, long groupId, long classPK, String classUuid,
067 String referrerClassName)
068 throws PortalException, SystemException {
069
070 WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
071 classPK, WorkflowConstants.STATUS_ANY, false);
072
073 return super.addDeletionSystemEvent(
074 userId, groupId, page.getPageId(), classUuid, referrerClassName);
075 }
076
077 @Override
078 public void checkDuplicateTrashEntry(
079 TrashEntry trashEntry, long containerModelId, String newName)
080 throws PortalException, SystemException {
081
082 WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
083 trashEntry.getClassPK(), WorkflowConstants.STATUS_ANY, false);
084
085 if (containerModelId == TrashEntryConstants.DEFAULT_CONTAINER_ID) {
086 containerModelId = page.getNodeId();
087 }
088
089 String originalTitle = trashEntry.getTypeSettingsProperty("title");
090
091 if (Validator.isNotNull(newName)) {
092 originalTitle = newName;
093 }
094
095 WikiPageResource pageResource =
096 WikiPageResourceLocalServiceUtil.fetchPageResource(
097 containerModelId, originalTitle);
098
099 if (pageResource != null) {
100 DuplicateEntryException dee = new DuplicateEntryException();
101
102 WikiPage duplicatePage = WikiPageLocalServiceUtil.getLatestPage(
103 pageResource.getResourcePrimKey(), WorkflowConstants.STATUS_ANY,
104 false);
105
106 dee.setDuplicateEntryId(duplicatePage.getResourcePrimKey());
107 dee.setOldName(duplicatePage.getTitle());
108 dee.setTrashEntryId(trashEntry.getEntryId());
109
110 throw dee;
111 }
112 }
113
114 @Override
115 public void deleteTrashEntry(long classPK)
116 throws PortalException, SystemException {
117
118 WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
119 classPK, WorkflowConstants.STATUS_ANY, false);
120
121 WikiPageLocalServiceUtil.deletePage(page);
122 }
123
124 @Override
125 public String getClassName() {
126 return WikiPage.class.getName();
127 }
128
129 @Override
130 public String getContainerModelClassName() {
131 return WikiNode.class.getName();
132 }
133
134 @Override
135 public String getContainerModelName() {
136 return "wiki-node";
137 }
138
139 @Override
140 public ContainerModel getParentContainerModel(long classPK)
141 throws PortalException, SystemException {
142
143 WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
144 classPK, WorkflowConstants.STATUS_ANY, false);
145
146 return page.getNode();
147 }
148
149 @Override
150 public ContainerModel getParentContainerModel(TrashedModel trashedModel) {
151 WikiPage page = (WikiPage)trashedModel;
152
153 return page.getNode();
154 }
155
156 @Override
157 public List<ContainerModel> getParentContainerModels(long classPK)
158 throws PortalException, SystemException {
159
160 List<ContainerModel> containerModels = new ArrayList<ContainerModel>();
161
162 containerModels.add(getParentContainerModel(classPK));
163
164 return containerModels;
165 }
166
167 @Override
168 public String getRestoreContainedModelLink(
169 PortletRequest portletRequest, long classPK)
170 throws PortalException, SystemException {
171
172 WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
173 classPK, WorkflowConstants.STATUS_ANY, false);
174
175 WikiNode node = page.getNode();
176
177 PortletURL portletURL = getRestoreURL(portletRequest, classPK, false);
178
179 portletURL.setParameter("nodeName", node.getName());
180 portletURL.setParameter("title", HtmlUtil.unescape(page.getTitle()));
181
182 return portletURL.toString();
183 }
184
185 @Override
186 public String getRestoreContainerModelLink(
187 PortletRequest portletRequest, long classPK)
188 throws PortalException, SystemException {
189
190 WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
191 classPK, WorkflowConstants.STATUS_ANY, false);
192
193 WikiNode node = page.getNode();
194
195 PortletURL portletURL = getRestoreURL(portletRequest, classPK, true);
196
197 portletURL.setParameter("nodeId", String.valueOf(node.getNodeId()));
198
199 return portletURL.toString();
200 }
201
202 @Override
203 public String getRestoreMessage(PortletRequest portletRequest, long classPK)
204 throws PortalException, SystemException {
205
206 WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
207 classPK, WorkflowConstants.STATUS_ANY, false);
208
209 WikiNode node = page.getNode();
210
211 return node.getName();
212 }
213
214 @Override
215 public TrashEntry getTrashEntry(long classPK)
216 throws PortalException, SystemException {
217
218 WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
219 classPK, WorkflowConstants.STATUS_ANY, false);
220
221 return page.getTrashEntry();
222 }
223
224 @Override
225 public TrashRenderer getTrashRenderer(long classPK)
226 throws PortalException, SystemException {
227
228 WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
229 classPK, WorkflowConstants.STATUS_ANY, false);
230
231 return new WikiPageAssetRenderer(page);
232 }
233
234 @Override
235 public boolean hasTrashPermission(
236 PermissionChecker permissionChecker, long groupId, long classPK,
237 String trashActionId)
238 throws PortalException, SystemException {
239
240 if (trashActionId.equals(TrashActionKeys.MOVE)) {
241 WikiNodePermission.check(
242 permissionChecker, classPK, ActionKeys.ADD_PAGE);
243 }
244
245 return super.hasTrashPermission(
246 permissionChecker, groupId, classPK, trashActionId);
247 }
248
249 @Override
250 public boolean isInTrash(long classPK)
251 throws PortalException, SystemException {
252
253 WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
254 classPK, WorkflowConstants.STATUS_ANY, false);
255
256 return page.isInTrash();
257 }
258
259 @Override
260 public boolean isInTrashContainer(long classPK)
261 throws PortalException, SystemException {
262
263 WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
264 classPK, WorkflowConstants.STATUS_ANY, false);
265
266 return page.isInTrashContainer();
267 }
268
269 @Override
270 public void restoreRelatedTrashEntry(String className, long classPK)
271 throws PortalException, SystemException {
272
273 if (!className.equals(DLFileEntry.class.getName())) {
274 return;
275 }
276
277 FileEntry fileEntry = PortletFileRepositoryUtil.getPortletFileEntry(
278 classPK);
279
280 WikiPage page = WikiPageAttachmentsUtil.getPage(classPK);
281
282 WikiPageServiceUtil.restorePageAttachmentFromTrash(
283 page.getNodeId(), page.getTitle(), fileEntry.getTitle());
284 }
285
286 @Override
287 public void restoreTrashEntry(long userId, long classPK)
288 throws PortalException, SystemException {
289
290 WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
291 classPK, WorkflowConstants.STATUS_ANY, false);
292
293 WikiPageLocalServiceUtil.restorePageFromTrash(userId, page);
294 }
295
296 @Override
297 public void updateTitle(long classPK, String name)
298 throws PortalException, SystemException {
299
300 WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
301 classPK, WorkflowConstants.STATUS_ANY, false);
302
303 page.setTitle(name);
304
305 WikiPageLocalServiceUtil.updateWikiPage(page);
306
307 WikiPageResource pageResource =
308 WikiPageResourceLocalServiceUtil.getPageResource(
309 page.getResourcePrimKey());
310
311 pageResource.setTitle(name);
312
313 WikiPageResourceLocalServiceUtil.updateWikiPageResource(pageResource);
314 }
315
316 protected PortletURL getRestoreURL(
317 PortletRequest portletRequest, long classPK,
318 boolean isContainerModel)
319 throws PortalException, SystemException {
320
321 String portletId = PortletKeys.WIKI;
322
323 WikiPage page = WikiPageLocalServiceUtil.getLatestPage(
324 classPK, WorkflowConstants.STATUS_ANY, false);
325
326 long plid = PortalUtil.getPlidFromPortletId(
327 page.getGroupId(), PortletKeys.WIKI);
328
329 if (plid == LayoutConstants.DEFAULT_PLID) {
330 portletId = PortletKeys.WIKI_ADMIN;
331
332 plid = PortalUtil.getControlPanelPlid(portletRequest);
333 }
334
335 PortletURL portletURL = PortletURLFactoryUtil.create(
336 portletRequest, portletId, plid, PortletRequest.RENDER_PHASE);
337
338 if (isContainerModel) {
339 if (portletId.equals(PortletKeys.WIKI)) {
340 portletURL.setParameter(
341 "struts_action", "/wiki/view_all_pages");
342 }
343 else {
344 portletURL.setParameter(
345 "struts_action", "/wiki_admin/view_all_pages");
346 }
347 }
348 else {
349 if (portletId.equals(PortletKeys.WIKI)) {
350 portletURL.setParameter("struts_action", "/wiki/view");
351 }
352 else {
353 portletURL.setParameter("struts_action", "/wiki_admin/view");
354 }
355 }
356
357 return portletURL;
358 }
359
360 @Override
361 protected boolean hasPermission(
362 PermissionChecker permissionChecker, long classPK, String actionId)
363 throws PortalException, SystemException {
364
365 return WikiPagePermission.contains(
366 permissionChecker, classPK, actionId);
367 }
368
369 }