--- /dev/null
+/**\r
+ * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.\r
+ *\r
+ * This library is free software; you can redistribute it and/or modify it under\r
+ * the terms of the GNU Lesser General Public License as published by the Free\r
+ * Software Foundation; either version 2.1 of the License, or (at your option)\r
+ * any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more\r
+ * details.\r
+ */\r
+\r
+package com.liferay.portlet.wiki.service.impl;\r
+\r
+import com.liferay.portal.kernel.exception.PortalException;\r
+import com.liferay.portal.kernel.exception.SystemException;\r
+import com.liferay.portal.kernel.sanitizer.SanitizerUtil;\r
+import com.liferay.portal.kernel.search.Indexer;\r
+import com.liferay.portal.kernel.search.IndexerRegistryUtil;\r
+import com.liferay.portal.kernel.util.CalendarFactoryUtil;\r
+import com.liferay.portal.kernel.util.ContentTypes;\r
+import com.liferay.portal.kernel.util.HttpUtil;\r
+import com.liferay.portal.kernel.util.ListUtil;\r
+import com.liferay.portal.kernel.util.MathUtil;\r
+import com.liferay.portal.kernel.util.NotificationThreadLocal;\r
+import com.liferay.portal.kernel.util.ObjectValuePair;\r
+import com.liferay.portal.kernel.util.OrderByComparator;\r
+import com.liferay.portal.kernel.util.StringBundler;\r
+import com.liferay.portal.kernel.util.StringPool;\r
+import com.liferay.portal.kernel.util.StringUtil;\r
+import com.liferay.portal.kernel.util.TempFileUtil;\r
+import com.liferay.portal.kernel.util.UniqueList;\r
+import com.liferay.portal.kernel.util.Validator;\r
+import com.liferay.portal.kernel.workflow.WorkflowConstants;\r
+import com.liferay.portal.kernel.workflow.WorkflowHandlerRegistryUtil;\r
+import com.liferay.portal.model.CompanyConstants;\r
+import com.liferay.portal.model.ResourceConstants;\r
+import com.liferay.portal.model.User;\r
+import com.liferay.portal.service.ServiceContext;\r
+import com.liferay.portal.service.ServiceContextUtil;\r
+import com.liferay.portal.util.Portal;\r
+import com.liferay.portal.util.PortletKeys;\r
+import com.liferay.portal.util.PropsValues;\r
+import com.liferay.portal.util.SubscriptionSender;\r
+import com.liferay.portlet.asset.NoSuchEntryException;\r
+import com.liferay.portlet.asset.model.AssetEntry;\r
+import com.liferay.portlet.asset.model.AssetLink;\r
+import com.liferay.portlet.asset.model.AssetLinkConstants;\r
+import com.liferay.portlet.documentlibrary.DuplicateDirectoryException;\r
+import com.liferay.portlet.documentlibrary.NoSuchDirectoryException;\r
+import com.liferay.portlet.documentlibrary.NoSuchFileException;\r
+import com.liferay.portlet.documentlibrary.store.DLStoreUtil;\r
+import com.liferay.portlet.expando.model.ExpandoBridge;\r
+import com.liferay.portlet.social.model.SocialActivityConstants;\r
+import com.liferay.portlet.wiki.DuplicatePageException;\r
+import com.liferay.portlet.wiki.NoSuchPageException;\r
+import com.liferay.portlet.wiki.NoSuchPageResourceException;\r
+import com.liferay.portlet.wiki.PageContentException;\r
+import com.liferay.portlet.wiki.PageTitleException;\r
+import com.liferay.portlet.wiki.PageVersionException;\r
+import com.liferay.portlet.wiki.model.WikiNode;\r
+import com.liferay.portlet.wiki.model.WikiPage;\r
+import com.liferay.portlet.wiki.model.WikiPageConstants;\r
+import com.liferay.portlet.wiki.model.WikiPageDisplay;\r
+import com.liferay.portlet.wiki.model.WikiPageResource;\r
+import com.liferay.portlet.wiki.model.impl.WikiPageDisplayImpl;\r
+import com.liferay.portlet.wiki.model.impl.WikiPageImpl;\r
+import com.liferay.portlet.wiki.service.base.WikiPageLocalServiceBaseImpl;\r
+import com.liferay.portlet.wiki.social.WikiActivityKeys;\r
+import com.liferay.portlet.wiki.util.WikiCacheThreadLocal;\r
+import com.liferay.portlet.wiki.util.WikiCacheUtil;\r
+import com.liferay.portlet.wiki.util.WikiUtil;\r
+import com.liferay.portlet.wiki.util.comparator.PageCreateDateComparator;\r
+import com.liferay.portlet.wiki.util.comparator.PageVersionComparator;\r
+\r
+import java.io.File;\r
+import java.io.InputStream;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Calendar;\r
+import java.util.Date;\r
+import java.util.HashSet;\r
+import java.util.LinkedHashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+import javax.portlet.PortletPreferences;\r
+import javax.portlet.PortletURL;\r
+import javax.portlet.WindowState;\r
+\r
+/**\r
+ * @author Brian Wing Shun Chan\r
+ * @author Jorge Ferrer\r
+ * @author Raymond Augé\r
+ * @author Bruno Farache\r
+ * @author Julio Camarero\r
+ * @author Wesley Gong\r
+ * @author Marcellus Tavares\r
+ * @author Zsigmond Rab\r
+ * @author Zsolt Berentey\r
+ */\r
+public class WikiPageLocalServiceImpl extends WikiPageLocalServiceBaseImpl {\r
+\r
+ public WikiPage addPage(\r
+ long userId, long nodeId, String title, double version,\r
+ String content, String summary, boolean minorEdit, String format,\r
+ boolean head, String parentTitle, String redirectTitle,\r
+ ServiceContext serviceContext)\r
+ throws PortalException, SystemException {\r
+\r
+ // Page\r
+\r
+ User user = userPersistence.findByPrimaryKey(userId);\r
+ WikiNode node = wikiNodePersistence.findByPrimaryKey(nodeId);\r
+ Date now = new Date();\r
+\r
+ long pageId = counterLocalService.increment();\r
+\r
+ content = SanitizerUtil.sanitize(\r
+ user.getCompanyId(), node.getGroupId(), userId,\r
+ WikiPage.class.getName(), pageId, "text/" + format, content);\r
+\r
+ validate(title, nodeId, content, format);\r
+\r
+ long resourcePrimKey =\r
+ wikiPageResourceLocalService.getPageResourcePrimKey(nodeId, title);\r
+\r
+ WikiPage page = wikiPagePersistence.create(pageId);\r
+\r
+ page.setUuid(serviceContext.getUuid());\r
+ page.setResourcePrimKey(resourcePrimKey);\r
+ page.setGroupId(node.getGroupId());\r
+ page.setCompanyId(user.getCompanyId());\r
+ page.setUserId(user.getUserId());\r
+ page.setUserName(user.getFullName());\r
+ page.setCreateDate(serviceContext.getCreateDate(now));\r
+ page.setModifiedDate(serviceContext.getModifiedDate(now));\r
+ page.setNodeId(nodeId);\r
+ page.setTitle(title);\r
+ page.setVersion(version);\r
+ page.setMinorEdit(minorEdit);\r
+ page.setContent(content);\r
+ page.setStatus(WorkflowConstants.STATUS_DRAFT);\r
+ page.setSummary(summary);\r
+ page.setFormat(format);\r
+ page.setHead(head);\r
+ page.setParentTitle(parentTitle);\r
+ page.setRedirectTitle(redirectTitle);\r
+\r
+ wikiPagePersistence.update(page, false);\r
+\r
+ // Resources\r
+\r
+ if (serviceContext.isAddGroupPermissions() ||\r
+ serviceContext.isAddGuestPermissions()) {\r
+\r
+ addPageResources(\r
+ page, serviceContext.isAddGroupPermissions(),\r
+ serviceContext.isAddGuestPermissions());\r
+ }\r
+ else {\r
+ addPageResources(\r
+ page, serviceContext.getGroupPermissions(),\r
+ serviceContext.getGuestPermissions());\r
+ }\r
+\r
+ // Node\r
+\r
+ node.setLastPostDate(serviceContext.getModifiedDate(now));\r
+\r
+ wikiNodePersistence.update(node, false);\r
+\r
+ // Asset\r
+\r
+ updateAsset(\r
+ userId, page, serviceContext.getAssetCategoryIds(),\r
+ serviceContext.getAssetTagNames(),\r
+ serviceContext.getAssetLinkEntryIds());\r
+\r
+ // Expando\r
+\r
+ ExpandoBridge expandoBridge = page.getExpandoBridge();\r
+\r
+ expandoBridge.setAttributes(serviceContext);\r
+\r
+ // Message boards\r
+\r
+ if (PropsValues.WIKI_PAGE_COMMENTS_ENABLED) {\r
+ mbMessageLocalService.addDiscussionMessage(\r
+ userId, page.getUserName(), page.getGroupId(),\r
+ WikiPage.class.getName(), resourcePrimKey,\r
+ WorkflowConstants.ACTION_PUBLISH);\r
+ }\r
+\r
+ // Workflow\r
+\r
+ WorkflowHandlerRegistryUtil.startWorkflowInstance(\r
+ user.getCompanyId(), page.getGroupId(), userId,\r
+ WikiPage.class.getName(), page.getPageId(), page, serviceContext);\r
+\r
+ return page;\r
+ }\r
+\r
+ public WikiPage addPage(\r
+ long userId, long nodeId, String title, String content,\r
+ String summary, boolean minorEdit, ServiceContext serviceContext)\r
+ throws PortalException, SystemException {\r
+\r
+ double version = WikiPageConstants.VERSION_DEFAULT;\r
+ String format = WikiPageConstants.DEFAULT_FORMAT;\r
+ boolean head = false;\r
+ String parentTitle = null;\r
+ String redirectTitle = null;\r
+\r
+ return addPage(\r
+ userId, nodeId, title, version, content, summary, minorEdit, format,\r
+ head, parentTitle, redirectTitle, serviceContext);\r
+ }\r
+\r
+ public void addPageAttachment(\r
+ long userId, long nodeId, String title, String fileName, File file)\r
+ throws PortalException, SystemException {\r
+\r
+ if (Validator.isNull(fileName)) {\r
+ return;\r
+ }\r
+\r
+ WikiPage page = getPage(nodeId, title);\r
+\r
+ if (userId == 0) {\r
+ userId = page.getUserId();\r
+ }\r
+\r
+ socialActivityLocalService.addActivity(\r
+ userId, page.getGroupId(), WikiPage.class.getName(),\r
+ page.getResourcePrimKey(),\r
+ SocialActivityConstants.TYPE_ADD_ATTACHMENT,\r
+ page.getAttachmentsDir() + "/" + fileName, 0);\r
+\r
+ try {\r
+ DLStoreUtil.addDirectory(\r
+ page.getCompanyId(), CompanyConstants.SYSTEM,\r
+ page.getAttachmentsDir());\r
+ }\r
+ catch (DuplicateDirectoryException dde) {\r
+ }\r
+\r
+ DLStoreUtil.addFile(\r
+ page.getCompanyId(), CompanyConstants.SYSTEM,\r
+ page.getAttachmentsDir() + "/" + fileName, file);\r
+ }\r
+\r
+ public void addPageAttachment(\r
+ long userId, long nodeId, String title, String fileName,\r
+ InputStream inputStream)\r
+ throws PortalException, SystemException {\r
+\r
+ if (Validator.isNull(fileName)) {\r
+ return;\r
+ }\r
+\r
+ WikiPage page = getPage(nodeId, title);\r
+\r
+ if (userId == 0) {\r
+ userId = page.getUserId();\r
+ }\r
+\r
+ socialActivityLocalService.addActivity(\r
+ userId, page.getGroupId(), WikiPage.class.getName(),\r
+ page.getResourcePrimKey(),\r
+ SocialActivityConstants.TYPE_ADD_ATTACHMENT,\r
+ page.getAttachmentsDir() + "/" + fileName, 0);\r
+\r
+ try {\r
+ DLStoreUtil.addDirectory(\r
+ page.getCompanyId(), CompanyConstants.SYSTEM,\r
+ page.getAttachmentsDir());\r
+ }\r
+ catch (DuplicateDirectoryException dde) {\r
+ }\r
+\r
+ DLStoreUtil.addFile(\r
+ page.getCompanyId(), CompanyConstants.SYSTEM,\r
+ page.getAttachmentsDir() + "/" + fileName, inputStream);\r
+ }\r
+\r
+ public void addPageAttachment(\r
+ long companyId, String dirName, Date modifiedDate, String fileName,\r
+ InputStream inputStream)\r
+ throws PortalException, SystemException {\r
+\r
+ if (inputStream == null) {\r
+ return;\r
+ }\r
+\r
+ long repositoryId = CompanyConstants.SYSTEM;\r
+\r
+ try {\r
+ DLStoreUtil.addDirectory(companyId, repositoryId, dirName);\r
+ }\r
+ catch (DuplicateDirectoryException dde) {\r
+ }\r
+\r
+ DLStoreUtil.addFile(\r
+ companyId, repositoryId, dirName + "/" + fileName, false,\r
+ inputStream);\r
+ }\r
+\r
+ public void addPageAttachments(\r
+ long userId, long nodeId, String title,\r
+ List<ObjectValuePair<String, InputStream>> inputStreams)\r
+ throws PortalException, SystemException {\r
+\r
+ if (inputStreams.size() == 0) {\r
+ return;\r
+ }\r
+\r
+ for (int i = 0; i < inputStreams.size(); i++) {\r
+ ObjectValuePair<String, InputStream> ovp = inputStreams.get(i);\r
+\r
+ String fileName = ovp.getKey();\r
+ InputStream inputStream = ovp.getValue();\r
+\r
+ addPageAttachment(userId, nodeId, title, fileName, inputStream);\r
+ }\r
+ }\r
+\r
+ public void addPageResources(\r
+ long nodeId, String title, boolean addGroupPermissions,\r
+ boolean addGuestPermissions)\r
+ throws PortalException, SystemException {\r
+\r
+ WikiPage page = getPage(nodeId, title);\r
+\r
+ addPageResources(page, addGroupPermissions, addGuestPermissions);\r
+ }\r
+\r
+ public void addPageResources(\r
+ long nodeId, String title, String[] groupPermissions,\r
+ String[] guestPermissions)\r
+ throws PortalException, SystemException {\r
+\r
+ WikiPage page = getPage(nodeId, title);\r
+\r
+ addPageResources(page, groupPermissions, guestPermissions);\r
+ }\r
+\r
+ public void addPageResources(\r
+ WikiPage page, boolean addGroupPermissions,\r
+ boolean addGuestPermissions)\r
+ throws PortalException, SystemException {\r
+\r
+ resourceLocalService.addResources(\r
+ page.getCompanyId(), page.getGroupId(), page.getUserId(),\r
+ WikiPage.class.getName(), page.getResourcePrimKey(), false,\r
+ addGroupPermissions, addGuestPermissions);\r
+ }\r
+\r
+ public void addPageResources(\r
+ WikiPage page, String[] groupPermissions, String[] guestPermissions)\r
+ throws PortalException, SystemException {\r
+\r
+ resourceLocalService.addModelResources(\r
+ page.getCompanyId(), page.getGroupId(), page.getUserId(),\r
+ WikiPage.class.getName(), page.getResourcePrimKey(),\r
+ groupPermissions, guestPermissions);\r
+ }\r
+\r
+ public String addTempPageAttachment(\r
+ long userId, String fileName, String tempFolderName,\r
+ InputStream inputStream)\r
+ throws PortalException, SystemException {\r
+\r
+ return TempFileUtil.addTempFile(\r
+ userId, fileName, tempFolderName, inputStream);\r
+ }\r
+\r
+ public void changeParent(\r
+ long userId, long nodeId, String title, String newParentTitle,\r
+ ServiceContext serviceContext)\r
+ throws PortalException, SystemException {\r
+\r
+ if (Validator.isNotNull(newParentTitle)) {\r
+ WikiPage parentPage = getPage(nodeId, newParentTitle);\r
+\r
+ if (Validator.isNotNull(parentPage.getRedirectTitle())) {\r
+ newParentTitle = parentPage.getRedirectTitle();\r
+ }\r
+ }\r
+\r
+ WikiPage page = getPage(nodeId, title);\r
+\r
+ String originalParentTitle = page.getParentTitle();\r
+\r
+ double version = page.getVersion();\r
+ String content = page.getContent();\r
+ String summary = serviceContext.translate(\r
+ "changed-parent-from-x", originalParentTitle);\r
+ boolean minorEdit = false;\r
+ String format = page.getFormat();\r
+ String redirectTitle = page.getRedirectTitle();\r
+\r
+ long[] assetCategoryIds = assetCategoryLocalService.getCategoryIds(\r
+ WikiPage.class.getName(), page.getResourcePrimKey());\r
+ String[] assetTagNames = assetTagLocalService.getTagNames(\r
+ WikiPage.class.getName(), page.getResourcePrimKey());\r
+\r
+ serviceContext.setAssetCategoryIds(assetCategoryIds);\r
+ serviceContext.setAssetLinkEntryIds(null);\r
+ serviceContext.setAssetTagNames(assetTagNames);\r
+\r
+ updatePage(\r
+ userId, nodeId, title, version, content, summary, minorEdit, format,\r
+ newParentTitle, redirectTitle, serviceContext);\r
+\r
+ List<WikiPage> oldPages = wikiPagePersistence.findByN_T_H(\r
+ nodeId, title, false);\r
+\r
+ for (WikiPage oldPage : oldPages) {\r
+ oldPage.setParentTitle(originalParentTitle);\r
+\r
+ wikiPagePersistence.update(oldPage, false);\r
+ }\r
+ }\r
+\r
+ public void deletePage(long nodeId, String title)\r
+ throws PortalException, SystemException {\r
+\r
+ List<WikiPage> pages = wikiPagePersistence.findByN_T_H(\r
+ nodeId, title, true, 0, 1);\r
+\r
+ if (!pages.isEmpty()) {\r
+ WikiPage page = pages.iterator().next();\r
+\r
+ deletePage(page);\r
+ }\r
+ }\r
+\r
+ public void deletePage(long nodeId, String title, double version)\r
+ throws PortalException, SystemException {\r
+\r
+ wikiPagePersistence.removeByN_T_V(nodeId, title, version);\r
+ }\r
+\r
+ public void deletePage(WikiPage page)\r
+ throws PortalException, SystemException {\r
+\r
+ // Children\r
+\r
+ List<WikiPage> children = wikiPagePersistence.findByN_H_P(\r
+ page.getNodeId(), true, page.getTitle());\r
+\r
+ for (WikiPage curPage : children) {\r
+ deletePage(curPage);\r
+ }\r
+\r
+ // Indexer\r
+\r
+ Indexer indexer = IndexerRegistryUtil.nullSafeGetIndexer(\r
+ WikiPage.class);\r
+\r
+ indexer.delete(page);\r
+\r
+ // Attachments\r
+\r
+ long companyId = page.getCompanyId();\r
+ long repositoryId = CompanyConstants.SYSTEM;\r
+ String dirName = page.getAttachmentsDir();\r
+\r
+ try {\r
+ DLStoreUtil.deleteDirectory(companyId, repositoryId, dirName);\r
+ }\r
+ catch (NoSuchDirectoryException nsde) {\r
+ }\r
+\r
+ // Subscriptions\r
+\r
+ subscriptionLocalService.deleteSubscriptions(\r
+ page.getCompanyId(), WikiPage.class.getName(),\r
+ page.getResourcePrimKey());\r
+\r
+ // Message boards\r
+\r
+ mbMessageLocalService.deleteDiscussionMessages(\r
+ WikiPage.class.getName(), page.getResourcePrimKey());\r
+\r
+ // Expando\r
+\r
+ expandoValueLocalService.deleteValues(\r
+ WikiPage.class.getName(), page.getResourcePrimKey());\r
+\r
+ // Asset\r
+\r
+ try {\r
+ List<WikiPage> pageVersions = wikiPagePersistence.findByN_T(\r
+ page.getNodeId(), page.getTitle());\r
+ \r
+ for (WikiPage pageVersion : pageVersions) {\r
+ assetEntryLocalService.deleteEntry(\r
+ WikiPage.class.getName(), pageVersion.getPrimaryKey());\r
+ }\r
+ \r
+ assetEntryLocalService.deleteEntry(\r
+ WikiPage.class.getName(), page.getResourcePrimKey());\r
+ }\r
+ catch (Exception e){}\r
+\r
+ // Resources\r
+\r
+ resourceLocalService.deleteResource(\r
+ page.getCompanyId(), WikiPage.class.getName(),\r
+ ResourceConstants.SCOPE_INDIVIDUAL, page.getResourcePrimKey());\r
+\r
+ // Resource\r
+\r
+ try {\r
+ wikiPageResourceLocalService.deletePageResource(\r
+ page.getNodeId(), page.getTitle());\r
+ }\r
+ catch (NoSuchPageResourceException nspre) {\r
+ }\r
+\r
+ // All versions\r
+\r
+ List<WikiPage> pages = wikiPagePersistence.findByN_T(\r
+ page.getNodeId(), page.getTitle());\r
+\r
+ for (WikiPage curPage : pages) {\r
+\r
+ // Workflow\r
+\r
+ workflowInstanceLinkLocalService.deleteWorkflowInstanceLinks(\r
+ curPage.getCompanyId(), curPage.getGroupId(),\r
+ WikiPage.class.getName(), curPage.getPageId());\r
+ }\r
+\r
+ wikiPagePersistence.removeByN_T(page.getNodeId(), page.getTitle());\r
+\r
+ // All referrals\r
+\r
+ wikiPagePersistence.removeByN_R(page.getNodeId(), page.getTitle());\r
+\r
+ // Cache\r
+\r
+ clearPageCache(page);\r
+ }\r
+\r
+ public void deletePageAttachment(long nodeId, String title, String fileName)\r
+ throws PortalException, SystemException {\r
+\r
+ if (Validator.isNull(fileName)) {\r
+ return;\r
+ }\r
+\r
+ WikiPage page = getPage(nodeId, title);\r
+\r
+ long companyId = page.getCompanyId();\r
+ long repositoryId = CompanyConstants.SYSTEM;\r
+\r
+ try {\r
+ DLStoreUtil.deleteFile(companyId, repositoryId, fileName);\r
+ }\r
+ catch (NoSuchFileException nsfe) {\r
+ }\r
+ }\r
+\r
+ public void deletePages(long nodeId)\r
+ throws PortalException, SystemException {\r
+\r
+ List<WikiPage> pages = wikiPagePersistence.findByN_H_P(\r
+ nodeId, true, StringPool.BLANK);\r
+\r
+ for (WikiPage page : pages) {\r
+ deletePage(page);\r
+ }\r
+\r
+ pages = wikiPagePersistence.findByN_H_P(\r
+ nodeId, false, StringPool.BLANK);\r
+\r
+ for (WikiPage page : pages) {\r
+ deletePage(page);\r
+ }\r
+ }\r
+\r
+ public void deleteTempPageAttachment(\r
+ long userId, String fileName, String tempFolderName)\r
+ throws PortalException, SystemException {\r
+\r
+ TempFileUtil.deleteTempFile(userId, fileName, tempFolderName);\r
+ }\r
+\r
+ public List<WikiPage> getChildren(\r
+ long nodeId, boolean head, String parentTitle)\r
+ throws SystemException {\r
+\r
+ return wikiPagePersistence.findByN_H_P_S(\r
+ nodeId, head, parentTitle, WorkflowConstants.STATUS_APPROVED);\r
+ }\r
+\r
+ public WikiPage getDraftPage(long nodeId, String title)\r
+ throws PortalException, SystemException {\r
+\r
+ List<WikiPage> pages = wikiPagePersistence.findByN_T_S(\r
+ nodeId, title, WorkflowConstants.STATUS_DRAFT, 0, 1);\r
+\r
+ if (!pages.isEmpty()) {\r
+ return pages.get(0);\r
+ }\r
+ else {\r
+ pages = wikiPagePersistence.findByN_T_S(\r
+ nodeId, title, WorkflowConstants.STATUS_PENDING, 0, 1);\r
+\r
+ if (!pages.isEmpty()) {\r
+ return pages.get(0);\r
+ }\r
+ else {\r
+ throw new NoSuchPageException();\r
+ }\r
+ }\r
+\r
+ }\r
+\r
+ public List<WikiPage> getIncomingLinks(long nodeId, String title)\r
+ throws PortalException, SystemException {\r
+\r
+ List<WikiPage> links = new UniqueList<WikiPage>();\r
+\r
+ List<WikiPage> pages = wikiPagePersistence.findByN_H(nodeId, true);\r
+\r
+ for (WikiPage page : pages) {\r
+ if (isLinkedTo(page, title)) {\r
+ links.add(page);\r
+ }\r
+ }\r
+\r
+ List<WikiPage> referrals = wikiPagePersistence.findByN_R(nodeId, title);\r
+\r
+ for (WikiPage referral : referrals) {\r
+ for (WikiPage page : pages) {\r
+ if (isLinkedTo(page, referral.getTitle())) {\r
+ links.add(page);\r
+ }\r
+ }\r
+ }\r
+\r
+ return ListUtil.sort(links);\r
+ }\r
+\r
+ public List<WikiPage> getNoAssetPages() throws SystemException {\r
+ return wikiPageFinder.findByNoAssets();\r
+ }\r
+\r
+ public List<WikiPage> getOrphans(long nodeId)\r
+ throws PortalException, SystemException {\r
+\r
+ List<Map<String, Boolean>> pageTitles =\r
+ new ArrayList<Map<String, Boolean>>();\r
+\r
+ List<WikiPage> pages = wikiPagePersistence.findByN_H_S(\r
+ nodeId, true, WorkflowConstants.STATUS_APPROVED);\r
+\r
+ for (WikiPage page : pages) {\r
+ pageTitles.add(WikiCacheUtil.getOutgoingLinks(page));\r
+ }\r
+\r
+ Set<WikiPage> notOrphans = new HashSet<WikiPage>();\r
+\r
+ for (WikiPage page : pages) {\r
+ for (Map<String, Boolean> pageTitle : pageTitles) {\r
+ if (pageTitle.get(page.getTitle().toLowerCase()) != null) {\r
+ notOrphans.add(page);\r
+\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ List<WikiPage> orphans = new ArrayList<WikiPage>();\r
+\r
+ for (WikiPage page : pages) {\r
+ if (!notOrphans.contains(page)) {\r
+ orphans.add(page);\r
+ }\r
+ }\r
+\r
+ orphans = ListUtil.sort(orphans);\r
+\r
+ return orphans;\r
+ }\r
+\r
+ public List<WikiPage> getOutgoingLinks(long nodeId, String title)\r
+ throws PortalException, SystemException {\r
+\r
+ WikiPage page = getPage(nodeId, title);\r
+\r
+ Map<String, WikiPage> pages = new LinkedHashMap<String, WikiPage>();\r
+\r
+ Map<String, Boolean> links = WikiCacheUtil.getOutgoingLinks(page);\r
+\r
+ for (Map.Entry<String, Boolean> entry : links.entrySet()) {\r
+ String curTitle = entry.getKey();\r
+ Boolean exists = entry.getValue();\r
+\r
+ if (exists) {\r
+ WikiPage curPage = getPage(nodeId, curTitle);\r
+\r
+ if (!pages.containsKey(curPage.getTitle())) {\r
+ pages.put(curPage.getTitle(), curPage);\r
+ }\r
+ }\r
+ else {\r
+ WikiPageImpl newPage = new WikiPageImpl();\r
+\r
+ newPage.setNew(true);\r
+ newPage.setNodeId(nodeId);\r
+ newPage.setTitle(curTitle);\r
+\r
+ if (!pages.containsKey(curTitle)) {\r
+ pages.put(curTitle, newPage);\r
+ }\r
+ }\r
+ }\r
+\r
+ return ListUtil.fromMapValues(pages);\r
+ }\r
+\r
+ public WikiPage getPage(long resourcePrimKey)\r
+ throws PortalException, SystemException {\r
+\r
+ return getPage(resourcePrimKey, Boolean.TRUE);\r
+ }\r
+\r
+ public WikiPage getPage(long resourcePrimKey, Boolean head)\r
+ throws PortalException, SystemException {\r
+\r
+ WikiPageResource wikiPageResource =\r
+ wikiPageResourceLocalService.getPageResource(resourcePrimKey);\r
+\r
+ return getPage(\r
+ wikiPageResource.getNodeId(), wikiPageResource.getTitle(), head);\r
+ }\r
+\r
+ public WikiPage getPage(long nodeId, String title)\r
+ throws PortalException, SystemException {\r
+\r
+ List<WikiPage> pages = wikiPagePersistence.findByN_T_H(\r
+ nodeId, title, true, 0, 1);\r
+\r
+ if (!pages.isEmpty()) {\r
+ return pages.get(0);\r
+ }\r
+ else {\r
+ throw new NoSuchPageException();\r
+ }\r
+ }\r
+\r
+ public WikiPage getPage(long nodeId, String title, Boolean head)\r
+ throws PortalException, SystemException {\r
+\r
+ List<WikiPage> pages;\r
+\r
+ if (head == null) {\r
+ pages = wikiPagePersistence.findByN_T(nodeId, title, 0, 1);\r
+ }\r
+ else {\r
+ pages = wikiPagePersistence.findByN_T_H(nodeId, title, head, 0, 1);\r
+ }\r
+\r
+ if (!pages.isEmpty()) {\r
+ return pages.get(0);\r
+ }\r
+ else {\r
+ throw new NoSuchPageException();\r
+ }\r
+ }\r
+\r
+ public WikiPage getPage(long nodeId, String title, double version)\r
+ throws PortalException, SystemException {\r
+\r
+ WikiPage page = null;\r
+\r
+ if (version == 0) {\r
+ page = getPage(nodeId, title);\r
+ }\r
+ else {\r
+ page = wikiPagePersistence.findByN_T_V(nodeId, title, version);\r
+ }\r
+\r
+ return page;\r
+ }\r
+\r
+ public WikiPage getPageByPageId(long pageId)\r
+ throws PortalException, SystemException {\r
+\r
+ return wikiPagePersistence.findByPrimaryKey(pageId);\r
+ }\r
+\r
+ public WikiPageDisplay getPageDisplay(\r
+ long nodeId, String title, PortletURL viewPageURL,\r
+ PortletURL editPageURL, String attachmentURLPrefix)\r
+ throws PortalException, SystemException {\r
+\r
+ WikiPage page = getPage(nodeId, title);\r
+\r
+ return getPageDisplay(\r
+ page, viewPageURL, editPageURL, attachmentURLPrefix);\r
+ }\r
+\r
+ public WikiPageDisplay getPageDisplay(\r
+ WikiPage page, PortletURL viewPageURL, PortletURL editPageURL,\r
+ String attachmentURLPrefix)\r
+ throws PortalException, SystemException {\r
+\r
+ String formattedContent = WikiUtil.convert(\r
+ page, viewPageURL, editPageURL, attachmentURLPrefix);\r
+\r
+ return new WikiPageDisplayImpl(\r
+ page.getUserId(), page.getNodeId(), page.getTitle(),\r
+ page.getVersion(), page.getContent(), formattedContent,\r
+ page.getFormat(), page.getHead(), page.getAttachmentsFiles());\r
+ }\r
+\r
+ public List<WikiPage> getPages(\r
+ long nodeId, boolean head, int start, int end)\r
+ throws SystemException {\r
+\r
+ return getPages(\r
+ nodeId, head, start, end, new PageCreateDateComparator(false));\r
+ }\r
+\r
+ public List<WikiPage> getPages(\r
+ long nodeId, boolean head, int start, int end,\r
+ OrderByComparator obc)\r
+ throws SystemException {\r
+\r
+ return wikiPagePersistence.findByN_H_S(\r
+ nodeId, head, WorkflowConstants.STATUS_APPROVED, start, end, obc);\r
+ }\r
+\r
+ public List<WikiPage> getPages(long nodeId, int start, int end)\r
+ throws SystemException {\r
+\r
+ return getPages(\r
+ nodeId, start, end, new PageCreateDateComparator(false));\r
+ }\r
+\r
+ public List<WikiPage> getPages(\r
+ long nodeId, int start, int end, OrderByComparator obc)\r
+ throws SystemException {\r
+\r
+ return wikiPagePersistence.findByNodeId(nodeId, start, end, obc);\r
+ }\r
+\r
+ public List<WikiPage> getPages(\r
+ long resourcePrimKey, long nodeId, int status)\r
+ throws SystemException {\r
+\r
+ return wikiPagePersistence.findByR_N_S(resourcePrimKey, nodeId, status);\r
+ }\r
+\r
+ public List<WikiPage> getPages(\r
+ long userId, long nodeId, int status, int start, int end)\r
+ throws SystemException {\r
+\r
+ if (userId > 0) {\r
+ return wikiPagePersistence.findByU_N_S(\r
+ userId, nodeId, status, start, end,\r
+ new PageCreateDateComparator(false));\r
+ }\r
+ else {\r
+ return wikiPagePersistence.findByN_S(\r
+ nodeId, status, start, end,\r
+ new PageCreateDateComparator(false));\r
+ }\r
+ }\r
+\r
+ public List<WikiPage> getPages(\r
+ long nodeId, String title, boolean head, int start, int end)\r
+ throws SystemException {\r
+\r
+ return wikiPagePersistence.findByN_T_H(\r
+ nodeId, title, head, start, end,\r
+ new PageCreateDateComparator(false));\r
+ }\r
+\r
+ public List<WikiPage> getPages(\r
+ long nodeId, String title, int start, int end)\r
+ throws SystemException {\r
+\r
+ return wikiPagePersistence.findByN_T(\r
+ nodeId, title, start, end, new PageCreateDateComparator(false));\r
+ }\r
+\r
+ public List<WikiPage> getPages(\r
+ long nodeId, String title, int start, int end,\r
+ OrderByComparator obc)\r
+ throws SystemException {\r
+\r
+ return wikiPagePersistence.findByN_T(nodeId, title, start, end, obc);\r
+ }\r
+\r
+ public List<WikiPage> getPages(String format) throws SystemException {\r
+ return wikiPagePersistence.findByFormat(format);\r
+ }\r
+\r
+ public int getPagesCount(long nodeId) throws SystemException {\r
+ return wikiPagePersistence.countByNodeId(nodeId);\r
+ }\r
+\r
+ public int getPagesCount(long nodeId, boolean head) throws SystemException {\r
+ return wikiPagePersistence.countByN_H_S(\r
+ nodeId, head, WorkflowConstants.STATUS_APPROVED);\r
+ }\r
+\r
+ public int getPagesCount(long userId, long nodeId, int status)\r
+ throws SystemException {\r
+\r
+ if (userId > 0) {\r
+ return wikiPagePersistence.countByU_N_S(userId, nodeId, status);\r
+ }\r
+ else {\r
+ return wikiPagePersistence.countByN_S(nodeId, status);\r
+ }\r
+ }\r
+\r
+ public int getPagesCount(long nodeId, String title) throws SystemException {\r
+ return wikiPagePersistence.countByN_T(nodeId, title);\r
+ }\r
+\r
+ public int getPagesCount(long nodeId, String title, boolean head)\r
+ throws SystemException {\r
+\r
+ return wikiPagePersistence.countByN_T_H(nodeId, title, head);\r
+ }\r
+\r
+ public int getPagesCount(String format) throws SystemException {\r
+ return wikiPagePersistence.countByFormat(format);\r
+ }\r
+\r
+ public List<WikiPage> getRecentChanges(long nodeId, int start, int end)\r
+ throws SystemException {\r
+\r
+ Calendar cal = CalendarFactoryUtil.getCalendar();\r
+\r
+ cal.add(Calendar.WEEK_OF_YEAR, -1);\r
+\r
+ return wikiPageFinder.findByCreateDate(\r
+ nodeId, cal.getTime(), false, start, end);\r
+ }\r
+\r
+ public int getRecentChangesCount(long nodeId) throws SystemException {\r
+ Calendar cal = CalendarFactoryUtil.getCalendar();\r
+\r
+ cal.add(Calendar.WEEK_OF_YEAR, -1);\r
+\r
+ return wikiPageFinder.countByCreateDate(nodeId, cal.getTime(), false);\r
+ }\r
+\r
+ public String[] getTempPageAttachmentNames(\r
+ long userId, String tempFolderName) {\r
+\r
+ return TempFileUtil.getTempFileEntryNames(userId, tempFolderName);\r
+ }\r
+\r
+ public boolean hasDraftPage(long nodeId, String title)\r
+ throws SystemException {\r
+\r
+ int count = wikiPagePersistence.countByN_T_S(\r
+ nodeId, title, WorkflowConstants.STATUS_DRAFT);\r
+\r
+ if (count > 0) {\r
+ return true;\r
+ }\r
+ else {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ public void movePage(\r
+ long userId, long nodeId, String title, String newTitle,\r
+ boolean strict, ServiceContext serviceContext)\r
+ throws PortalException, SystemException {\r
+\r
+ validateTitle(newTitle);\r
+\r
+ // Check if the new title already exists\r
+\r
+ if (title.equalsIgnoreCase(newTitle)) {\r
+ throw new DuplicatePageException(newTitle);\r
+ }\r
+\r
+ if (isUsedTitle(nodeId, newTitle)) {\r
+ WikiPage page = getPage(nodeId, newTitle);\r
+\r
+ // Support moving back to a previously moved title\r
+\r
+ if (((page.getVersion() == WikiPageConstants.VERSION_DEFAULT) &&\r
+ (page.getContent().length() < 200)) ||\r
+ !strict) {\r
+\r
+ deletePage(nodeId, newTitle);\r
+ }\r
+ else {\r
+ throw new DuplicatePageException(newTitle);\r
+ }\r
+ }\r
+\r
+ // All versions\r
+\r
+ List<WikiPage> pageVersions = wikiPagePersistence.findByN_T(\r
+ nodeId, title);\r
+\r
+ if (pageVersions.size() == 0) {\r
+ return;\r
+ }\r
+\r
+ for (WikiPage page : pageVersions) {\r
+ page.setTitle(newTitle);\r
+\r
+ wikiPagePersistence.update(page, false);\r
+ }\r
+\r
+ // Children\r
+\r
+ List<WikiPage> children = wikiPagePersistence.findByN_P(nodeId, title);\r
+\r
+ for (WikiPage page : children) {\r
+ page.setParentTitle(newTitle);\r
+\r
+ wikiPagePersistence.update(page, false);\r
+ }\r
+\r
+ WikiPage page = pageVersions.get(pageVersions.size() - 1);\r
+\r
+ long resourcePrimKey = page.getResourcePrimKey();\r
+\r
+ // Page resource\r
+\r
+ WikiPageResource wikiPageResource =\r
+ wikiPageResourcePersistence.findByPrimaryKey(resourcePrimKey);\r
+\r
+ wikiPageResource.setTitle(newTitle);\r
+\r
+ wikiPageResourcePersistence.update(wikiPageResource, false);\r
+\r
+ // Create stub page at the old location\r
+\r
+ double version = WikiPageConstants.VERSION_DEFAULT;\r
+ String summary = WikiPageConstants.MOVED + " to " + title;\r
+ String format = page.getFormat();\r
+ boolean head = true;\r
+ String parentTitle = page.getParentTitle();\r
+ String redirectTitle = page.getTitle();\r
+ String content =\r
+ StringPool.DOUBLE_OPEN_BRACKET + redirectTitle +\r
+ StringPool.DOUBLE_CLOSE_BRACKET;\r
+\r
+ serviceContext.setAddGroupPermissions(true);\r
+ serviceContext.setAddGuestPermissions(true);\r
+\r
+ try {\r
+ AssetEntry assetEntry = assetEntryLocalService.getEntry(\r
+ WikiPage.class.getName(), page.getResourcePrimKey());\r
+ \r
+ List<AssetLink> assetLinks = assetLinkLocalService.getDirectLinks(\r
+ assetEntry.getEntryId(), AssetLinkConstants.TYPE_RELATED);\r
+ \r
+ long[] assetLinkEntryIds = StringUtil.split(\r
+ ListUtil.toString(assetLinks, AssetLink.ENTRY_ID2_ACCESSOR), 0L);\r
+ \r
+ serviceContext.setAssetLinkEntryIds(assetLinkEntryIds);\r
+ }\r
+ catch (Exception e){}\r
+\r
+ addPage(\r
+ userId, nodeId, title, version, content, summary, false, format,\r
+ head, parentTitle, redirectTitle, serviceContext);\r
+\r
+ // Move redirects to point to the page with the new title\r
+\r
+ List<WikiPage> redirectedPages = wikiPagePersistence.findByN_R(\r
+ nodeId, title);\r
+\r
+ for (WikiPage redirectedPage : redirectedPages) {\r
+ redirectedPage.setRedirectTitle(newTitle);\r
+\r
+ wikiPagePersistence.update(redirectedPage, false);\r
+ }\r
+\r
+ // Asset\r
+\r
+ updateAsset(userId, page, null, null, null);\r
+\r
+ // Indexer\r
+\r
+ Indexer indexer = IndexerRegistryUtil.nullSafeGetIndexer(\r
+ WikiPage.class);\r
+\r
+ indexer.delete(\r
+ new Object[] {page.getCompanyId(), page.getNodeId(), title});\r
+\r
+ indexer.reindex(page);\r
+ }\r
+\r
+ public void movePage(\r
+ long userId, long nodeId, String title, String newTitle,\r
+ ServiceContext serviceContext)\r
+ throws PortalException, SystemException {\r
+\r
+ movePage(userId, nodeId, title, newTitle, true, serviceContext);\r
+ }\r
+\r
+ public WikiPage revertPage(\r
+ long userId, long nodeId, String title, double version,\r
+ ServiceContext serviceContext)\r
+ throws PortalException, SystemException {\r
+\r
+ WikiPage oldPage = getPage(nodeId, title, version);\r
+\r
+ return updatePage(\r
+ userId, nodeId, title, 0, oldPage.getContent(),\r
+ WikiPageConstants.REVERTED + " to " + version, false,\r
+ oldPage.getFormat(), getParentPageTitle(oldPage),\r
+ oldPage.getRedirectTitle(), serviceContext);\r
+ }\r
+\r
+ public void subscribePage(long userId, long nodeId, String title)\r
+ throws PortalException, SystemException {\r
+\r
+ WikiPage page = getPage(nodeId, title);\r
+\r
+ subscriptionLocalService.addSubscription(\r
+ userId, page.getGroupId(), WikiPage.class.getName(),\r
+ page.getResourcePrimKey());\r
+ }\r
+\r
+ public void unsubscribePage(long userId, long nodeId, String title)\r
+ throws PortalException, SystemException {\r
+\r
+ WikiPage page = getPage(nodeId, title);\r
+\r
+ subscriptionLocalService.deleteSubscription(\r
+ userId, WikiPage.class.getName(), page.getResourcePrimKey());\r
+ }\r
+\r
+ public void updateAsset(\r
+ long userId, WikiPage page, long[] assetCategoryIds,\r
+ String[] assetTagNames, long[] assetLinkEntryIds)\r
+ throws PortalException, SystemException {\r
+\r
+ try {\r
+ boolean addDraftAssetEntry = false;\r
+ \r
+ if (!page.isApproved() &&\r
+ (page.getVersion() != WikiPageConstants.VERSION_DEFAULT)) {\r
+ \r
+ int approvedPagesCount = wikiPagePersistence.countByN_T_S(\r
+ page.getNodeId(), page.getTitle(),\r
+ WorkflowConstants.STATUS_APPROVED);\r
+ \r
+ if (approvedPagesCount > 0) {\r
+ addDraftAssetEntry = true;\r
+ }\r
+ }\r
+ \r
+ AssetEntry assetEntry = null;\r
+ \r
+ if (addDraftAssetEntry) {\r
+ assetEntry = assetEntryLocalService.updateEntry(\r
+ userId, page.getGroupId(), WikiPage.class.getName(),\r
+ page.getPrimaryKey(), page.getUuid(), 0, assetCategoryIds,\r
+ assetTagNames, false, null, null, null, null,\r
+ ContentTypes.TEXT_HTML, page.getTitle(), null, null, null, null,\r
+ 0, 0, null, false);\r
+ }\r
+ else {\r
+ assetEntry = assetEntryLocalService.updateEntry(\r
+ userId, page.getGroupId(), WikiPage.class.getName(),\r
+ page.getResourcePrimKey(), page.getUuid(), 0, assetCategoryIds,\r
+ assetTagNames, page.isApproved(), null, null, null, null,\r
+ ContentTypes.TEXT_HTML, page.getTitle(), null, null, null, null,\r
+ 0, 0, null, false);\r
+ }\r
+ \r
+ assetLinkLocalService.updateLinks(\r
+ userId, assetEntry.getEntryId(), assetLinkEntryIds,\r
+ AssetLinkConstants.TYPE_RELATED);\r
+ }\r
+ catch (Exception e){}\r
+ }\r
+\r
+ public WikiPage updatePage(\r
+ long userId, long nodeId, String title, double version,\r
+ String content, String summary, boolean minorEdit, String format,\r
+ String parentTitle, String redirectTitle,\r
+ ServiceContext serviceContext)\r
+ throws PortalException, SystemException {\r
+\r
+ // Page\r
+\r
+ User user = userPersistence.findByPrimaryKey(userId);\r
+ Date now = new Date();\r
+\r
+ WikiPage oldPage = null;\r
+\r
+ try {\r
+ oldPage = wikiPagePersistence.findByN_T_First(nodeId, title, null);\r
+ }\r
+ catch (NoSuchPageException nspe) {\r
+ return addPage(\r
+ userId, nodeId, title, WikiPageConstants.VERSION_DEFAULT,\r
+ content, summary, minorEdit, format, true, parentTitle,\r
+ redirectTitle, serviceContext);\r
+ }\r
+\r
+ long pageId = 0;\r
+\r
+ if (oldPage.isApproved()) {\r
+ pageId = counterLocalService.increment();\r
+ }\r
+ else {\r
+ pageId = oldPage.getPageId();\r
+ }\r
+\r
+ content = SanitizerUtil.sanitize(\r
+ user.getCompanyId(), oldPage.getGroupId(), userId,\r
+ WikiPage.class.getName(), pageId, "text/" + format, content);\r
+\r
+ validate(nodeId, content, format);\r
+\r
+ double oldVersion = oldPage.getVersion();\r
+\r
+ if ((version > 0) && (version != oldVersion)) {\r
+ throw new PageVersionException();\r
+ }\r
+\r
+ serviceContext.validateModifiedDate(\r
+ oldPage, PageVersionException.class);\r
+\r
+ long resourcePrimKey =\r
+ wikiPageResourceLocalService.getPageResourcePrimKey(nodeId, title);\r
+ long groupId = oldPage.getGroupId();\r
+\r
+ WikiPage page = oldPage;\r
+\r
+ double newVersion = oldVersion;\r
+\r
+ if (oldPage.isApproved()) {\r
+ newVersion = MathUtil.format(oldVersion + 0.1, 1, 1);\r
+\r
+ page = wikiPagePersistence.create(pageId);\r
+ }\r
+\r
+ page.setResourcePrimKey(resourcePrimKey);\r
+ page.setGroupId(groupId);\r
+ page.setCompanyId(user.getCompanyId());\r
+ page.setUserId(user.getUserId());\r
+ page.setUserName(user.getFullName());\r
+ page.setCreateDate(serviceContext.getModifiedDate(now));\r
+ page.setModifiedDate(serviceContext.getModifiedDate(now));\r
+ page.setNodeId(nodeId);\r
+ page.setTitle(title);\r
+ page.setVersion(newVersion);\r
+ page.setMinorEdit(minorEdit);\r
+ page.setContent(content);\r
+\r
+ if (oldPage.isPending()) {\r
+ page.setStatus(oldPage.getStatus());\r
+ }\r
+ else {\r
+ page.setStatus(WorkflowConstants.STATUS_DRAFT);\r
+ }\r
+\r
+ page.setSummary(summary);\r
+ page.setFormat(format);\r
+\r
+ if (Validator.isNotNull(parentTitle)) {\r
+ page.setParentTitle(parentTitle);\r
+ }\r
+\r
+ if (Validator.isNotNull(redirectTitle)) {\r
+ page.setRedirectTitle(redirectTitle);\r
+ }\r
+\r
+ wikiPagePersistence.update(page, false);\r
+\r
+ // Expando\r
+\r
+ ExpandoBridge expandoBridge = page.getExpandoBridge();\r
+\r
+ expandoBridge.setAttributes(serviceContext);\r
+\r
+ // Node\r
+\r
+ WikiNode node = wikiNodePersistence.findByPrimaryKey(nodeId);\r
+\r
+ node.setLastPostDate(serviceContext.getModifiedDate(now));\r
+\r
+ wikiNodePersistence.update(node, false);\r
+\r
+ // Asset\r
+\r
+ updateAsset(\r
+ userId, page, serviceContext.getAssetCategoryIds(),\r
+ serviceContext.getAssetTagNames(),\r
+ serviceContext.getAssetLinkEntryIds());\r
+\r
+ // Workflow\r
+\r
+ WorkflowHandlerRegistryUtil.startWorkflowInstance(\r
+ user.getCompanyId(), page.getGroupId(), userId,\r
+ WikiPage.class.getName(), page.getPageId(), page, serviceContext);\r
+\r
+ return page;\r
+ }\r
+\r
+ public WikiPage updateStatus(\r
+ long userId, long resourcePrimKey, int status,\r
+ ServiceContext serviceContext)\r
+ throws PortalException, SystemException {\r
+\r
+ WikiPageResource wikiPageResource =\r
+ wikiPageResourceLocalService.getPageResource(resourcePrimKey);\r
+\r
+ List<WikiPage> pages = wikiPagePersistence.findByN_T(\r
+ wikiPageResource.getNodeId(), wikiPageResource.getTitle(), 0, 1,\r
+ new PageVersionComparator());\r
+\r
+ WikiPage page = null;\r
+\r
+ if (!pages.isEmpty()) {\r
+ page = pages.get(0);\r
+ }\r
+ else {\r
+ throw new NoSuchPageException();\r
+ }\r
+\r
+ return updateStatus(userId, page, status, serviceContext);\r
+ }\r
+\r
+ public WikiPage updateStatus(\r
+ long userId, WikiPage page, int status,\r
+ ServiceContext serviceContext)\r
+ throws PortalException, SystemException {\r
+\r
+ // Page\r
+\r
+ User user = userPersistence.findByPrimaryKey(userId);\r
+ WikiNode node = wikiNodePersistence.findByPrimaryKey(page.getNodeId());\r
+\r
+ Date now = new Date();\r
+\r
+ int oldStatus = page.getStatus();\r
+\r
+ page.setStatus(status);\r
+ page.setStatusByUserId(userId);\r
+ page.setStatusByUserName(user.getFullName());\r
+ page.setStatusDate(now);\r
+\r
+ if (status == WorkflowConstants.STATUS_APPROVED) {\r
+\r
+ // Asset\r
+\r
+ if ((oldStatus != WorkflowConstants.STATUS_APPROVED) &&\r
+ (page.getVersion() != WikiPageConstants.VERSION_DEFAULT)) {\r
+\r
+ try {\r
+ AssetEntry draftAssetEntry =\r
+ assetEntryLocalService.getEntry(\r
+ WikiPage.class.getName(), page.getPrimaryKey());\r
+\r
+ long[] assetCategoryIds = draftAssetEntry.getCategoryIds();\r
+ String[] assetTagNames = draftAssetEntry.getTagNames();\r
+\r
+ List<AssetLink> assetLinks =\r
+ assetLinkLocalService.getDirectLinks(\r
+ draftAssetEntry.getEntryId(),\r
+ AssetLinkConstants.TYPE_RELATED);\r
+\r
+ long[] assetLinkEntryIds = StringUtil.split(\r
+ ListUtil.toString(\r
+ assetLinks, AssetLink.ENTRY_ID2_ACCESSOR), 0L);\r
+\r
+ AssetEntry assetEntry = assetEntryLocalService.updateEntry(\r
+ userId, page.getGroupId(), WikiPage.class.getName(),\r
+ page.getResourcePrimKey(), page.getUuid(), 0,\r
+ assetCategoryIds, assetTagNames, true, null, null, null,\r
+ null, ContentTypes.TEXT_HTML, page.getTitle(), null,\r
+ null, null, null, 0, 0, null, false);\r
+\r
+ // Asset Links\r
+\r
+ assetLinkLocalService.updateLinks(\r
+ userId, assetEntry.getEntryId(), assetLinkEntryIds,\r
+ AssetLinkConstants.TYPE_RELATED);\r
+\r
+ assetEntryLocalService.deleteEntry(\r
+ draftAssetEntry.getEntryId());\r
+ }\r
+ catch (NoSuchEntryException nsee) {\r
+ }\r
+ catch (Exception e){\r
+ }\r
+ }\r
+\r
+ try {\r
+ assetEntryLocalService.updateVisible(\r
+ WikiPage.class.getName(), page.getResourcePrimKey(), true);\r
+ }\r
+ catch (Exception e){\r
+ }\r
+\r
+ // Social\r
+\r
+ if (!page.isMinorEdit() ||\r
+ PropsValues.WIKI_PAGE_MINOR_EDIT_ADD_SOCIAL_ACTIVITY) {\r
+\r
+ int activity = WikiActivityKeys.ADD_PAGE;\r
+\r
+ if (page.getVersion() > WikiPageConstants.VERSION_DEFAULT) {\r
+ activity = WikiActivityKeys.UPDATE_PAGE;\r
+ }\r
+\r
+ socialActivityLocalService.addActivity(\r
+ userId, page.getGroupId(), WikiPage.class.getName(),\r
+ page.getResourcePrimKey(), activity, StringPool.BLANK, 0);\r
+ }\r
+\r
+ // Subscriptions\r
+\r
+ if (NotificationThreadLocal.isEnabled() &&\r
+ (!page.isMinorEdit() ||\r
+ PropsValues.WIKI_PAGE_MINOR_EDIT_SEND_EMAIL)) {\r
+\r
+ boolean update = false;\r
+\r
+ if (page.getVersion() > WikiPageConstants.VERSION_DEFAULT) {\r
+ update = true;\r
+ }\r
+\r
+ notifySubscribers(node, page, serviceContext, update);\r
+ }\r
+\r
+ // Indexer\r
+\r
+ Indexer indexer = IndexerRegistryUtil.nullSafeGetIndexer(\r
+ WikiPage.class);\r
+\r
+ indexer.reindex(page);\r
+\r
+ // Cache\r
+\r
+ clearPageCache(page);\r
+\r
+ // Head\r
+\r
+ page.setHead(true);\r
+\r
+ List<WikiPage> pages = wikiPagePersistence.findByN_T_H(\r
+ page.getNodeId(), page.getTitle(), true);\r
+\r
+ for (WikiPage curPage : pages) {\r
+ if (!curPage.equals(page)) {\r
+ curPage.setHead(false);\r
+\r
+ wikiPagePersistence.update(curPage, false);\r
+ }\r
+ }\r
+ }\r
+ else {\r
+\r
+ // Head\r
+\r
+ page.setHead(false);\r
+\r
+ List<WikiPage> pages = wikiPagePersistence.findByN_T_S(\r
+ page.getNodeId(), page.getTitle(),\r
+ WorkflowConstants.STATUS_APPROVED);\r
+\r
+ for (WikiPage curPage : pages) {\r
+ if (!curPage.equals(page)) {\r
+ curPage.setHead(true);\r
+\r
+ wikiPagePersistence.update(curPage, false);\r
+\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ return wikiPagePersistence.update(page, false);\r
+ }\r
+\r
+ public void validateTitle(String title) throws PortalException {\r
+ if (title.equals("all_pages") || title.equals("orphan_pages") ||\r
+ title.equals("recent_changes")) {\r
+\r
+ throw new PageTitleException(title + " is reserved");\r
+ }\r
+\r
+ if (Validator.isNotNull(PropsValues.WIKI_PAGE_TITLES_REGEXP)) {\r
+ Pattern pattern = Pattern.compile(\r
+ PropsValues.WIKI_PAGE_TITLES_REGEXP);\r
+\r
+ Matcher matcher = pattern.matcher(title);\r
+\r
+ if (!matcher.matches()) {\r
+ throw new PageTitleException();\r
+ }\r
+ }\r
+ }\r
+\r
+ protected void clearPageCache(WikiPage page) {\r
+ if (!WikiCacheThreadLocal.isClearCache()) {\r
+ return;\r
+ }\r
+\r
+ WikiCacheUtil.clearCache(page.getNodeId());\r
+ }\r
+\r
+ protected String getParentPageTitle(WikiPage page) {\r
+\r
+ // LPS-4586\r
+\r
+ try {\r
+ WikiPage parentPage = getPage(\r
+ page.getNodeId(), page.getParentTitle());\r
+\r
+ return parentPage.getTitle();\r
+ }\r
+ catch (Exception e) {\r
+ return null;\r
+ }\r
+ }\r
+\r
+ protected WikiPage getPreviousVersionPage(WikiPage page)\r
+ throws PortalException, SystemException {\r
+\r
+ double previousVersion = MathUtil.format(page.getVersion() - 0.1, 1, 1);\r
+\r
+ if (previousVersion < 1) {\r
+ return null;\r
+ }\r
+\r
+ return getPage(page.getNodeId(), page.getTitle(), previousVersion);\r
+ }\r
+\r
+ protected boolean isLinkedTo(WikiPage page, String targetTitle)\r
+ throws PortalException {\r
+\r
+ Map<String, Boolean> links = WikiCacheUtil.getOutgoingLinks(page);\r
+\r
+ Boolean link = links.get(targetTitle.toLowerCase());\r
+\r
+ if (link != null) {\r
+ return true;\r
+ }\r
+ else {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ protected boolean isUsedTitle(long nodeId, String title)\r
+ throws SystemException {\r
+\r
+ if (getPagesCount(nodeId, title, true) > 0) {\r
+ return true;\r
+ }\r
+ else {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ protected void notifySubscribers(\r
+ WikiNode node, WikiPage page, ServiceContext serviceContext,\r
+ boolean update)\r
+ throws PortalException, SystemException {\r
+\r
+ PortletPreferences preferences = null;\r
+\r
+ String rootPortletId = serviceContext.getRootPortletId();\r
+\r
+ if (Validator.isNull(rootPortletId) ||\r
+ rootPortletId.equals(PortletKeys.WIKI_DISPLAY)) {\r
+\r
+ preferences = ServiceContextUtil.getPortletPreferences(\r
+ serviceContext);\r
+ }\r
+\r
+ if (preferences == null) {\r
+ preferences = portletPreferencesLocalService.getPreferences(\r
+ node.getCompanyId(), node.getGroupId(),\r
+ PortletKeys.PREFS_OWNER_TYPE_GROUP,\r
+ PortletKeys.PREFS_PLID_SHARED, PortletKeys.WIKI_ADMIN, null);\r
+ }\r
+\r
+ if (!update && WikiUtil.getEmailPageAddedEnabled(preferences)) {\r
+ }\r
+ else if (update && WikiUtil.getEmailPageUpdatedEnabled(preferences)) {\r
+ }\r
+ else {\r
+ return;\r
+ }\r
+\r
+ String portalURL = serviceContext.getPortalURL();\r
+ String layoutFullURL = serviceContext.getLayoutFullURL();\r
+\r
+ WikiPage previousVersionPage = getPreviousVersionPage(page);\r
+\r
+ String attachmentURLPrefix =\r
+ portalURL + serviceContext.getPathMain() +\r
+ "/wiki/get_page_attachment?p_l_id=" + serviceContext.getPlid() +\r
+ "&nodeId=" + page.getNodeId() + "&title=" +\r
+ HttpUtil.encodeURL(page.getTitle()) + "&fileName=";\r
+\r
+ String pageDiffs = StringPool.BLANK;\r
+\r
+ try {\r
+ pageDiffs = WikiUtil.diffHtml(\r
+ previousVersionPage, page, null, null, attachmentURLPrefix);\r
+ }\r
+ catch (Exception e) {\r
+ }\r
+\r
+ String pageContent = null;\r
+\r
+ if (Validator.equals(page.getFormat(), "creole")) {\r
+ pageContent = WikiUtil.convert(\r
+ page, null, null, attachmentURLPrefix);\r
+ }\r
+ else {\r
+ pageContent = page.getContent();\r
+ pageContent = WikiUtil.processContent(pageContent);\r
+ }\r
+\r
+ String pageURL = StringPool.BLANK;\r
+ String diffsURL = StringPool.BLANK;\r
+\r
+ if (Validator.isNotNull(layoutFullURL)) {\r
+ pageURL =\r
+ layoutFullURL + Portal.FRIENDLY_URL_SEPARATOR + "wiki/" +\r
+ node.getNodeId() + StringPool.SLASH +\r
+ HttpUtil.encodeURL(page.getTitle());\r
+\r
+ if (previousVersionPage != null) {\r
+ StringBundler sb = new StringBundler(16);\r
+\r
+ sb.append(layoutFullURL);\r
+ sb.append("?p_p_id=");\r
+ sb.append(PortletKeys.WIKI);\r
+ sb.append("&p_p_state=");\r
+ sb.append(WindowState.MAXIMIZED);\r
+ sb.append("&struts_action=");\r
+ sb.append(HttpUtil.encodeURL("/wiki/compare_versions"));\r
+ sb.append("&nodeId=");\r
+ sb.append(node.getNodeId());\r
+ sb.append("&title=");\r
+ sb.append(HttpUtil.encodeURL(page.getTitle()));\r
+ sb.append("&sourceVersion=");\r
+ sb.append(previousVersionPage.getVersion());\r
+ sb.append("&targetVersion=");\r
+ sb.append(page.getVersion());\r
+ sb.append("&type=html");\r
+\r
+ diffsURL = sb.toString();\r
+ }\r
+ }\r
+\r
+ String fromName = WikiUtil.getEmailFromName(\r
+ preferences, page.getCompanyId());\r
+ String fromAddress = WikiUtil.getEmailFromAddress(\r
+ preferences, page.getCompanyId());\r
+\r
+ String subjectPrefix = null;\r
+ String body = null;\r
+ String signature = null;\r
+\r
+ if (update) {\r
+ subjectPrefix = WikiUtil.getEmailPageUpdatedSubjectPrefix(\r
+ preferences);\r
+ body = WikiUtil.getEmailPageUpdatedBody(preferences);\r
+ signature = WikiUtil.getEmailPageUpdatedSignature(preferences);\r
+ }\r
+ else {\r
+ subjectPrefix = WikiUtil.getEmailPageAddedSubjectPrefix(\r
+ preferences);\r
+ body = WikiUtil.getEmailPageAddedBody(preferences);\r
+ signature = WikiUtil.getEmailPageAddedSignature(preferences);\r
+ }\r
+\r
+ String subject = page.getTitle();\r
+\r
+ if (subject.indexOf(subjectPrefix) == -1) {\r
+ subject = subjectPrefix + StringPool.SPACE + subject;\r
+ }\r
+\r
+ if (Validator.isNotNull(signature)) {\r
+ body += "\n" + signature;\r
+ }\r
+\r
+ SubscriptionSender subscriptionSender = new SubscriptionSender();\r
+\r
+ subscriptionSender.setBody(body);\r
+ subscriptionSender.setCompanyId(page.getCompanyId());\r
+ subscriptionSender.setContextAttributes(\r
+ "[$DIFFS_URL$]", diffsURL, "[$NODE_NAME$]", node.getName(),\r
+ "[$PAGE_DATE_UPDATE$]", page.getModifiedDate(), "[$PAGE_ID$]",\r
+ page.getPageId(), "[$PAGE_SUMMARY$]", page.getSummary(),\r
+ "[$PAGE_TITLE$]", page.getTitle(), "[$PAGE_URL$]", pageURL);\r
+ subscriptionSender.setContextAttribute(\r
+ "[$PAGE_CONTENT$]", pageContent, false);\r
+ subscriptionSender.setContextAttribute(\r
+ "[$PAGE_DIFFS$]", replaceStyles(pageDiffs), false);\r
+ subscriptionSender.setContextUserPrefix("PAGE");\r
+ subscriptionSender.setFrom(fromAddress, fromName);\r
+ subscriptionSender.setHtmlFormat(true);\r
+ subscriptionSender.setMailId(\r
+ "wiki_page", page.getNodeId(), page.getPageId());\r
+ subscriptionSender.setPortletId(PortletKeys.WIKI);\r
+ subscriptionSender.setReplyToAddress(fromAddress);\r
+ subscriptionSender.setScopeGroupId(node.getGroupId());\r
+ subscriptionSender.setServiceContext(serviceContext);\r
+ subscriptionSender.setSubject(subject);\r
+ subscriptionSender.setUserId(page.getUserId());\r
+\r
+ subscriptionSender.addPersistedSubscribers(\r
+ WikiNode.class.getName(), node.getNodeId());\r
+ subscriptionSender.addPersistedSubscribers(\r
+ WikiPage.class.getName(), page.getResourcePrimKey());\r
+\r
+ subscriptionSender.flushNotificationsAsync();\r
+ }\r
+\r
+ protected String replaceStyles(String html) {\r
+ return StringUtil.replace(\r
+ html,\r
+ new String[] {\r
+ "class=\"diff-html-added\"", "class=\"diff-html-removed\"",\r
+ "class=\"diff-html-changed\"",\r
+ "changeType=\"diff-added-image\"",\r
+ "changeType=\"diff-removed-image\"",\r
+ "changeType=\"diff-changed-image\""\r
+ },\r
+ new String[] {\r
+ "style=\"background-color: #CFC;\"",\r
+ "style=\"background-color: #FDC6C6; text-decoration: " +\r
+ "line-through;\"",\r
+ "style=\"border-bottom: 2px dotted blue;\"",\r
+ "style=\"border: 10px solid #CFC;\"",\r
+ "style=\"border: 10px solid #FDC6C6;\"",\r
+ "style=\"border: 10px solid blue;\""\r
+ }\r
+ );\r
+ }\r
+\r
+ protected void validate(long nodeId, String content, String format)\r
+ throws PortalException {\r
+\r
+ if (!WikiUtil.validate(nodeId, content, format)) {\r
+ throw new PageContentException();\r
+ }\r
+ }\r
+\r
+ protected void validate(\r
+ String title, long nodeId, String content, String format)\r
+ throws PortalException, SystemException {\r
+\r
+ if (Validator.isNull(title)) {\r
+ throw new PageTitleException();\r
+ }\r
+\r
+ if (isUsedTitle(nodeId, title)) {\r
+ throw new DuplicatePageException();\r
+ }\r
+\r
+ validateTitle(title);\r
+\r
+ validate(nodeId, content, format);\r
+ }\r
+\r
+}
\ No newline at end of file