/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.so.activities.hook.social;
import com.liferay.asset.kernel.model.AssetRenderer;
import com.liferay.portal.kernel.exception.NoSuchModelException;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.model.LayoutConstants;
import com.liferay.portal.kernel.portlet.PortletURLFactoryUtil;
import com.liferay.portal.kernel.portletfilerepository.PortletFileRepositoryUtil;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.HtmlUtil;
import com.liferay.portal.kernel.util.HttpUtil;
import com.liferay.portal.kernel.util.MathUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.so.activities.util.SocialActivityKeyConstants;
import com.liferay.social.kernel.model.SocialActivity;
import com.liferay.social.kernel.model.SocialActivityConstants;
import com.liferay.social.kernel.model.SocialActivitySet;
import com.liferay.social.kernel.service.SocialActivityLocalServiceUtil;
import com.liferay.social.kernel.service.SocialActivitySetLocalServiceUtil;
import com.liferay.wiki.constants.WikiPortletKeys;
import com.liferay.wiki.model.WikiNode;
import com.liferay.wiki.model.WikiPage;
import com.liferay.wiki.model.WikiPageResource;
import com.liferay.wiki.service.WikiNodeLocalServiceUtil;
import com.liferay.wiki.service.WikiPageLocalServiceUtil;
import com.liferay.wiki.service.WikiPageResourceLocalServiceUtil;
import javax.portlet.PortletRequest;
import javax.portlet.PortletURL;
/**
* @author Jonathan Lee
* @author Matthew Kong
*/
public class WikiActivityInterpreter extends SOSocialActivityInterpreter {
public String[] getClassNames() {
return _CLASS_NAMES;
}
@Override
public void updateActivitySet(long activityId) throws PortalException {
SocialActivity activity =
SocialActivityLocalServiceUtil.fetchSocialActivity(activityId);
if ((activity == null) || (activity.getActivitySetId() > 0)) {
return;
}
long activitySetId = getActivitySetId(activityId);
if (activitySetId > 0) {
SocialActivitySetLocalServiceUtil.incrementActivityCount(
activitySetId, activityId);
if (activity.getType() ==
SocialActivityKeyConstants.WIKI_UPDATE_PAGE) {
SocialActivitySet activitySet =
SocialActivitySetLocalServiceUtil.fetchSocialActivitySet(
activitySetId);
WikiPageResource pageResource =
WikiPageResourceLocalServiceUtil.fetchWikiPageResource(
activity.getClassPK());
WikiPage wikiPage = WikiPageLocalServiceUtil.getPage(
pageResource.getResourcePrimKey());
JSONObject extraDataJSONObject = null;
if (Validator.isNull(activitySet.getExtraData())) {
extraDataJSONObject = JSONFactoryUtil.createJSONObject();
extraDataJSONObject.put(
"sourceVersion",
MathUtil.format(wikiPage.getVersion() - 0.1, 1, 1));
}
else {
extraDataJSONObject = JSONFactoryUtil.createJSONObject(
activitySet.getExtraData());
}
extraDataJSONObject.put("targetVersion", wikiPage.getVersion());
activitySet.setExtraData(extraDataJSONObject.toString());
SocialActivitySetLocalServiceUtil.updateSocialActivitySet(
activitySet);
}
}
else {
SocialActivitySet activitySet =
SocialActivitySetLocalServiceUtil.addActivitySet(activityId);
if (activity.getType() ==
SocialActivityKeyConstants.WIKI_UPDATE_PAGE) {
WikiPageResource pageResource =
WikiPageResourceLocalServiceUtil.fetchWikiPageResource(
activity.getClassPK());
WikiPage wikiPage = WikiPageLocalServiceUtil.getPage(
pageResource.getResourcePrimKey());
JSONObject extraDataJSONObject =
JSONFactoryUtil.createJSONObject();
extraDataJSONObject.put(
"sourceVersion",
MathUtil.format(wikiPage.getVersion() - 0.1, 1, 1));
extraDataJSONObject.put("targetVersion", wikiPage.getVersion());
activitySet.setExtraData(extraDataJSONObject.toString());
SocialActivitySetLocalServiceUtil.updateSocialActivitySet(
activitySet);
}
}
}
protected String appendNodeTitlePattern(String titlePattern, long classPK) {
try {
WikiPageResource pageResource =
WikiPageResourceLocalServiceUtil.fetchWikiPageResource(classPK);
if (pageResource == null) {
return titlePattern;
}
WikiNode node = WikiNodeLocalServiceUtil.fetchWikiNode(
pageResource.getNodeId());
if (Validator.isNotNull(node)) {
titlePattern = titlePattern.concat("-in-the-x-wiki");
}
}
catch (Exception e) {
}
return titlePattern;
}
@Override
protected long getActivitySetId(long activityId) {
try {
SocialActivity activity =
SocialActivityLocalServiceUtil.getActivity(activityId);
SocialActivitySet activitySet = null;
boolean comment = false;
if ((activity.getType() ==
SocialActivityKeyConstants.WIKI_ADD_COMMENT) ||
(activity.getType() ==
SocialActivityConstants.TYPE_ADD_COMMENT)) {
activitySet =
SocialActivitySetLocalServiceUtil.getClassActivitySet(
activity.getClassNameId(), activity.getClassPK(),
activity.getType());
comment = true;
}
else if (activity.getType() ==
SocialActivityKeyConstants.WIKI_UPDATE_PAGE) {
activitySet =
SocialActivitySetLocalServiceUtil.getClassActivitySet(
activity.getUserId(), activity.getClassNameId(),
activity.getClassPK(), activity.getType());
}
if ((activitySet != null) && !isExpired(activitySet, comment)) {
return activitySet.getActivitySetId();
}
}
catch (Exception e) {
}
return 0;
}
@Override
protected String getAttachmentTitle(
SocialActivity activity, WikiPageResource pageResource,
ServiceContext serviceContext)
throws Exception {
int activityType = activity.getType();
if ((activityType == SocialActivityConstants.TYPE_ADD_ATTACHMENT) ||
(activityType ==
SocialActivityConstants.TYPE_MOVE_ATTACHMENT_TO_TRASH) ||
(activityType ==
SocialActivityConstants.TYPE_RESTORE_ATTACHMENT_FROM_TRASH)) {
String link = null;
FileEntry fileEntry = null;
try {
long fileEntryId = GetterUtil.getLong(
activity.getExtraDataValue("fileEntryId"));
fileEntry = PortletFileRepositoryUtil.getPortletFileEntry(
fileEntryId);
}
catch (NoSuchModelException nsme) {
}
String fileEntryTitle = activity.getExtraDataValue(
"fileEntryTitle");
if ((fileEntry != null) && !fileEntry.isInTrash()) {
StringBundler sb = new StringBundler(9);
sb.append(serviceContext.getPathMain());
sb.append("/wiki/get_page_attachment?p_l_id=");
sb.append(serviceContext.getPlid());
sb.append("&nodeId=");
sb.append(pageResource.getNodeId());
sb.append("&title=");
sb.append(HttpUtil.encodeURL(pageResource.getTitle()));
sb.append("&fileName=");
sb.append(fileEntryTitle);
link = sb.toString();
}
return wrapLink(link, fileEntryTitle);
}
return StringPool.BLANK;
}
@Override
protected String getBody(
SocialActivity activity, ServiceContext serviceContext)
throws Exception {
return getBody(
activity.getClassName(), activity.getClassPK(), serviceContext);
}
@Override
protected String getBody(
SocialActivitySet activitySet, ServiceContext serviceContext)
throws Exception {
if ((activitySet.getType() ==
SocialActivityKeyConstants.WIKI_ADD_COMMENT) ||
(activitySet.getType() ==
SocialActivityKeyConstants.WIKI_UPDATE_PAGE) ||
(activitySet.getType() ==
SocialActivityConstants.TYPE_ADD_COMMENT)) {
return getBody(
activitySet.getClassName(), activitySet.getClassPK(),
serviceContext);
}
return super.getBody(activitySet, serviceContext);
}
protected String getBody(
String className, long classPK, ServiceContext serviceContext)
throws Exception {
StringBundler sb = new StringBundler(5);
sb.append("<div class=\"activity-body\"><div class=\"title\">");
sb.append(getPageTitle(className, classPK, serviceContext));
sb.append("</div><div class=\"wiki-page-content\">");
AssetRenderer assetRenderer = getAssetRenderer(className, classPK);
sb.append(
StringUtil.shorten(
HtmlUtil.escape(assetRenderer.getSummary(), 200)));
sb.append("</div></div>");
return sb.toString();
}
protected String getDiffsURL(
long classPK, long groupId, String sourceVersion,
String targetVersion, ServiceContext serviceContext)
throws Exception {
WikiPageResource pageResource =
WikiPageResourceLocalServiceUtil.fetchWikiPageResource(classPK);
if (pageResource == null) {
return null;
}
long plid = PortalUtil.getPlidFromPortletId(
groupId, WikiPortletKeys.WIKI);
if (plid == LayoutConstants.DEFAULT_PLID) {
return null;
}
PortletURL diffsURL = PortletURLFactoryUtil.create(
serviceContext.getLiferayPortletRequest(), WikiPortletKeys.WIKI,
plid, PortletRequest.RENDER_PHASE);
diffsURL.setParameter("struts_action", "/wiki/compare_versions");
diffsURL.setParameter(
"nodeId", String.valueOf(pageResource.getNodeId()));
diffsURL.setParameter("title", pageResource.getTitle());
diffsURL.setParameter("sourceVersion", sourceVersion);
diffsURL.setParameter("targetVersion", targetVersion);
diffsURL.setParameter("type", "html");
return diffsURL.toString();
}
protected String getLink(
long groupId, long classPK, String sourceVersion,
String targetVersion, ServiceContext serviceContext)
throws Exception {
String diffsURL = wrapLink(
getDiffsURL(
classPK, groupId, sourceVersion, targetVersion, serviceContext),
serviceContext.translate("view-changes"));
return "<span>" + diffsURL + "</span>";
}
@Override
protected String getLink(
SocialActivity activity, ServiceContext serviceContext)
throws Exception {
if (activity.getType() != SocialActivityKeyConstants.WIKI_UPDATE_PAGE) {
return null;
}
SocialActivity socialActivity =
SocialActivityLocalServiceUtil.fetchSocialActivity(
activity.getActivityId());
SocialActivitySet activitySet =
SocialActivitySetLocalServiceUtil.fetchSocialActivitySet(
socialActivity.getActivitySetId());
if (Validator.isNull(activitySet.getExtraData())) {
return null;
}
JSONObject extraDataJSONObject = JSONFactoryUtil.createJSONObject(
activitySet.getExtraData());
String sourceVersion = extraDataJSONObject.getString("sourceVersion");
String targetVersion = extraDataJSONObject.getString("targetVersion");
return getLink(
activity.getGroupId(), activity.getClassPK(), sourceVersion,
targetVersion, serviceContext);
}
@Override
protected String getLink(
SocialActivitySet activitySet, ServiceContext serviceContext)
throws Exception {
if (activitySet.getType() !=
SocialActivityKeyConstants.WIKI_UPDATE_PAGE) {
return null;
}
if (Validator.isNull(activitySet.getExtraData())) {
return null;
}
JSONObject extraDataJSONObject = JSONFactoryUtil.createJSONObject(
activitySet.getExtraData());
String sourceVersion = extraDataJSONObject.getString("sourceVersion");
String targetVersion = extraDataJSONObject.getString("targetVersion");
return getLink(
activitySet.getGroupId(), activitySet.getClassPK(), sourceVersion,
targetVersion, serviceContext);
}
protected String getNodeTitle(
long classPK, long groupId, ServiceContext serviceContext)
throws Exception {
WikiPageResource pageResource =
WikiPageResourceLocalServiceUtil.fetchWikiPageResource(classPK);
if (pageResource == null) {
return null;
}
WikiNode node = WikiNodeLocalServiceUtil.fetchWikiNode(
pageResource.getNodeId());
if (node == null) {
return null;
}
long plid = PortalUtil.getPlidFromPortletId(
groupId, WikiPortletKeys.WIKI);
if (plid == LayoutConstants.DEFAULT_PLID) {
return HtmlUtil.escape(node.getName());
}
PortletURL nodeURL = PortletURLFactoryUtil.create(
serviceContext.getLiferayPortletRequest(), WikiPortletKeys.WIKI,
plid, PortletRequest.RENDER_PHASE);
nodeURL.setParameter("struts_action", "/wiki/view");
nodeURL.setParameter("nodeId", String.valueOf(node.getNodeId()));
return wrapLink(nodeURL.toString(), node.getName());
}
@Override
protected Object[] getTitleArguments(
String groupName, SocialActivity activity, String link,
String title, ServiceContext serviceContext)
throws Exception {
WikiPageResource pageResource =
WikiPageResourceLocalServiceUtil.fetchWikiPageResource(
activity.getClassPK());
String nodeTitle = getNodeTitle(
activity.getClassPK(), activity.getGroupId(), serviceContext);
return new Object[] {
nodeTitle,
getAttachmentTitle(activity, pageResource, serviceContext)
};
}
@Override
protected Object[] getTitleArguments(
String groupName, SocialActivitySet activitySet, String link,
String title, ServiceContext serviceContext)
throws Exception {
String nodeTitle = getNodeTitle(
activitySet.getClassPK(), activitySet.getGroupId(), serviceContext);
if ((activitySet.getType() ==
SocialActivityKeyConstants.WIKI_ADD_COMMENT) ||
(activitySet.getType() ==
SocialActivityConstants.TYPE_ADD_COMMENT)) {
return new Object[] {nodeTitle};
}
int activityCount = activitySet.getActivityCount();
return new Object[] {activityCount, nodeTitle};
}
@Override
protected String getTitlePattern(String groupName, SocialActivity activity)
throws Exception {
String titlePattern = null;
if ((activity.getType() == SocialActivityConstants.TYPE_ADD_COMMENT) ||
(activity.getType() ==
SocialActivityKeyConstants.WIKI_ADD_COMMENT)) {
titlePattern = "commented-on-a-wiki-page";
}
else if (activity.getType() ==
SocialActivityConstants.TYPE_ADD_ATTACHMENT) {
titlePattern = "added-an-attachment-x-to-a-wiki-page";
}
else if (activity.getType() ==
SocialActivityConstants.TYPE_MOVE_ATTACHMENT_TO_TRASH) {
titlePattern = "removed-an-attachment-x-from-a-wiki-page";
}
else if (activity.getType() ==
SocialActivityConstants.
TYPE_RESTORE_ATTACHMENT_FROM_TRASH) {
titlePattern = "restored-an-attachment-x-to-a-wiki-page";
}
else if (activity.getType() ==
SocialActivityKeyConstants.WIKI_ADD_PAGE) {
titlePattern = "created-a-new-wiki-page";
}
else if (activity.getType() ==
SocialActivityKeyConstants.WIKI_UPDATE_PAGE) {
titlePattern = "updated-a-wiki-page";
}
else {
return StringPool.BLANK;
}
return appendNodeTitlePattern(titlePattern, activity.getClassPK());
}
@Override
protected String getTitlePattern(
String groupName, SocialActivitySet activitySet)
throws Exception {
String titlePattern = null;
if ((activitySet.getType() ==
SocialActivityConstants.TYPE_ADD_COMMENT) ||
(activitySet.getType() ==
SocialActivityKeyConstants.WIKI_ADD_COMMENT)) {
titlePattern = "commented-on-a-wiki-page";
}
else if (activitySet.getType() ==
SocialActivityConstants.TYPE_ADD_ATTACHMENT) {
titlePattern = "added-x-attachments-to-a-wiki-page";
}
else if (activitySet.getType() ==
SocialActivityConstants.TYPE_MOVE_ATTACHMENT_TO_TRASH) {
titlePattern = "removed-x-attachments-from-a-wiki-page";
}
else if (activitySet.getType() ==
SocialActivityConstants.
TYPE_RESTORE_ATTACHMENT_FROM_TRASH) {
titlePattern = "restored-x-attachments-to-a-wiki-page";
}
else if (activitySet.getType() ==
SocialActivityKeyConstants.WIKI_ADD_PAGE) {
titlePattern = "created-x-new-wiki-pages";
}
else if (activitySet.getType() ==
SocialActivityKeyConstants.WIKI_UPDATE_PAGE) {
titlePattern = "made-x-updates-to-a-wiki-page";
}
else {
return StringPool.BLANK;
}
return appendNodeTitlePattern(titlePattern, activitySet.getClassPK());
}
private static final String[] _CLASS_NAMES = {WikiPage.class.getName()};
}