/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This file is part of Liferay Social Office. Liferay Social Office is free * software: you can redistribute it and/or modify it under the terms of the GNU * Affero General Public License as published by the Free Software Foundation, * either version 3 of the License, or (at your option) any later version. * * Liferay Social Office 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 Affero General Public License * for more details. * * You should have received a copy of the GNU General Public License along with * Liferay Social Office. If not, see http://www.gnu.org/licenses/agpl-3.0.html. */ package com.liferay.so.activities.portlet; import com.liferay.message.boards.kernel.model.MBMessage; import com.liferay.message.boards.kernel.model.MBMessageDisplay; import com.liferay.message.boards.kernel.model.MBThread; import com.liferay.message.boards.kernel.model.MBTreeWalker; import com.liferay.message.boards.kernel.service.MBMessageLocalServiceUtil; import com.liferay.message.boards.kernel.service.MBMessageServiceUtil; import com.liferay.message.boards.kernel.util.comparator.MessageCreateDateComparator; import com.liferay.microblogs.model.MicroblogsEntry; import com.liferay.microblogs.model.MicroblogsEntryConstants; import com.liferay.microblogs.service.MicroblogsEntryLocalServiceUtil; import com.liferay.microblogs.service.MicroblogsEntryServiceUtil; import com.liferay.portal.kernel.dao.orm.QueryUtil; import com.liferay.portal.kernel.json.JSONArray; import com.liferay.portal.kernel.json.JSONFactoryUtil; import com.liferay.portal.kernel.json.JSONObject; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.service.ServiceContextFactory; import com.liferay.portal.kernel.service.UserLocalServiceUtil; import com.liferay.portal.kernel.theme.ThemeDisplay; import com.liferay.portal.kernel.util.Constants; import com.liferay.portal.kernel.util.FastDateFormatFactoryUtil; import com.liferay.portal.kernel.util.HtmlUtil; import com.liferay.portal.kernel.util.ListUtil; import com.liferay.portal.kernel.util.ParamUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.Time; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.kernel.workflow.WorkflowConstants; import com.liferay.so.activities.util.ActivitiesUtil; import com.liferay.social.kernel.model.SocialActivitySet; import com.liferay.social.kernel.service.SocialActivitySetLocalServiceUtil; import java.io.IOException; import java.text.DateFormat; import java.text.Format; import java.util.Date; import java.util.List; import javax.portlet.ActionRequest; import javax.portlet.ActionResponse; import javax.portlet.PortletException; import javax.portlet.ResourceRequest; import javax.portlet.ResourceResponse; /** * @author Matthew Kong */ public class ActivitiesPortlet extends MVCPortlet { public void getMBComments( SocialActivitySet activitySet, ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay)resourceRequest.getAttribute( WebKeys.THEME_DISPLAY); JSONObject jsonObject = JSONFactoryUtil.createJSONObject(); JSONArray jsonArray = JSONFactoryUtil.createJSONArray(); Object[] commentsClassNameAndClassPK = ActivitiesUtil.getCommentsClassNameAndClassPK(activitySet); String className = (String)commentsClassNameAndClassPK[0]; long classPK = (Long)commentsClassNameAndClassPK[1]; MBMessageDisplay mbMessageDisplay = MBMessageLocalServiceUtil.getDiscussionMessageDisplay( themeDisplay.getUserId(), activitySet.getGroupId(), className, classPK, WorkflowConstants.STATUS_APPROVED); MBTreeWalker mbTeeWalker = mbMessageDisplay.getTreeWalker(); List<MBMessage> mbMessages = mbTeeWalker.getMessages(); mbMessages = ListUtil.sort( mbMessages, new MessageCreateDateComparator(true)); for (int i = 1; i < mbMessages.size(); i++) { MBMessage mbMessage = mbMessages.get(i); JSONObject messageJSONObject = getJSONObject( mbMessage.getMessageId(), mbMessage.getBody(), mbMessage.getModifiedDate(), mbMessage.getUserId(), mbMessage.getUserName(), themeDisplay); jsonArray.put(messageJSONObject); } jsonObject.put("comments", jsonArray); writeJSON(resourceRequest, resourceResponse, jsonObject); } public void getMicroblogsComments( SocialActivitySet activitySet, ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay)resourceRequest.getAttribute( WebKeys.THEME_DISPLAY); JSONObject jsonObject = JSONFactoryUtil.createJSONObject(); JSONArray jsonArray = JSONFactoryUtil.createJSONArray(); List<MicroblogsEntry> microblogsEntries = MicroblogsEntryLocalServiceUtil. getParentMicroblogsEntryMicroblogsEntries( MicroblogsEntryConstants.TYPE_REPLY, activitySet.getClassPK(), QueryUtil.ALL_POS, QueryUtil.ALL_POS); for (MicroblogsEntry microblogsEntry : microblogsEntries) { JSONObject microblogsEntryJSONObject = getJSONObject( microblogsEntry.getMicroblogsEntryId(), microblogsEntry.getContent(), microblogsEntry.getModifiedDate(), microblogsEntry.getUserId(), microblogsEntry.getUserName(), themeDisplay); jsonArray.put(microblogsEntryJSONObject); } jsonObject.put("comments", jsonArray); jsonObject.put("commentsCount", microblogsEntries.size()); writeJSON(resourceRequest, resourceResponse, jsonObject); } @Override public void processAction( ActionRequest actionRequest, ActionResponse actionResponse) throws IOException, PortletException { String actionName = ParamUtil.getString( actionRequest, ActionRequest.ACTION_NAME); try { if (actionName.equals("repostMicroblogsEntry")) { repostMicroblogsEntry(actionRequest, actionResponse); } else if (actionName.equals("updateComment")) { String className = ParamUtil.getString( actionRequest, "className"); if (className.equals(MicroblogsEntry.class.getName())) { updateMicroblogsComment(actionRequest, actionResponse); } else { updateMBComment(actionRequest, actionResponse); } } } catch (Exception e) { throw new PortletException(e); } } public void repostMicroblogsEntry( ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute( WebKeys.THEME_DISPLAY); long microblogsEntryId = ParamUtil.getLong( actionRequest, "microblogsEntryId"); MicroblogsEntry microblogsEntry = MicroblogsEntryLocalServiceUtil.getMicroblogsEntry( microblogsEntryId); ServiceContext serviceContext = ServiceContextFactory.getInstance( MicroblogsEntry.class.getName(), actionRequest); MicroblogsEntryServiceUtil.addMicroblogsEntry( themeDisplay.getUserId(), microblogsEntry.getContent(), MicroblogsEntryConstants.TYPE_REPOST, microblogsEntry.getMicroblogsEntryId(), microblogsEntry.getSocialRelationType(), serviceContext); } @Override public void serveResource( ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws PortletException { try { String resourceID = resourceRequest.getResourceID(); if (resourceID.equals("getComments")) { long activitySetId = ParamUtil.getLong( resourceRequest, "activitySetId"); SocialActivitySet activitySet = SocialActivitySetLocalServiceUtil.fetchSocialActivitySet( activitySetId); if (activitySet == null) { return; } String className = activitySet.getClassName(); if (className.equals(MicroblogsEntry.class.getName())) { getMicroblogsComments( activitySet, resourceRequest, resourceResponse); } else { getMBComments( activitySet, resourceRequest, resourceResponse); } } else { super.serveResource(resourceRequest, resourceResponse); } } catch (Exception e) { throw new PortletException(e); } } public void updateMBComment( ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute( WebKeys.THEME_DISPLAY); String cmd = ParamUtil.getString(actionRequest, Constants.CMD); String className = ParamUtil.getString(actionRequest, "className"); long classPK = ParamUtil.getLong(actionRequest, "classPK"); long mbMessageId = ParamUtil.getLong( actionRequest, "mbMessageIdOrMicroblogsEntryId"); String body = ParamUtil.getString(actionRequest, "body"); JSONObject jsonObject = JSONFactoryUtil.createJSONObject(); try { MBMessage mbMessage = null; long groupId = themeDisplay.getScopeGroupId(); ServiceContext serviceContext = ServiceContextFactory.getInstance( MBMessage.class.getName(), actionRequest); if (cmd.equals(Constants.DELETE)) { MBMessageServiceUtil.deleteDiscussionMessage( groupId, className, classPK, className, classPK, themeDisplay.getUserId(), mbMessageId); } else if (cmd.equals(Constants.EDIT) && (mbMessageId > 0)) { mbMessage = MBMessageServiceUtil.updateDiscussionMessage( className, classPK, mbMessageId, StringPool.BLANK, body, serviceContext); } else { MBMessageDisplay mbMessageDisplay = MBMessageLocalServiceUtil.getDiscussionMessageDisplay( themeDisplay.getUserId(), groupId, className, classPK, WorkflowConstants.STATUS_APPROVED); MBThread mbThread = mbMessageDisplay.getThread(); MBTreeWalker mbTreeWalker = mbMessageDisplay.getTreeWalker(); MBMessage rootMBMessage = mbTreeWalker.getRoot(); mbMessage = MBMessageServiceUtil.addDiscussionMessage( groupId, className, classPK, mbThread.getThreadId(), rootMBMessage.getMessageId(), StringPool.BLANK, body, serviceContext); } if (mbMessage != null) { jsonObject = getJSONObject( mbMessage.getMessageId(), mbMessage.getBody(), mbMessage.getModifiedDate(), mbMessage.getUserId(), mbMessage.getUserName(), themeDisplay); } jsonObject.put("success", Boolean.TRUE); } catch (Exception e) { jsonObject.put("success", Boolean.FALSE); } writeJSON(actionRequest, actionResponse, jsonObject); } public void updateMicroblogsComment( ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute( WebKeys.THEME_DISPLAY); String cmd = ParamUtil.getString(actionRequest, Constants.CMD); long classPK = ParamUtil.getLong(actionRequest, "classPK"); long microblogsEntryId = ParamUtil.getLong( actionRequest, "mbMessageIdOrMicroblogsEntryId"); String body = ParamUtil.getString(actionRequest, "body"); JSONObject jsonObject = JSONFactoryUtil.createJSONObject(); try { MicroblogsEntry microblogsEntry = null; if (cmd.equals(Constants.DELETE)) { MicroblogsEntryServiceUtil.deleteMicroblogsEntry( microblogsEntryId); } else if (classPK > 0) { MicroblogsEntry currentMicroblogsEntry = MicroblogsEntryLocalServiceUtil.getMicroblogsEntry(classPK); ServiceContext serviceContext = ServiceContextFactory.getInstance( MicroblogsEntry.class.getName(), actionRequest); if (cmd.equals(Constants.EDIT) && (microblogsEntryId > 0)) { microblogsEntry = MicroblogsEntryServiceUtil.updateMicroblogsEntry( microblogsEntryId, body, currentMicroblogsEntry.getSocialRelationType(), serviceContext); } else { microblogsEntry = MicroblogsEntryServiceUtil.addMicroblogsEntry( themeDisplay.getUserId(), body, MicroblogsEntryConstants.TYPE_REPLY, classPK, currentMicroblogsEntry.getSocialRelationType(), serviceContext); } } if (microblogsEntry != null) { jsonObject = getJSONObject( microblogsEntry.getMicroblogsEntryId(), microblogsEntry.getContent(), microblogsEntry.getModifiedDate(), microblogsEntry.getUserId(), microblogsEntry.getUserName(), themeDisplay); } jsonObject.put("success", Boolean.TRUE); } catch (Exception e) { jsonObject.put("success", Boolean.FALSE); } writeJSON(actionRequest, actionResponse, jsonObject); } protected JSONObject getJSONObject( long mbMessageIdOrMicroblogsEntryId, String body, Date modifiedDate, long userId, String userName, ThemeDisplay themeDisplay) throws Exception { JSONObject jsonObject = JSONFactoryUtil.createJSONObject(); jsonObject.put("body", HtmlUtil.escape(body)); if ((userId <= 0) || (userId != themeDisplay.getUserId())) { jsonObject.put("commentControlsClass", "hide"); } jsonObject.put( "mbMessageIdOrMicroblogsEntryId", mbMessageIdOrMicroblogsEntryId); Format dateFormat = FastDateFormatFactoryUtil.getDate( DateFormat.FULL, themeDisplay.getLocale(), themeDisplay.getTimeZone()); jsonObject.put( "modifiedDate", Time.getRelativeTimeDescription( modifiedDate.getTime(), themeDisplay.getLocale(), themeDisplay.getTimeZone(), dateFormat)); User user = UserLocalServiceUtil.fetchUser(userId); if (user != null) { jsonObject.put("userDisplayURL", user.getDisplayURL(themeDisplay)); jsonObject.put( "userPortraitURL", HtmlUtil.escape(user.getPortraitURL(themeDisplay))); } jsonObject.put("userName", HtmlUtil.escape(userName)); return jsonObject; } }