2 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
\r
4 * This library is free software; you can redistribute it and/or modify it under
\r
5 * the terms of the GNU Lesser General Public License as published by the Free
\r
6 * Software Foundation; either version 2.1 of the License, or (at your option)
\r
9 * This library is distributed in the hope that it will be useful, but WITHOUT
\r
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
\r
11 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
\r
15 package com.liferay.portlet.wiki.service.impl;
\r
17 import com.liferay.portal.kernel.exception.PortalException;
\r
18 import com.liferay.portal.kernel.exception.SystemException;
\r
19 import com.liferay.portal.kernel.sanitizer.SanitizerUtil;
\r
20 import com.liferay.portal.kernel.search.Indexer;
\r
21 import com.liferay.portal.kernel.search.IndexerRegistryUtil;
\r
22 import com.liferay.portal.kernel.util.CalendarFactoryUtil;
\r
23 import com.liferay.portal.kernel.util.ContentTypes;
\r
24 import com.liferay.portal.kernel.util.HttpUtil;
\r
25 import com.liferay.portal.kernel.util.ListUtil;
\r
26 import com.liferay.portal.kernel.util.MathUtil;
\r
27 import com.liferay.portal.kernel.util.NotificationThreadLocal;
\r
28 import com.liferay.portal.kernel.util.ObjectValuePair;
\r
29 import com.liferay.portal.kernel.util.OrderByComparator;
\r
30 import com.liferay.portal.kernel.util.StringBundler;
\r
31 import com.liferay.portal.kernel.util.StringPool;
\r
32 import com.liferay.portal.kernel.util.StringUtil;
\r
33 import com.liferay.portal.kernel.util.TempFileUtil;
\r
34 import com.liferay.portal.kernel.util.UniqueList;
\r
35 import com.liferay.portal.kernel.util.Validator;
\r
36 import com.liferay.portal.kernel.workflow.WorkflowConstants;
\r
37 import com.liferay.portal.kernel.workflow.WorkflowHandlerRegistryUtil;
\r
38 import com.liferay.portal.model.CompanyConstants;
\r
39 import com.liferay.portal.model.ResourceConstants;
\r
40 import com.liferay.portal.model.User;
\r
41 import com.liferay.portal.service.ServiceContext;
\r
42 import com.liferay.portal.service.ServiceContextUtil;
\r
43 import com.liferay.portal.util.Portal;
\r
44 import com.liferay.portal.util.PortletKeys;
\r
45 import com.liferay.portal.util.PropsValues;
\r
46 import com.liferay.portal.util.SubscriptionSender;
\r
47 import com.liferay.portlet.asset.NoSuchEntryException;
\r
48 import com.liferay.portlet.asset.model.AssetEntry;
\r
49 import com.liferay.portlet.asset.model.AssetLink;
\r
50 import com.liferay.portlet.asset.model.AssetLinkConstants;
\r
51 import com.liferay.portlet.documentlibrary.DuplicateDirectoryException;
\r
52 import com.liferay.portlet.documentlibrary.NoSuchDirectoryException;
\r
53 import com.liferay.portlet.documentlibrary.NoSuchFileException;
\r
54 import com.liferay.portlet.documentlibrary.store.DLStoreUtil;
\r
55 import com.liferay.portlet.expando.model.ExpandoBridge;
\r
56 import com.liferay.portlet.social.model.SocialActivityConstants;
\r
57 import com.liferay.portlet.wiki.DuplicatePageException;
\r
58 import com.liferay.portlet.wiki.NoSuchPageException;
\r
59 import com.liferay.portlet.wiki.NoSuchPageResourceException;
\r
60 import com.liferay.portlet.wiki.PageContentException;
\r
61 import com.liferay.portlet.wiki.PageTitleException;
\r
62 import com.liferay.portlet.wiki.PageVersionException;
\r
63 import com.liferay.portlet.wiki.model.WikiNode;
\r
64 import com.liferay.portlet.wiki.model.WikiPage;
\r
65 import com.liferay.portlet.wiki.model.WikiPageConstants;
\r
66 import com.liferay.portlet.wiki.model.WikiPageDisplay;
\r
67 import com.liferay.portlet.wiki.model.WikiPageResource;
\r
68 import com.liferay.portlet.wiki.model.impl.WikiPageDisplayImpl;
\r
69 import com.liferay.portlet.wiki.model.impl.WikiPageImpl;
\r
70 import com.liferay.portlet.wiki.service.base.WikiPageLocalServiceBaseImpl;
\r
71 import com.liferay.portlet.wiki.social.WikiActivityKeys;
\r
72 import com.liferay.portlet.wiki.util.WikiCacheThreadLocal;
\r
73 import com.liferay.portlet.wiki.util.WikiCacheUtil;
\r
74 import com.liferay.portlet.wiki.util.WikiUtil;
\r
75 import com.liferay.portlet.wiki.util.comparator.PageCreateDateComparator;
\r
76 import com.liferay.portlet.wiki.util.comparator.PageVersionComparator;
\r
78 import java.io.File;
\r
79 import java.io.InputStream;
\r
81 import java.util.ArrayList;
\r
82 import java.util.Calendar;
\r
83 import java.util.Date;
\r
84 import java.util.HashSet;
\r
85 import java.util.LinkedHashMap;
\r
86 import java.util.List;
\r
87 import java.util.Map;
\r
88 import java.util.Set;
\r
89 import java.util.regex.Matcher;
\r
90 import java.util.regex.Pattern;
\r
92 import javax.portlet.PortletPreferences;
\r
93 import javax.portlet.PortletURL;
\r
94 import javax.portlet.WindowState;
\r
97 * @author Brian Wing Shun Chan
\r
98 * @author Jorge Ferrer
\r
99 * @author Raymond Augé
\r
100 * @author Bruno Farache
\r
101 * @author Julio Camarero
\r
102 * @author Wesley Gong
\r
103 * @author Marcellus Tavares
\r
104 * @author Zsigmond Rab
\r
105 * @author Zsolt Berentey
\r
107 public class WikiPageLocalServiceImpl extends WikiPageLocalServiceBaseImpl {
\r
109 public WikiPage addPage(
\r
110 long userId, long nodeId, String title, double version,
\r
111 String content, String summary, boolean minorEdit, String format,
\r
112 boolean head, String parentTitle, String redirectTitle,
\r
113 ServiceContext serviceContext)
\r
114 throws PortalException, SystemException {
\r
118 User user = userPersistence.findByPrimaryKey(userId);
\r
119 WikiNode node = wikiNodePersistence.findByPrimaryKey(nodeId);
\r
120 Date now = new Date();
\r
122 long pageId = counterLocalService.increment();
\r
124 content = SanitizerUtil.sanitize(
\r
125 user.getCompanyId(), node.getGroupId(), userId,
\r
126 WikiPage.class.getName(), pageId, "text/" + format, content);
\r
128 validate(title, nodeId, content, format);
\r
130 long resourcePrimKey =
\r
131 wikiPageResourceLocalService.getPageResourcePrimKey(nodeId, title);
\r
133 WikiPage page = wikiPagePersistence.create(pageId);
\r
135 page.setUuid(serviceContext.getUuid());
\r
136 page.setResourcePrimKey(resourcePrimKey);
\r
137 page.setGroupId(node.getGroupId());
\r
138 page.setCompanyId(user.getCompanyId());
\r
139 page.setUserId(user.getUserId());
\r
140 page.setUserName(user.getFullName());
\r
141 page.setCreateDate(serviceContext.getCreateDate(now));
\r
142 page.setModifiedDate(serviceContext.getModifiedDate(now));
\r
143 page.setNodeId(nodeId);
\r
144 page.setTitle(title);
\r
145 page.setVersion(version);
\r
146 page.setMinorEdit(minorEdit);
\r
147 page.setContent(content);
\r
148 page.setStatus(WorkflowConstants.STATUS_DRAFT);
\r
149 page.setSummary(summary);
\r
150 page.setFormat(format);
\r
151 page.setHead(head);
\r
152 page.setParentTitle(parentTitle);
\r
153 page.setRedirectTitle(redirectTitle);
\r
155 wikiPagePersistence.update(page, false);
\r
159 if (serviceContext.isAddGroupPermissions() ||
\r
160 serviceContext.isAddGuestPermissions()) {
\r
163 page, serviceContext.isAddGroupPermissions(),
\r
164 serviceContext.isAddGuestPermissions());
\r
168 page, serviceContext.getGroupPermissions(),
\r
169 serviceContext.getGuestPermissions());
\r
174 node.setLastPostDate(serviceContext.getModifiedDate(now));
\r
176 wikiNodePersistence.update(node, false);
\r
181 userId, page, serviceContext.getAssetCategoryIds(),
\r
182 serviceContext.getAssetTagNames(),
\r
183 serviceContext.getAssetLinkEntryIds());
\r
187 ExpandoBridge expandoBridge = page.getExpandoBridge();
\r
189 expandoBridge.setAttributes(serviceContext);
\r
193 if (PropsValues.WIKI_PAGE_COMMENTS_ENABLED) {
\r
194 mbMessageLocalService.addDiscussionMessage(
\r
195 userId, page.getUserName(), page.getGroupId(),
\r
196 WikiPage.class.getName(), resourcePrimKey,
\r
197 WorkflowConstants.ACTION_PUBLISH);
\r
202 WorkflowHandlerRegistryUtil.startWorkflowInstance(
\r
203 user.getCompanyId(), page.getGroupId(), userId,
\r
204 WikiPage.class.getName(), page.getPageId(), page, serviceContext);
\r
209 public WikiPage addPage(
\r
210 long userId, long nodeId, String title, String content,
\r
211 String summary, boolean minorEdit, ServiceContext serviceContext)
\r
212 throws PortalException, SystemException {
\r
214 double version = WikiPageConstants.VERSION_DEFAULT;
\r
215 String format = WikiPageConstants.DEFAULT_FORMAT;
\r
216 boolean head = false;
\r
217 String parentTitle = null;
\r
218 String redirectTitle = null;
\r
221 userId, nodeId, title, version, content, summary, minorEdit, format,
\r
222 head, parentTitle, redirectTitle, serviceContext);
\r
225 public void addPageAttachment(
\r
226 long userId, long nodeId, String title, String fileName, File file)
\r
227 throws PortalException, SystemException {
\r
229 if (Validator.isNull(fileName)) {
\r
233 WikiPage page = getPage(nodeId, title);
\r
236 userId = page.getUserId();
\r
239 socialActivityLocalService.addActivity(
\r
240 userId, page.getGroupId(), WikiPage.class.getName(),
\r
241 page.getResourcePrimKey(),
\r
242 SocialActivityConstants.TYPE_ADD_ATTACHMENT,
\r
243 page.getAttachmentsDir() + "/" + fileName, 0);
\r
246 DLStoreUtil.addDirectory(
\r
247 page.getCompanyId(), CompanyConstants.SYSTEM,
\r
248 page.getAttachmentsDir());
\r
250 catch (DuplicateDirectoryException dde) {
\r
253 DLStoreUtil.addFile(
\r
254 page.getCompanyId(), CompanyConstants.SYSTEM,
\r
255 page.getAttachmentsDir() + "/" + fileName, file);
\r
258 public void addPageAttachment(
\r
259 long userId, long nodeId, String title, String fileName,
\r
260 InputStream inputStream)
\r
261 throws PortalException, SystemException {
\r
263 if (Validator.isNull(fileName)) {
\r
267 WikiPage page = getPage(nodeId, title);
\r
270 userId = page.getUserId();
\r
273 socialActivityLocalService.addActivity(
\r
274 userId, page.getGroupId(), WikiPage.class.getName(),
\r
275 page.getResourcePrimKey(),
\r
276 SocialActivityConstants.TYPE_ADD_ATTACHMENT,
\r
277 page.getAttachmentsDir() + "/" + fileName, 0);
\r
280 DLStoreUtil.addDirectory(
\r
281 page.getCompanyId(), CompanyConstants.SYSTEM,
\r
282 page.getAttachmentsDir());
\r
284 catch (DuplicateDirectoryException dde) {
\r
287 DLStoreUtil.addFile(
\r
288 page.getCompanyId(), CompanyConstants.SYSTEM,
\r
289 page.getAttachmentsDir() + "/" + fileName, inputStream);
\r
292 public void addPageAttachment(
\r
293 long companyId, String dirName, Date modifiedDate, String fileName,
\r
294 InputStream inputStream)
\r
295 throws PortalException, SystemException {
\r
297 if (inputStream == null) {
\r
301 long repositoryId = CompanyConstants.SYSTEM;
\r
304 DLStoreUtil.addDirectory(companyId, repositoryId, dirName);
\r
306 catch (DuplicateDirectoryException dde) {
\r
309 DLStoreUtil.addFile(
\r
310 companyId, repositoryId, dirName + "/" + fileName, false,
\r
314 public void addPageAttachments(
\r
315 long userId, long nodeId, String title,
\r
316 List<ObjectValuePair<String, InputStream>> inputStreams)
\r
317 throws PortalException, SystemException {
\r
319 if (inputStreams.size() == 0) {
\r
323 for (int i = 0; i < inputStreams.size(); i++) {
\r
324 ObjectValuePair<String, InputStream> ovp = inputStreams.get(i);
\r
326 String fileName = ovp.getKey();
\r
327 InputStream inputStream = ovp.getValue();
\r
329 addPageAttachment(userId, nodeId, title, fileName, inputStream);
\r
333 public void addPageResources(
\r
334 long nodeId, String title, boolean addGroupPermissions,
\r
335 boolean addGuestPermissions)
\r
336 throws PortalException, SystemException {
\r
338 WikiPage page = getPage(nodeId, title);
\r
340 addPageResources(page, addGroupPermissions, addGuestPermissions);
\r
343 public void addPageResources(
\r
344 long nodeId, String title, String[] groupPermissions,
\r
345 String[] guestPermissions)
\r
346 throws PortalException, SystemException {
\r
348 WikiPage page = getPage(nodeId, title);
\r
350 addPageResources(page, groupPermissions, guestPermissions);
\r
353 public void addPageResources(
\r
354 WikiPage page, boolean addGroupPermissions,
\r
355 boolean addGuestPermissions)
\r
356 throws PortalException, SystemException {
\r
358 resourceLocalService.addResources(
\r
359 page.getCompanyId(), page.getGroupId(), page.getUserId(),
\r
360 WikiPage.class.getName(), page.getResourcePrimKey(), false,
\r
361 addGroupPermissions, addGuestPermissions);
\r
364 public void addPageResources(
\r
365 WikiPage page, String[] groupPermissions, String[] guestPermissions)
\r
366 throws PortalException, SystemException {
\r
368 resourceLocalService.addModelResources(
\r
369 page.getCompanyId(), page.getGroupId(), page.getUserId(),
\r
370 WikiPage.class.getName(), page.getResourcePrimKey(),
\r
371 groupPermissions, guestPermissions);
\r
374 public String addTempPageAttachment(
\r
375 long userId, String fileName, String tempFolderName,
\r
376 InputStream inputStream)
\r
377 throws PortalException, SystemException {
\r
379 return TempFileUtil.addTempFile(
\r
380 userId, fileName, tempFolderName, inputStream);
\r
383 public void changeParent(
\r
384 long userId, long nodeId, String title, String newParentTitle,
\r
385 ServiceContext serviceContext)
\r
386 throws PortalException, SystemException {
\r
388 if (Validator.isNotNull(newParentTitle)) {
\r
389 WikiPage parentPage = getPage(nodeId, newParentTitle);
\r
391 if (Validator.isNotNull(parentPage.getRedirectTitle())) {
\r
392 newParentTitle = parentPage.getRedirectTitle();
\r
396 WikiPage page = getPage(nodeId, title);
\r
398 String originalParentTitle = page.getParentTitle();
\r
400 double version = page.getVersion();
\r
401 String content = page.getContent();
\r
402 String summary = serviceContext.translate(
\r
403 "changed-parent-from-x", originalParentTitle);
\r
404 boolean minorEdit = false;
\r
405 String format = page.getFormat();
\r
406 String redirectTitle = page.getRedirectTitle();
\r
408 long[] assetCategoryIds = assetCategoryLocalService.getCategoryIds(
\r
409 WikiPage.class.getName(), page.getResourcePrimKey());
\r
410 String[] assetTagNames = assetTagLocalService.getTagNames(
\r
411 WikiPage.class.getName(), page.getResourcePrimKey());
\r
413 serviceContext.setAssetCategoryIds(assetCategoryIds);
\r
414 serviceContext.setAssetLinkEntryIds(null);
\r
415 serviceContext.setAssetTagNames(assetTagNames);
\r
418 userId, nodeId, title, version, content, summary, minorEdit, format,
\r
419 newParentTitle, redirectTitle, serviceContext);
\r
421 List<WikiPage> oldPages = wikiPagePersistence.findByN_T_H(
\r
422 nodeId, title, false);
\r
424 for (WikiPage oldPage : oldPages) {
\r
425 oldPage.setParentTitle(originalParentTitle);
\r
427 wikiPagePersistence.update(oldPage, false);
\r
431 public void deletePage(long nodeId, String title)
\r
432 throws PortalException, SystemException {
\r
434 List<WikiPage> pages = wikiPagePersistence.findByN_T_H(
\r
435 nodeId, title, true, 0, 1);
\r
437 if (!pages.isEmpty()) {
\r
438 WikiPage page = pages.iterator().next();
\r
444 public void deletePage(long nodeId, String title, double version)
\r
445 throws PortalException, SystemException {
\r
447 wikiPagePersistence.removeByN_T_V(nodeId, title, version);
\r
450 public void deletePage(WikiPage page)
\r
451 throws PortalException, SystemException {
\r
455 List<WikiPage> children = wikiPagePersistence.findByN_H_P(
\r
456 page.getNodeId(), true, page.getTitle());
\r
458 for (WikiPage curPage : children) {
\r
459 deletePage(curPage);
\r
464 Indexer indexer = IndexerRegistryUtil.nullSafeGetIndexer(
\r
467 indexer.delete(page);
\r
471 long companyId = page.getCompanyId();
\r
472 long repositoryId = CompanyConstants.SYSTEM;
\r
473 String dirName = page.getAttachmentsDir();
\r
476 DLStoreUtil.deleteDirectory(companyId, repositoryId, dirName);
\r
478 catch (NoSuchDirectoryException nsde) {
\r
483 subscriptionLocalService.deleteSubscriptions(
\r
484 page.getCompanyId(), WikiPage.class.getName(),
\r
485 page.getResourcePrimKey());
\r
489 mbMessageLocalService.deleteDiscussionMessages(
\r
490 WikiPage.class.getName(), page.getResourcePrimKey());
\r
494 expandoValueLocalService.deleteValues(
\r
495 WikiPage.class.getName(), page.getResourcePrimKey());
\r
500 List<WikiPage> pageVersions = wikiPagePersistence.findByN_T(
\r
501 page.getNodeId(), page.getTitle());
\r
503 for (WikiPage pageVersion : pageVersions) {
\r
504 assetEntryLocalService.deleteEntry(
\r
505 WikiPage.class.getName(), pageVersion.getPrimaryKey());
\r
508 assetEntryLocalService.deleteEntry(
\r
509 WikiPage.class.getName(), page.getResourcePrimKey());
\r
511 catch (Exception e){}
\r
515 resourceLocalService.deleteResource(
\r
516 page.getCompanyId(), WikiPage.class.getName(),
\r
517 ResourceConstants.SCOPE_INDIVIDUAL, page.getResourcePrimKey());
\r
522 wikiPageResourceLocalService.deletePageResource(
\r
523 page.getNodeId(), page.getTitle());
\r
525 catch (NoSuchPageResourceException nspre) {
\r
530 List<WikiPage> pages = wikiPagePersistence.findByN_T(
\r
531 page.getNodeId(), page.getTitle());
\r
533 for (WikiPage curPage : pages) {
\r
537 workflowInstanceLinkLocalService.deleteWorkflowInstanceLinks(
\r
538 curPage.getCompanyId(), curPage.getGroupId(),
\r
539 WikiPage.class.getName(), curPage.getPageId());
\r
542 wikiPagePersistence.removeByN_T(page.getNodeId(), page.getTitle());
\r
546 wikiPagePersistence.removeByN_R(page.getNodeId(), page.getTitle());
\r
550 clearPageCache(page);
\r
553 public void deletePageAttachment(long nodeId, String title, String fileName)
\r
554 throws PortalException, SystemException {
\r
556 if (Validator.isNull(fileName)) {
\r
560 WikiPage page = getPage(nodeId, title);
\r
562 long companyId = page.getCompanyId();
\r
563 long repositoryId = CompanyConstants.SYSTEM;
\r
566 DLStoreUtil.deleteFile(companyId, repositoryId, fileName);
\r
568 catch (NoSuchFileException nsfe) {
\r
572 public void deletePages(long nodeId)
\r
573 throws PortalException, SystemException {
\r
575 List<WikiPage> pages = wikiPagePersistence.findByN_H_P(
\r
576 nodeId, true, StringPool.BLANK);
\r
578 for (WikiPage page : pages) {
\r
582 pages = wikiPagePersistence.findByN_H_P(
\r
583 nodeId, false, StringPool.BLANK);
\r
585 for (WikiPage page : pages) {
\r
590 public void deleteTempPageAttachment(
\r
591 long userId, String fileName, String tempFolderName)
\r
592 throws PortalException, SystemException {
\r
594 TempFileUtil.deleteTempFile(userId, fileName, tempFolderName);
\r
597 public List<WikiPage> getChildren(
\r
598 long nodeId, boolean head, String parentTitle)
\r
599 throws SystemException {
\r
601 return wikiPagePersistence.findByN_H_P_S(
\r
602 nodeId, head, parentTitle, WorkflowConstants.STATUS_APPROVED);
\r
605 public WikiPage getDraftPage(long nodeId, String title)
\r
606 throws PortalException, SystemException {
\r
608 List<WikiPage> pages = wikiPagePersistence.findByN_T_S(
\r
609 nodeId, title, WorkflowConstants.STATUS_DRAFT, 0, 1);
\r
611 if (!pages.isEmpty()) {
\r
612 return pages.get(0);
\r
615 pages = wikiPagePersistence.findByN_T_S(
\r
616 nodeId, title, WorkflowConstants.STATUS_PENDING, 0, 1);
\r
618 if (!pages.isEmpty()) {
\r
619 return pages.get(0);
\r
622 throw new NoSuchPageException();
\r
628 public List<WikiPage> getIncomingLinks(long nodeId, String title)
\r
629 throws PortalException, SystemException {
\r
631 List<WikiPage> links = new UniqueList<WikiPage>();
\r
633 List<WikiPage> pages = wikiPagePersistence.findByN_H(nodeId, true);
\r
635 for (WikiPage page : pages) {
\r
636 if (isLinkedTo(page, title)) {
\r
641 List<WikiPage> referrals = wikiPagePersistence.findByN_R(nodeId, title);
\r
643 for (WikiPage referral : referrals) {
\r
644 for (WikiPage page : pages) {
\r
645 if (isLinkedTo(page, referral.getTitle())) {
\r
651 return ListUtil.sort(links);
\r
654 public List<WikiPage> getNoAssetPages() throws SystemException {
\r
655 return wikiPageFinder.findByNoAssets();
\r
658 public List<WikiPage> getOrphans(long nodeId)
\r
659 throws PortalException, SystemException {
\r
661 List<Map<String, Boolean>> pageTitles =
\r
662 new ArrayList<Map<String, Boolean>>();
\r
664 List<WikiPage> pages = wikiPagePersistence.findByN_H_S(
\r
665 nodeId, true, WorkflowConstants.STATUS_APPROVED);
\r
667 for (WikiPage page : pages) {
\r
668 pageTitles.add(WikiCacheUtil.getOutgoingLinks(page));
\r
671 Set<WikiPage> notOrphans = new HashSet<WikiPage>();
\r
673 for (WikiPage page : pages) {
\r
674 for (Map<String, Boolean> pageTitle : pageTitles) {
\r
675 if (pageTitle.get(page.getTitle().toLowerCase()) != null) {
\r
676 notOrphans.add(page);
\r
683 List<WikiPage> orphans = new ArrayList<WikiPage>();
\r
685 for (WikiPage page : pages) {
\r
686 if (!notOrphans.contains(page)) {
\r
691 orphans = ListUtil.sort(orphans);
\r
696 public List<WikiPage> getOutgoingLinks(long nodeId, String title)
\r
697 throws PortalException, SystemException {
\r
699 WikiPage page = getPage(nodeId, title);
\r
701 Map<String, WikiPage> pages = new LinkedHashMap<String, WikiPage>();
\r
703 Map<String, Boolean> links = WikiCacheUtil.getOutgoingLinks(page);
\r
705 for (Map.Entry<String, Boolean> entry : links.entrySet()) {
\r
706 String curTitle = entry.getKey();
\r
707 Boolean exists = entry.getValue();
\r
710 WikiPage curPage = getPage(nodeId, curTitle);
\r
712 if (!pages.containsKey(curPage.getTitle())) {
\r
713 pages.put(curPage.getTitle(), curPage);
\r
717 WikiPageImpl newPage = new WikiPageImpl();
\r
719 newPage.setNew(true);
\r
720 newPage.setNodeId(nodeId);
\r
721 newPage.setTitle(curTitle);
\r
723 if (!pages.containsKey(curTitle)) {
\r
724 pages.put(curTitle, newPage);
\r
729 return ListUtil.fromMapValues(pages);
\r
732 public WikiPage getPage(long resourcePrimKey)
\r
733 throws PortalException, SystemException {
\r
735 return getPage(resourcePrimKey, Boolean.TRUE);
\r
738 public WikiPage getPage(long resourcePrimKey, Boolean head)
\r
739 throws PortalException, SystemException {
\r
741 WikiPageResource wikiPageResource =
\r
742 wikiPageResourceLocalService.getPageResource(resourcePrimKey);
\r
745 wikiPageResource.getNodeId(), wikiPageResource.getTitle(), head);
\r
748 public WikiPage getPage(long nodeId, String title)
\r
749 throws PortalException, SystemException {
\r
751 List<WikiPage> pages = wikiPagePersistence.findByN_T_H(
\r
752 nodeId, title, true, 0, 1);
\r
754 if (!pages.isEmpty()) {
\r
755 return pages.get(0);
\r
758 throw new NoSuchPageException();
\r
762 public WikiPage getPage(long nodeId, String title, Boolean head)
\r
763 throws PortalException, SystemException {
\r
765 List<WikiPage> pages;
\r
767 if (head == null) {
\r
768 pages = wikiPagePersistence.findByN_T(nodeId, title, 0, 1);
\r
771 pages = wikiPagePersistence.findByN_T_H(nodeId, title, head, 0, 1);
\r
774 if (!pages.isEmpty()) {
\r
775 return pages.get(0);
\r
778 throw new NoSuchPageException();
\r
782 public WikiPage getPage(long nodeId, String title, double version)
\r
783 throws PortalException, SystemException {
\r
785 WikiPage page = null;
\r
787 if (version == 0) {
\r
788 page = getPage(nodeId, title);
\r
791 page = wikiPagePersistence.findByN_T_V(nodeId, title, version);
\r
797 public WikiPage getPageByPageId(long pageId)
\r
798 throws PortalException, SystemException {
\r
800 return wikiPagePersistence.findByPrimaryKey(pageId);
\r
803 public WikiPageDisplay getPageDisplay(
\r
804 long nodeId, String title, PortletURL viewPageURL,
\r
805 PortletURL editPageURL, String attachmentURLPrefix)
\r
806 throws PortalException, SystemException {
\r
808 WikiPage page = getPage(nodeId, title);
\r
810 return getPageDisplay(
\r
811 page, viewPageURL, editPageURL, attachmentURLPrefix);
\r
814 public WikiPageDisplay getPageDisplay(
\r
815 WikiPage page, PortletURL viewPageURL, PortletURL editPageURL,
\r
816 String attachmentURLPrefix)
\r
817 throws PortalException, SystemException {
\r
819 String formattedContent = WikiUtil.convert(
\r
820 page, viewPageURL, editPageURL, attachmentURLPrefix);
\r
822 return new WikiPageDisplayImpl(
\r
823 page.getUserId(), page.getNodeId(), page.getTitle(),
\r
824 page.getVersion(), page.getContent(), formattedContent,
\r
825 page.getFormat(), page.getHead(), page.getAttachmentsFiles());
\r
828 public List<WikiPage> getPages(
\r
829 long nodeId, boolean head, int start, int end)
\r
830 throws SystemException {
\r
833 nodeId, head, start, end, new PageCreateDateComparator(false));
\r
836 public List<WikiPage> getPages(
\r
837 long nodeId, boolean head, int start, int end,
\r
838 OrderByComparator obc)
\r
839 throws SystemException {
\r
841 return wikiPagePersistence.findByN_H_S(
\r
842 nodeId, head, WorkflowConstants.STATUS_APPROVED, start, end, obc);
\r
845 public List<WikiPage> getPages(long nodeId, int start, int end)
\r
846 throws SystemException {
\r
849 nodeId, start, end, new PageCreateDateComparator(false));
\r
852 public List<WikiPage> getPages(
\r
853 long nodeId, int start, int end, OrderByComparator obc)
\r
854 throws SystemException {
\r
856 return wikiPagePersistence.findByNodeId(nodeId, start, end, obc);
\r
859 public List<WikiPage> getPages(
\r
860 long resourcePrimKey, long nodeId, int status)
\r
861 throws SystemException {
\r
863 return wikiPagePersistence.findByR_N_S(resourcePrimKey, nodeId, status);
\r
866 public List<WikiPage> getPages(
\r
867 long userId, long nodeId, int status, int start, int end)
\r
868 throws SystemException {
\r
871 return wikiPagePersistence.findByU_N_S(
\r
872 userId, nodeId, status, start, end,
\r
873 new PageCreateDateComparator(false));
\r
876 return wikiPagePersistence.findByN_S(
\r
877 nodeId, status, start, end,
\r
878 new PageCreateDateComparator(false));
\r
882 public List<WikiPage> getPages(
\r
883 long nodeId, String title, boolean head, int start, int end)
\r
884 throws SystemException {
\r
886 return wikiPagePersistence.findByN_T_H(
\r
887 nodeId, title, head, start, end,
\r
888 new PageCreateDateComparator(false));
\r
891 public List<WikiPage> getPages(
\r
892 long nodeId, String title, int start, int end)
\r
893 throws SystemException {
\r
895 return wikiPagePersistence.findByN_T(
\r
896 nodeId, title, start, end, new PageCreateDateComparator(false));
\r
899 public List<WikiPage> getPages(
\r
900 long nodeId, String title, int start, int end,
\r
901 OrderByComparator obc)
\r
902 throws SystemException {
\r
904 return wikiPagePersistence.findByN_T(nodeId, title, start, end, obc);
\r
907 public List<WikiPage> getPages(String format) throws SystemException {
\r
908 return wikiPagePersistence.findByFormat(format);
\r
911 public int getPagesCount(long nodeId) throws SystemException {
\r
912 return wikiPagePersistence.countByNodeId(nodeId);
\r
915 public int getPagesCount(long nodeId, boolean head) throws SystemException {
\r
916 return wikiPagePersistence.countByN_H_S(
\r
917 nodeId, head, WorkflowConstants.STATUS_APPROVED);
\r
920 public int getPagesCount(long userId, long nodeId, int status)
\r
921 throws SystemException {
\r
924 return wikiPagePersistence.countByU_N_S(userId, nodeId, status);
\r
927 return wikiPagePersistence.countByN_S(nodeId, status);
\r
931 public int getPagesCount(long nodeId, String title) throws SystemException {
\r
932 return wikiPagePersistence.countByN_T(nodeId, title);
\r
935 public int getPagesCount(long nodeId, String title, boolean head)
\r
936 throws SystemException {
\r
938 return wikiPagePersistence.countByN_T_H(nodeId, title, head);
\r
941 public int getPagesCount(String format) throws SystemException {
\r
942 return wikiPagePersistence.countByFormat(format);
\r
945 public List<WikiPage> getRecentChanges(long nodeId, int start, int end)
\r
946 throws SystemException {
\r
948 Calendar cal = CalendarFactoryUtil.getCalendar();
\r
950 cal.add(Calendar.WEEK_OF_YEAR, -1);
\r
952 return wikiPageFinder.findByCreateDate(
\r
953 nodeId, cal.getTime(), false, start, end);
\r
956 public int getRecentChangesCount(long nodeId) throws SystemException {
\r
957 Calendar cal = CalendarFactoryUtil.getCalendar();
\r
959 cal.add(Calendar.WEEK_OF_YEAR, -1);
\r
961 return wikiPageFinder.countByCreateDate(nodeId, cal.getTime(), false);
\r
964 public String[] getTempPageAttachmentNames(
\r
965 long userId, String tempFolderName) {
\r
967 return TempFileUtil.getTempFileEntryNames(userId, tempFolderName);
\r
970 public boolean hasDraftPage(long nodeId, String title)
\r
971 throws SystemException {
\r
973 int count = wikiPagePersistence.countByN_T_S(
\r
974 nodeId, title, WorkflowConstants.STATUS_DRAFT);
\r
984 public void movePage(
\r
985 long userId, long nodeId, String title, String newTitle,
\r
986 boolean strict, ServiceContext serviceContext)
\r
987 throws PortalException, SystemException {
\r
989 validateTitle(newTitle);
\r
991 // Check if the new title already exists
\r
993 if (title.equalsIgnoreCase(newTitle)) {
\r
994 throw new DuplicatePageException(newTitle);
\r
997 if (isUsedTitle(nodeId, newTitle)) {
\r
998 WikiPage page = getPage(nodeId, newTitle);
\r
1000 // Support moving back to a previously moved title
\r
1002 if (((page.getVersion() == WikiPageConstants.VERSION_DEFAULT) &&
\r
1003 (page.getContent().length() < 200)) ||
\r
1006 deletePage(nodeId, newTitle);
\r
1009 throw new DuplicatePageException(newTitle);
\r
1015 List<WikiPage> pageVersions = wikiPagePersistence.findByN_T(
\r
1018 if (pageVersions.size() == 0) {
\r
1022 for (WikiPage page : pageVersions) {
\r
1023 page.setTitle(newTitle);
\r
1025 wikiPagePersistence.update(page, false);
\r
1030 List<WikiPage> children = wikiPagePersistence.findByN_P(nodeId, title);
\r
1032 for (WikiPage page : children) {
\r
1033 page.setParentTitle(newTitle);
\r
1035 wikiPagePersistence.update(page, false);
\r
1038 WikiPage page = pageVersions.get(pageVersions.size() - 1);
\r
1040 long resourcePrimKey = page.getResourcePrimKey();
\r
1044 WikiPageResource wikiPageResource =
\r
1045 wikiPageResourcePersistence.findByPrimaryKey(resourcePrimKey);
\r
1047 wikiPageResource.setTitle(newTitle);
\r
1049 wikiPageResourcePersistence.update(wikiPageResource, false);
\r
1051 // Create stub page at the old location
\r
1053 double version = WikiPageConstants.VERSION_DEFAULT;
\r
1054 String summary = WikiPageConstants.MOVED + " to " + title;
\r
1055 String format = page.getFormat();
\r
1056 boolean head = true;
\r
1057 String parentTitle = page.getParentTitle();
\r
1058 String redirectTitle = page.getTitle();
\r
1060 StringPool.DOUBLE_OPEN_BRACKET + redirectTitle +
\r
1061 StringPool.DOUBLE_CLOSE_BRACKET;
\r
1063 serviceContext.setAddGroupPermissions(true);
\r
1064 serviceContext.setAddGuestPermissions(true);
\r
1067 AssetEntry assetEntry = assetEntryLocalService.getEntry(
\r
1068 WikiPage.class.getName(), page.getResourcePrimKey());
\r
1070 List<AssetLink> assetLinks = assetLinkLocalService.getDirectLinks(
\r
1071 assetEntry.getEntryId(), AssetLinkConstants.TYPE_RELATED);
\r
1073 long[] assetLinkEntryIds = StringUtil.split(
\r
1074 ListUtil.toString(assetLinks, AssetLink.ENTRY_ID2_ACCESSOR), 0L);
\r
1076 serviceContext.setAssetLinkEntryIds(assetLinkEntryIds);
\r
1078 catch (Exception e){}
\r
1081 userId, nodeId, title, version, content, summary, false, format,
\r
1082 head, parentTitle, redirectTitle, serviceContext);
\r
1084 // Move redirects to point to the page with the new title
\r
1086 List<WikiPage> redirectedPages = wikiPagePersistence.findByN_R(
\r
1089 for (WikiPage redirectedPage : redirectedPages) {
\r
1090 redirectedPage.setRedirectTitle(newTitle);
\r
1092 wikiPagePersistence.update(redirectedPage, false);
\r
1097 updateAsset(userId, page, null, null, null);
\r
1101 Indexer indexer = IndexerRegistryUtil.nullSafeGetIndexer(
\r
1105 new Object[] {page.getCompanyId(), page.getNodeId(), title});
\r
1107 indexer.reindex(page);
\r
1110 public void movePage(
\r
1111 long userId, long nodeId, String title, String newTitle,
\r
1112 ServiceContext serviceContext)
\r
1113 throws PortalException, SystemException {
\r
1115 movePage(userId, nodeId, title, newTitle, true, serviceContext);
\r
1118 public WikiPage revertPage(
\r
1119 long userId, long nodeId, String title, double version,
\r
1120 ServiceContext serviceContext)
\r
1121 throws PortalException, SystemException {
\r
1123 WikiPage oldPage = getPage(nodeId, title, version);
\r
1125 return updatePage(
\r
1126 userId, nodeId, title, 0, oldPage.getContent(),
\r
1127 WikiPageConstants.REVERTED + " to " + version, false,
\r
1128 oldPage.getFormat(), getParentPageTitle(oldPage),
\r
1129 oldPage.getRedirectTitle(), serviceContext);
\r
1132 public void subscribePage(long userId, long nodeId, String title)
\r
1133 throws PortalException, SystemException {
\r
1135 WikiPage page = getPage(nodeId, title);
\r
1137 subscriptionLocalService.addSubscription(
\r
1138 userId, page.getGroupId(), WikiPage.class.getName(),
\r
1139 page.getResourcePrimKey());
\r
1142 public void unsubscribePage(long userId, long nodeId, String title)
\r
1143 throws PortalException, SystemException {
\r
1145 WikiPage page = getPage(nodeId, title);
\r
1147 subscriptionLocalService.deleteSubscription(
\r
1148 userId, WikiPage.class.getName(), page.getResourcePrimKey());
\r
1151 public void updateAsset(
\r
1152 long userId, WikiPage page, long[] assetCategoryIds,
\r
1153 String[] assetTagNames, long[] assetLinkEntryIds)
\r
1154 throws PortalException, SystemException {
\r
1157 boolean addDraftAssetEntry = false;
\r
1159 if (!page.isApproved() &&
\r
1160 (page.getVersion() != WikiPageConstants.VERSION_DEFAULT)) {
\r
1162 int approvedPagesCount = wikiPagePersistence.countByN_T_S(
\r
1163 page.getNodeId(), page.getTitle(),
\r
1164 WorkflowConstants.STATUS_APPROVED);
\r
1166 if (approvedPagesCount > 0) {
\r
1167 addDraftAssetEntry = true;
\r
1171 AssetEntry assetEntry = null;
\r
1173 if (addDraftAssetEntry) {
\r
1174 assetEntry = assetEntryLocalService.updateEntry(
\r
1175 userId, page.getGroupId(), WikiPage.class.getName(),
\r
1176 page.getPrimaryKey(), page.getUuid(), 0, assetCategoryIds,
\r
1177 assetTagNames, false, null, null, null, null,
\r
1178 ContentTypes.TEXT_HTML, page.getTitle(), null, null, null, null,
\r
1179 0, 0, null, false);
\r
1182 assetEntry = assetEntryLocalService.updateEntry(
\r
1183 userId, page.getGroupId(), WikiPage.class.getName(),
\r
1184 page.getResourcePrimKey(), page.getUuid(), 0, assetCategoryIds,
\r
1185 assetTagNames, page.isApproved(), null, null, null, null,
\r
1186 ContentTypes.TEXT_HTML, page.getTitle(), null, null, null, null,
\r
1187 0, 0, null, false);
\r
1190 assetLinkLocalService.updateLinks(
\r
1191 userId, assetEntry.getEntryId(), assetLinkEntryIds,
\r
1192 AssetLinkConstants.TYPE_RELATED);
\r
1194 catch (Exception e){}
\r
1197 public WikiPage updatePage(
\r
1198 long userId, long nodeId, String title, double version,
\r
1199 String content, String summary, boolean minorEdit, String format,
\r
1200 String parentTitle, String redirectTitle,
\r
1201 ServiceContext serviceContext)
\r
1202 throws PortalException, SystemException {
\r
1206 User user = userPersistence.findByPrimaryKey(userId);
\r
1207 Date now = new Date();
\r
1209 WikiPage oldPage = null;
\r
1212 oldPage = wikiPagePersistence.findByN_T_First(nodeId, title, null);
\r
1214 catch (NoSuchPageException nspe) {
\r
1216 userId, nodeId, title, WikiPageConstants.VERSION_DEFAULT,
\r
1217 content, summary, minorEdit, format, true, parentTitle,
\r
1218 redirectTitle, serviceContext);
\r
1223 if (oldPage.isApproved()) {
\r
1224 pageId = counterLocalService.increment();
\r
1227 pageId = oldPage.getPageId();
\r
1230 content = SanitizerUtil.sanitize(
\r
1231 user.getCompanyId(), oldPage.getGroupId(), userId,
\r
1232 WikiPage.class.getName(), pageId, "text/" + format, content);
\r
1234 validate(nodeId, content, format);
\r
1236 double oldVersion = oldPage.getVersion();
\r
1238 if ((version > 0) && (version != oldVersion)) {
\r
1239 throw new PageVersionException();
\r
1242 serviceContext.validateModifiedDate(
\r
1243 oldPage, PageVersionException.class);
\r
1245 long resourcePrimKey =
\r
1246 wikiPageResourceLocalService.getPageResourcePrimKey(nodeId, title);
\r
1247 long groupId = oldPage.getGroupId();
\r
1249 WikiPage page = oldPage;
\r
1251 double newVersion = oldVersion;
\r
1253 if (oldPage.isApproved()) {
\r
1254 newVersion = MathUtil.format(oldVersion + 0.1, 1, 1);
\r
1256 page = wikiPagePersistence.create(pageId);
\r
1259 page.setResourcePrimKey(resourcePrimKey);
\r
1260 page.setGroupId(groupId);
\r
1261 page.setCompanyId(user.getCompanyId());
\r
1262 page.setUserId(user.getUserId());
\r
1263 page.setUserName(user.getFullName());
\r
1264 page.setCreateDate(serviceContext.getModifiedDate(now));
\r
1265 page.setModifiedDate(serviceContext.getModifiedDate(now));
\r
1266 page.setNodeId(nodeId);
\r
1267 page.setTitle(title);
\r
1268 page.setVersion(newVersion);
\r
1269 page.setMinorEdit(minorEdit);
\r
1270 page.setContent(content);
\r
1272 if (oldPage.isPending()) {
\r
1273 page.setStatus(oldPage.getStatus());
\r
1276 page.setStatus(WorkflowConstants.STATUS_DRAFT);
\r
1279 page.setSummary(summary);
\r
1280 page.setFormat(format);
\r
1282 if (Validator.isNotNull(parentTitle)) {
\r
1283 page.setParentTitle(parentTitle);
\r
1286 if (Validator.isNotNull(redirectTitle)) {
\r
1287 page.setRedirectTitle(redirectTitle);
\r
1290 wikiPagePersistence.update(page, false);
\r
1294 ExpandoBridge expandoBridge = page.getExpandoBridge();
\r
1296 expandoBridge.setAttributes(serviceContext);
\r
1300 WikiNode node = wikiNodePersistence.findByPrimaryKey(nodeId);
\r
1302 node.setLastPostDate(serviceContext.getModifiedDate(now));
\r
1304 wikiNodePersistence.update(node, false);
\r
1309 userId, page, serviceContext.getAssetCategoryIds(),
\r
1310 serviceContext.getAssetTagNames(),
\r
1311 serviceContext.getAssetLinkEntryIds());
\r
1315 WorkflowHandlerRegistryUtil.startWorkflowInstance(
\r
1316 user.getCompanyId(), page.getGroupId(), userId,
\r
1317 WikiPage.class.getName(), page.getPageId(), page, serviceContext);
\r
1322 public WikiPage updateStatus(
\r
1323 long userId, long resourcePrimKey, int status,
\r
1324 ServiceContext serviceContext)
\r
1325 throws PortalException, SystemException {
\r
1327 WikiPageResource wikiPageResource =
\r
1328 wikiPageResourceLocalService.getPageResource(resourcePrimKey);
\r
1330 List<WikiPage> pages = wikiPagePersistence.findByN_T(
\r
1331 wikiPageResource.getNodeId(), wikiPageResource.getTitle(), 0, 1,
\r
1332 new PageVersionComparator());
\r
1334 WikiPage page = null;
\r
1336 if (!pages.isEmpty()) {
\r
1337 page = pages.get(0);
\r
1340 throw new NoSuchPageException();
\r
1343 return updateStatus(userId, page, status, serviceContext);
\r
1346 public WikiPage updateStatus(
\r
1347 long userId, WikiPage page, int status,
\r
1348 ServiceContext serviceContext)
\r
1349 throws PortalException, SystemException {
\r
1353 User user = userPersistence.findByPrimaryKey(userId);
\r
1354 WikiNode node = wikiNodePersistence.findByPrimaryKey(page.getNodeId());
\r
1356 Date now = new Date();
\r
1358 int oldStatus = page.getStatus();
\r
1360 page.setStatus(status);
\r
1361 page.setStatusByUserId(userId);
\r
1362 page.setStatusByUserName(user.getFullName());
\r
1363 page.setStatusDate(now);
\r
1365 if (status == WorkflowConstants.STATUS_APPROVED) {
\r
1369 if ((oldStatus != WorkflowConstants.STATUS_APPROVED) &&
\r
1370 (page.getVersion() != WikiPageConstants.VERSION_DEFAULT)) {
\r
1373 AssetEntry draftAssetEntry =
\r
1374 assetEntryLocalService.getEntry(
\r
1375 WikiPage.class.getName(), page.getPrimaryKey());
\r
1377 long[] assetCategoryIds = draftAssetEntry.getCategoryIds();
\r
1378 String[] assetTagNames = draftAssetEntry.getTagNames();
\r
1380 List<AssetLink> assetLinks =
\r
1381 assetLinkLocalService.getDirectLinks(
\r
1382 draftAssetEntry.getEntryId(),
\r
1383 AssetLinkConstants.TYPE_RELATED);
\r
1385 long[] assetLinkEntryIds = StringUtil.split(
\r
1386 ListUtil.toString(
\r
1387 assetLinks, AssetLink.ENTRY_ID2_ACCESSOR), 0L);
\r
1389 AssetEntry assetEntry = assetEntryLocalService.updateEntry(
\r
1390 userId, page.getGroupId(), WikiPage.class.getName(),
\r
1391 page.getResourcePrimKey(), page.getUuid(), 0,
\r
1392 assetCategoryIds, assetTagNames, true, null, null, null,
\r
1393 null, ContentTypes.TEXT_HTML, page.getTitle(), null,
\r
1394 null, null, null, 0, 0, null, false);
\r
1398 assetLinkLocalService.updateLinks(
\r
1399 userId, assetEntry.getEntryId(), assetLinkEntryIds,
\r
1400 AssetLinkConstants.TYPE_RELATED);
\r
1402 assetEntryLocalService.deleteEntry(
\r
1403 draftAssetEntry.getEntryId());
\r
1405 catch (NoSuchEntryException nsee) {
\r
1407 catch (Exception e){
\r
1412 assetEntryLocalService.updateVisible(
\r
1413 WikiPage.class.getName(), page.getResourcePrimKey(), true);
\r
1415 catch (Exception e){
\r
1420 if (!page.isMinorEdit() ||
\r
1421 PropsValues.WIKI_PAGE_MINOR_EDIT_ADD_SOCIAL_ACTIVITY) {
\r
1423 int activity = WikiActivityKeys.ADD_PAGE;
\r
1425 if (page.getVersion() > WikiPageConstants.VERSION_DEFAULT) {
\r
1426 activity = WikiActivityKeys.UPDATE_PAGE;
\r
1429 socialActivityLocalService.addActivity(
\r
1430 userId, page.getGroupId(), WikiPage.class.getName(),
\r
1431 page.getResourcePrimKey(), activity, StringPool.BLANK, 0);
\r
1436 if (NotificationThreadLocal.isEnabled() &&
\r
1437 (!page.isMinorEdit() ||
\r
1438 PropsValues.WIKI_PAGE_MINOR_EDIT_SEND_EMAIL)) {
\r
1440 boolean update = false;
\r
1442 if (page.getVersion() > WikiPageConstants.VERSION_DEFAULT) {
\r
1446 notifySubscribers(node, page, serviceContext, update);
\r
1451 Indexer indexer = IndexerRegistryUtil.nullSafeGetIndexer(
\r
1454 indexer.reindex(page);
\r
1458 clearPageCache(page);
\r
1462 page.setHead(true);
\r
1464 List<WikiPage> pages = wikiPagePersistence.findByN_T_H(
\r
1465 page.getNodeId(), page.getTitle(), true);
\r
1467 for (WikiPage curPage : pages) {
\r
1468 if (!curPage.equals(page)) {
\r
1469 curPage.setHead(false);
\r
1471 wikiPagePersistence.update(curPage, false);
\r
1479 page.setHead(false);
\r
1481 List<WikiPage> pages = wikiPagePersistence.findByN_T_S(
\r
1482 page.getNodeId(), page.getTitle(),
\r
1483 WorkflowConstants.STATUS_APPROVED);
\r
1485 for (WikiPage curPage : pages) {
\r
1486 if (!curPage.equals(page)) {
\r
1487 curPage.setHead(true);
\r
1489 wikiPagePersistence.update(curPage, false);
\r
1496 return wikiPagePersistence.update(page, false);
\r
1499 public void validateTitle(String title) throws PortalException {
\r
1500 if (title.equals("all_pages") || title.equals("orphan_pages") ||
\r
1501 title.equals("recent_changes")) {
\r
1503 throw new PageTitleException(title + " is reserved");
\r
1506 if (Validator.isNotNull(PropsValues.WIKI_PAGE_TITLES_REGEXP)) {
\r
1507 Pattern pattern = Pattern.compile(
\r
1508 PropsValues.WIKI_PAGE_TITLES_REGEXP);
\r
1510 Matcher matcher = pattern.matcher(title);
\r
1512 if (!matcher.matches()) {
\r
1513 throw new PageTitleException();
\r
1518 protected void clearPageCache(WikiPage page) {
\r
1519 if (!WikiCacheThreadLocal.isClearCache()) {
\r
1523 WikiCacheUtil.clearCache(page.getNodeId());
\r
1526 protected String getParentPageTitle(WikiPage page) {
\r
1531 WikiPage parentPage = getPage(
\r
1532 page.getNodeId(), page.getParentTitle());
\r
1534 return parentPage.getTitle();
\r
1536 catch (Exception e) {
\r
1541 protected WikiPage getPreviousVersionPage(WikiPage page)
\r
1542 throws PortalException, SystemException {
\r
1544 double previousVersion = MathUtil.format(page.getVersion() - 0.1, 1, 1);
\r
1546 if (previousVersion < 1) {
\r
1550 return getPage(page.getNodeId(), page.getTitle(), previousVersion);
\r
1553 protected boolean isLinkedTo(WikiPage page, String targetTitle)
\r
1554 throws PortalException {
\r
1556 Map<String, Boolean> links = WikiCacheUtil.getOutgoingLinks(page);
\r
1558 Boolean link = links.get(targetTitle.toLowerCase());
\r
1560 if (link != null) {
\r
1568 protected boolean isUsedTitle(long nodeId, String title)
\r
1569 throws SystemException {
\r
1571 if (getPagesCount(nodeId, title, true) > 0) {
\r
1579 protected void notifySubscribers(
\r
1580 WikiNode node, WikiPage page, ServiceContext serviceContext,
\r
1582 throws PortalException, SystemException {
\r
1584 PortletPreferences preferences = null;
\r
1586 String rootPortletId = serviceContext.getRootPortletId();
\r
1588 if (Validator.isNull(rootPortletId) ||
\r
1589 rootPortletId.equals(PortletKeys.WIKI_DISPLAY)) {
\r
1591 preferences = ServiceContextUtil.getPortletPreferences(
\r
1595 if (preferences == null) {
\r
1596 preferences = portletPreferencesLocalService.getPreferences(
\r
1597 node.getCompanyId(), node.getGroupId(),
\r
1598 PortletKeys.PREFS_OWNER_TYPE_GROUP,
\r
1599 PortletKeys.PREFS_PLID_SHARED, PortletKeys.WIKI_ADMIN, null);
\r
1602 if (!update && WikiUtil.getEmailPageAddedEnabled(preferences)) {
\r
1604 else if (update && WikiUtil.getEmailPageUpdatedEnabled(preferences)) {
\r
1610 String portalURL = serviceContext.getPortalURL();
\r
1611 String layoutFullURL = serviceContext.getLayoutFullURL();
\r
1613 WikiPage previousVersionPage = getPreviousVersionPage(page);
\r
1615 String attachmentURLPrefix =
\r
1616 portalURL + serviceContext.getPathMain() +
\r
1617 "/wiki/get_page_attachment?p_l_id=" + serviceContext.getPlid() +
\r
1618 "&nodeId=" + page.getNodeId() + "&title=" +
\r
1619 HttpUtil.encodeURL(page.getTitle()) + "&fileName=";
\r
1621 String pageDiffs = StringPool.BLANK;
\r
1624 pageDiffs = WikiUtil.diffHtml(
\r
1625 previousVersionPage, page, null, null, attachmentURLPrefix);
\r
1627 catch (Exception e) {
\r
1630 String pageContent = null;
\r
1632 if (Validator.equals(page.getFormat(), "creole")) {
\r
1633 pageContent = WikiUtil.convert(
\r
1634 page, null, null, attachmentURLPrefix);
\r
1637 pageContent = page.getContent();
\r
1638 pageContent = WikiUtil.processContent(pageContent);
\r
1641 String pageURL = StringPool.BLANK;
\r
1642 String diffsURL = StringPool.BLANK;
\r
1644 if (Validator.isNotNull(layoutFullURL)) {
\r
1646 layoutFullURL + Portal.FRIENDLY_URL_SEPARATOR + "wiki/" +
\r
1647 node.getNodeId() + StringPool.SLASH +
\r
1648 HttpUtil.encodeURL(page.getTitle());
\r
1650 if (previousVersionPage != null) {
\r
1651 StringBundler sb = new StringBundler(16);
\r
1653 sb.append(layoutFullURL);
\r
1654 sb.append("?p_p_id=");
\r
1655 sb.append(PortletKeys.WIKI);
\r
1656 sb.append("&p_p_state=");
\r
1657 sb.append(WindowState.MAXIMIZED);
\r
1658 sb.append("&struts_action=");
\r
1659 sb.append(HttpUtil.encodeURL("/wiki/compare_versions"));
\r
1660 sb.append("&nodeId=");
\r
1661 sb.append(node.getNodeId());
\r
1662 sb.append("&title=");
\r
1663 sb.append(HttpUtil.encodeURL(page.getTitle()));
\r
1664 sb.append("&sourceVersion=");
\r
1665 sb.append(previousVersionPage.getVersion());
\r
1666 sb.append("&targetVersion=");
\r
1667 sb.append(page.getVersion());
\r
1668 sb.append("&type=html");
\r
1670 diffsURL = sb.toString();
\r
1674 String fromName = WikiUtil.getEmailFromName(
\r
1675 preferences, page.getCompanyId());
\r
1676 String fromAddress = WikiUtil.getEmailFromAddress(
\r
1677 preferences, page.getCompanyId());
\r
1679 String subjectPrefix = null;
\r
1680 String body = null;
\r
1681 String signature = null;
\r
1684 subjectPrefix = WikiUtil.getEmailPageUpdatedSubjectPrefix(
\r
1686 body = WikiUtil.getEmailPageUpdatedBody(preferences);
\r
1687 signature = WikiUtil.getEmailPageUpdatedSignature(preferences);
\r
1690 subjectPrefix = WikiUtil.getEmailPageAddedSubjectPrefix(
\r
1692 body = WikiUtil.getEmailPageAddedBody(preferences);
\r
1693 signature = WikiUtil.getEmailPageAddedSignature(preferences);
\r
1696 String subject = page.getTitle();
\r
1698 if (subject.indexOf(subjectPrefix) == -1) {
\r
1699 subject = subjectPrefix + StringPool.SPACE + subject;
\r
1702 if (Validator.isNotNull(signature)) {
\r
1703 body += "\n" + signature;
\r
1706 SubscriptionSender subscriptionSender = new SubscriptionSender();
\r
1708 subscriptionSender.setBody(body);
\r
1709 subscriptionSender.setCompanyId(page.getCompanyId());
\r
1710 subscriptionSender.setContextAttributes(
\r
1711 "[$DIFFS_URL$]", diffsURL, "[$NODE_NAME$]", node.getName(),
\r
1712 "[$PAGE_DATE_UPDATE$]", page.getModifiedDate(), "[$PAGE_ID$]",
\r
1713 page.getPageId(), "[$PAGE_SUMMARY$]", page.getSummary(),
\r
1714 "[$PAGE_TITLE$]", page.getTitle(), "[$PAGE_URL$]", pageURL);
\r
1715 subscriptionSender.setContextAttribute(
\r
1716 "[$PAGE_CONTENT$]", pageContent, false);
\r
1717 subscriptionSender.setContextAttribute(
\r
1718 "[$PAGE_DIFFS$]", replaceStyles(pageDiffs), false);
\r
1719 subscriptionSender.setContextUserPrefix("PAGE");
\r
1720 subscriptionSender.setFrom(fromAddress, fromName);
\r
1721 subscriptionSender.setHtmlFormat(true);
\r
1722 subscriptionSender.setMailId(
\r
1723 "wiki_page", page.getNodeId(), page.getPageId());
\r
1724 subscriptionSender.setPortletId(PortletKeys.WIKI);
\r
1725 subscriptionSender.setReplyToAddress(fromAddress);
\r
1726 subscriptionSender.setScopeGroupId(node.getGroupId());
\r
1727 subscriptionSender.setServiceContext(serviceContext);
\r
1728 subscriptionSender.setSubject(subject);
\r
1729 subscriptionSender.setUserId(page.getUserId());
\r
1731 subscriptionSender.addPersistedSubscribers(
\r
1732 WikiNode.class.getName(), node.getNodeId());
\r
1733 subscriptionSender.addPersistedSubscribers(
\r
1734 WikiPage.class.getName(), page.getResourcePrimKey());
\r
1736 subscriptionSender.flushNotificationsAsync();
\r
1739 protected String replaceStyles(String html) {
\r
1740 return StringUtil.replace(
\r
1743 "class=\"diff-html-added\"", "class=\"diff-html-removed\"",
\r
1744 "class=\"diff-html-changed\"",
\r
1745 "changeType=\"diff-added-image\"",
\r
1746 "changeType=\"diff-removed-image\"",
\r
1747 "changeType=\"diff-changed-image\""
\r
1750 "style=\"background-color: #CFC;\"",
\r
1751 "style=\"background-color: #FDC6C6; text-decoration: " +
\r
1752 "line-through;\"",
\r
1753 "style=\"border-bottom: 2px dotted blue;\"",
\r
1754 "style=\"border: 10px solid #CFC;\"",
\r
1755 "style=\"border: 10px solid #FDC6C6;\"",
\r
1756 "style=\"border: 10px solid blue;\""
\r
1761 protected void validate(long nodeId, String content, String format)
\r
1762 throws PortalException {
\r
1764 if (!WikiUtil.validate(nodeId, content, format)) {
\r
1765 throw new PageContentException();
\r
1769 protected void validate(
\r
1770 String title, long nodeId, String content, String format)
\r
1771 throws PortalException, SystemException {
\r
1773 if (Validator.isNull(title)) {
\r
1774 throw new PageTitleException();
\r
1777 if (isUsedTitle(nodeId, title)) {
\r
1778 throw new DuplicatePageException();
\r
1781 validateTitle(title);
\r
1783 validate(nodeId, content, format);
\r