/** * 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.socialcoding.jira.social; 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.security.permission.PermissionChecker; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.util.CharPool; import com.liferay.portal.kernel.util.ClassResourceBundleLoader; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.HtmlUtil; import com.liferay.portal.kernel.util.ResourceBundleLoader; 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.social.kernel.model.BaseSocialActivityInterpreter; import com.liferay.social.kernel.model.SocialActivity; import com.liferay.socialcoding.model.JIRAAction; import com.liferay.socialcoding.model.JIRAIssue; import com.liferay.socialcoding.service.JIRAActionLocalServiceUtil; import com.liferay.socialcoding.service.JIRAIssueLocalServiceUtil; import com.liferay.socialcoding.util.PortletPropsValues; /** * @author Brian Wing Shun Chan */ public class JIRAActivityInterpreter extends BaseSocialActivityInterpreter { @Override public String[] getClassNames() { return _CLASS_NAMES; } @Override protected String getBody( SocialActivity activity, ServiceContext serviceContext) throws Exception { String link = getLink(activity, serviceContext); String text = StringPool.BLANK; int activityType = activity.getType(); if (activityType == JIRAActivityKeys.ADD_CHANGE) { JSONObject extraDataJSONObject = JSONFactoryUtil.createJSONObject( activity.getExtraData()); text = interpretJIRAChangeItems( extraDataJSONObject.getJSONArray("jiraChangeItems"), serviceContext); } else if (activityType == JIRAActivityKeys.ADD_COMMENT) { long jiraActionId = GetterUtil.getLong( getJSONValue(activity.getExtraData(), "jiraActionId")); JIRAAction jiraAction = JIRAActionLocalServiceUtil.getJIRAAction( jiraActionId); text = HtmlUtil.escape(jiraAction.getBody()); } else if (activityType == JIRAActivityKeys.ADD_ISSUE) { JIRAIssue jiraIssue = JIRAIssueLocalServiceUtil.getJIRAIssue( activity.getClassPK()); text = HtmlUtil.escape(jiraIssue.getSummary()); } return wrapLink(link, text); } @Override protected String getLink( SocialActivity activity, ServiceContext serviceContext) throws Exception { StringBundler sb = new StringBundler(5); sb.append(PortletPropsValues.JIRA_URL); sb.append("/browse/"); JIRAIssue jiraIssue = JIRAIssueLocalServiceUtil.getJIRAIssue( activity.getClassPK()); sb.append(jiraIssue.getKey()); int activityType = activity.getType(); if (activityType == JIRAActivityKeys.ADD_COMMENT) { sb.append("#action_"); long jiraActionId = GetterUtil.getLong( getJSONValue(activity.getExtraData(), "jiraActionId")); JIRAAction jiraAction = JIRAActionLocalServiceUtil.getJIRAAction( jiraActionId); sb.append(jiraAction.getJiraActionId()); } return sb.toString(); } @Override protected ResourceBundleLoader getResourceBundleLoader() { return _resourceBundleLoader; } @Override protected Object[] getTitleArguments( String groupName, SocialActivity activity, String link, String title, ServiceContext serviceContext) throws Exception { String creatorUserName = getUserName( activity.getUserId(), serviceContext); JIRAIssue jiraIssue = JIRAIssueLocalServiceUtil.getJIRAIssue( activity.getClassPK()); return new Object[] {creatorUserName, jiraIssue.getKey()}; } @Override protected String getTitlePattern( String groupName, SocialActivity activity) { int activityType = activity.getType(); if (activityType == JIRAActivityKeys.ADD_CHANGE) { return "activity-social-coding-jira-add-change"; } else if (activityType == JIRAActivityKeys.ADD_COMMENT) { return "activity-social-coding-jira-add-comment"; } else if (activityType == JIRAActivityKeys.ADD_ISSUE) { return "activity-social-coding-jira-add-issue"; } return StringPool.BLANK; } @Override protected boolean hasPermissions( PermissionChecker permissionChecker, SocialActivity activity, String actionId, ServiceContext serviceContext) { return true; } protected String interpretJIRAChangeItem( JSONObject jiraChangeItem, ServiceContext serviceContext) { String field = jiraChangeItem.getString("field"); field = StringUtil.replace( StringUtil.toLowerCase(field), CharPool.SPACE, CharPool.DASH); String newString = jiraChangeItem.getString("newString"); String newValue = jiraChangeItem.getString("newValue"); if (Validator.isNull(newString)) { return StringPool.BLANK; } StringBundler sb = new StringBundler(2); if (field.equals("description") || field.equals("summary")) { sb.append( serviceContext.translate( "activity-social-coding-jira-add-change-" + field)); sb.append("<br />"); } else if (field.equals("assignee") || field.equals("attachment") || field.equals("fix-version") || field.equals("issuetype") || field.equals("priority") || field.equals("resolution") || field.equals("status") || field.equals("version")) { sb.append( serviceContext.translate( "activity-social-coding-jira-add-change-" + field, new Object[] {HtmlUtil.escape(newString)})); sb.append("<br />"); } else if (field.equals("link") && newValue.startsWith("LEP-")) { sb.append( serviceContext.translate( "activity-social-coding-jira-add-change-" + field, new Object[] {HtmlUtil.escape(newValue)})); sb.append("<br />"); } return sb.toString(); } protected String interpretJIRAChangeItems( JSONArray jiraChangeItemsJSONArray, ServiceContext serviceContext) { if (jiraChangeItemsJSONArray == null) { return StringPool.BLANK; } if (jiraChangeItemsJSONArray.length() == 0) { return serviceContext.translate( "activity-social-coding-jira-add-change-default"); } StringBundler sb = new StringBundler(jiraChangeItemsJSONArray.length()); for (int i = 0; i < jiraChangeItemsJSONArray.length(); i++) { JSONObject jiraChangeItemJSONObject = jiraChangeItemsJSONArray.getJSONObject(i); sb.append( interpretJIRAChangeItem( jiraChangeItemJSONObject, serviceContext)); } return sb.toString(); } private static final String[] _CLASS_NAMES = {JIRAIssue.class.getName()}; private final ResourceBundleLoader _resourceBundleLoader = new ClassResourceBundleLoader( "content.Language", JIRAActivityInterpreter.class); }