PageRenderTime 50ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/com/atlassian/jira/plugins/bitbucket/streams/BitbucketStreamsActivityProvider.java

https://bitbucket.org/dusanhornik/demo-repository
Java | 233 lines | 192 code | 33 blank | 8 comment | 8 complexity | 8b1207058eb34d66385a239c43a18c98 MD5 | raw file
  1. package com.atlassian.jira.plugins.bitbucket.streams;
  2. import java.io.IOException;
  3. import java.io.StringWriter;
  4. import java.net.URI;
  5. import java.net.URISyntaxException;
  6. import java.util.*;
  7. import java.util.concurrent.atomic.AtomicBoolean;
  8. import com.atlassian.jira.plugins.bitbucket.IssueLinker;
  9. import com.atlassian.jira.plugins.bitbucket.activeobjects.v2.IssueMapping;
  10. import com.atlassian.jira.plugins.bitbucket.api.Changeset;
  11. import com.atlassian.jira.plugins.bitbucket.api.SourceControlRepository;
  12. import com.atlassian.jira.plugins.bitbucket.api.SourceControlUser;
  13. import com.atlassian.jira.plugins.bitbucket.spi.CustomStringUtils;
  14. import com.atlassian.jira.plugins.bitbucket.spi.RepositoryManager;
  15. import com.atlassian.jira.plugins.bitbucket.velocity.VelocityUtils;
  16. import com.atlassian.jira.project.Project;
  17. import com.atlassian.jira.project.ProjectManager;
  18. import com.atlassian.jira.security.JiraAuthenticationContext;
  19. import com.atlassian.jira.security.PermissionManager;
  20. import com.atlassian.jira.security.Permissions;
  21. import com.atlassian.sal.api.ApplicationProperties;
  22. import com.atlassian.sal.api.message.I18nResolver;
  23. import com.atlassian.streams.api.*;
  24. import com.atlassian.streams.api.common.ImmutableNonEmptyList;
  25. import com.atlassian.streams.api.common.Option;
  26. import com.atlassian.streams.spi.*;
  27. import com.atlassian.templaterenderer.TemplateRenderer;
  28. import com.atlassian.util.concurrent.Nullable;
  29. import com.google.common.base.Function;
  30. import com.google.common.base.Predicate;
  31. import com.google.common.collect.Iterables;
  32. import org.apache.commons.collections.CollectionUtils;
  33. import org.joda.time.DateTime;
  34. import org.slf4j.Logger;
  35. import org.slf4j.LoggerFactory;
  36. import org.springframework.beans.factory.annotation.Qualifier;
  37. public class BitbucketStreamsActivityProvider implements StreamsActivityProvider
  38. {
  39. private I18nResolver i18nResolver;
  40. private ApplicationProperties applicationProperties;
  41. private UserProfileAccessor userProfileAccessor;
  42. private RepositoryManager globalRepositoryManager;
  43. private static final Logger log = LoggerFactory.getLogger(BitbucketStreamsActivityProvider.class);
  44. private final IssueLinker issueLinker;
  45. private final TemplateRenderer templateRenderer;
  46. private final PermissionManager permissionManager;
  47. private final JiraAuthenticationContext jiraAuthenticationContext;
  48. private final ProjectManager projectManager;
  49. public BitbucketStreamsActivityProvider(I18nResolver i18nResolver, ApplicationProperties applicationProperties,
  50. UserProfileAccessor userProfileAccessor, @Qualifier("globalRepositoryManager") RepositoryManager globalRepositoryManager, IssueLinker issueLinker, TemplateRenderer templateRenderer, PermissionManager permissionManager, JiraAuthenticationContext jiraAuthenticationContext, ProjectManager projectManager)
  51. {
  52. this.applicationProperties = applicationProperties;
  53. this.i18nResolver = i18nResolver;
  54. this.userProfileAccessor = userProfileAccessor;
  55. this.globalRepositoryManager = globalRepositoryManager;
  56. this.issueLinker = issueLinker;
  57. this.templateRenderer = templateRenderer;
  58. this.permissionManager = permissionManager;
  59. this.jiraAuthenticationContext = jiraAuthenticationContext;
  60. this.projectManager = projectManager;
  61. }
  62. public Iterable<StreamsEntry> transformEntries(Iterable<Changeset> changesetEntries) throws StreamsException
  63. {
  64. return Iterables.transform(changesetEntries, new Function<Changeset, StreamsEntry>()
  65. {
  66. public StreamsEntry apply(Changeset from)
  67. {
  68. return toStreamsEntry(from);
  69. }
  70. });
  71. }
  72. /**
  73. * Transforms a single {@link IssueMapping} to a {@link StreamsEntry}.
  74. *
  75. * @param changeset the changeset entry
  76. * @return the transformed streams entry
  77. */
  78. private StreamsEntry toStreamsEntry(final Changeset changeset)
  79. {
  80. StreamsEntry.ActivityObject activityObject = new StreamsEntry.ActivityObject(StreamsEntry.ActivityObject.params()
  81. .id(changeset.getNode()).alternateLinkUri(URI.create(""))
  82. .activityObjectType(ActivityObjectTypes.status()));
  83. final String author = changeset.getAuthor();
  84. final SourceControlRepository repo = globalRepositoryManager.getRepository(changeset.getRepositoryId());
  85. StreamsEntry.Renderer renderer = new StreamsEntry.Renderer()
  86. {
  87. public StreamsEntry.Html renderTitleAsHtml(StreamsEntry entry)
  88. {
  89. Map<String, Object> templateMap = new HashMap<String, Object>();
  90. templateMap.put("changeset", changeset);
  91. templateMap.put("user_name", changeset.getRawAuthor());
  92. templateMap.put("login", author);
  93. templateMap.put("user_url", repo.getRepositoryUri().getUserUrl(CustomStringUtils.encodeUriPath(author)));
  94. templateMap.put("commit_url", repo.getRepositoryUri().getCommitUrl(changeset.getNode()));
  95. StringWriter sw = new StringWriter();
  96. try
  97. {
  98. templateRenderer.render("/templates/com/atlassian/jira/plugins/bitbucket/streams/activityentry-title.vm", templateMap, sw);
  99. } catch (IOException e)
  100. {
  101. log.warn(e.getMessage(), e);
  102. }
  103. return new StreamsEntry.Html(sw.toString());
  104. }
  105. public Option<StreamsEntry.Html> renderSummaryAsHtml(StreamsEntry entry)
  106. {
  107. return Option.none();
  108. }
  109. public Option<StreamsEntry.Html> renderContentAsHtml(StreamsEntry entry)
  110. {
  111. Map<String, Object> templateMap = new HashMap<String, Object>();
  112. templateMap.put("velocity_utils", new VelocityUtils());
  113. templateMap.put("issue_linker", issueLinker);
  114. templateMap.put("changeset", changeset);
  115. templateMap.put("repository", globalRepositoryManager.getRepository(changeset.getRepositoryId()));
  116. StringWriter sw = new StringWriter();
  117. try
  118. {
  119. templateRenderer.render("/templates/com/atlassian/jira/plugins/bitbucket/streams/activityentry-summary.vm", templateMap, sw);
  120. } catch (IOException e)
  121. {
  122. log.warn(e.getMessage(), e);
  123. }
  124. return Option.some(new StreamsEntry.Html(sw.toString()));
  125. }
  126. };
  127. UserProfile userProfile = userProfileAccessor.getAnonymousUserProfile();
  128. SourceControlUser user = globalRepositoryManager.getUser(repo, changeset.getAuthor());
  129. if (user != null && user.getAvatar() != null && user.getAvatar().startsWith("https"))
  130. {
  131. try {
  132. URI uri = new URI(user.getAvatar());
  133. userProfile = new UserProfile.Builder("").profilePictureUri(Option.option(uri)).build();
  134. } catch (URISyntaxException e) {
  135. // do nothing. we use anonymous gravatar
  136. }
  137. }
  138. return new StreamsEntry(StreamsEntry.params()
  139. .id(URI.create(""))
  140. .postedDate(new DateTime(changeset.getTimestamp()))
  141. .authors(ImmutableNonEmptyList.of(userProfile))
  142. .addActivityObject(activityObject)
  143. .verb(ActivityVerbs.update())
  144. .alternateLinkUri(URI.create(""))
  145. .renderer(renderer)
  146. .applicationType(applicationProperties.getDisplayName()), i18nResolver);
  147. }
  148. public StreamsFeed getActivityFeed(ActivityRequest activityRequest) throws StreamsException
  149. {
  150. GlobalFilter gf = new GlobalFilter();
  151. //get all changeset entries that match the specified activity filters
  152. gf.setInProjects(getInProjectsByPermission(Filters.getIsValues(activityRequest.getStandardFilters().get(StandardStreamsFilterOption.PROJECT_KEY))));
  153. gf.setNotInProjects(Filters.getNotValues(activityRequest.getStandardFilters().get(StandardStreamsFilterOption.PROJECT_KEY)));
  154. gf.setInUsers(Filters.getIsValues(activityRequest.getStandardFilters().get(StandardStreamsFilterOption.USER.getKey())));
  155. gf.setNotInUsers(Filters.getNotValues(activityRequest.getStandardFilters().get(StandardStreamsFilterOption.USER.getKey())));
  156. gf.setInIssues(Filters.getIsValues(activityRequest.getStandardFilters().get(StandardStreamsFilterOption.ISSUE_KEY.getKey())));
  157. gf.setNotInIssues(Filters.getNotValues(activityRequest.getStandardFilters().get(StandardStreamsFilterOption.ISSUE_KEY.getKey())));
  158. log.debug("GlobalFilter: " + gf);
  159. Iterable<Changeset> changesetEntries = globalRepositoryManager.getLatestChangesets(activityRequest.getMaxResults(), gf);
  160. log.debug("Found changeset entries: " + changesetEntries);
  161. Iterable<StreamsEntry> streamEntries = transformEntries(changesetEntries);
  162. return new StreamsFeed(i18nResolver.getText("streams.external.feed.title"), streamEntries, Option.<String>none());
  163. }
  164. private Iterable<String> getInProjectsByPermission(Set<String> inProjectsList)
  165. {
  166. Iterable<Project> projectsToCheckPermission;
  167. if (CollectionUtils.isEmpty(inProjectsList))
  168. {
  169. projectsToCheckPermission = projectManager.getProjectObjects();
  170. } else
  171. {
  172. projectsToCheckPermission = Iterables.transform(inProjectsList, projectKeyToProject);
  173. }
  174. return Iterables.transform(Iterables.filter(projectsToCheckPermission, hasViewSourcePermissionForProject), projectToProjectKey);
  175. }
  176. private final Predicate<Project> hasViewSourcePermissionForProject = new Predicate<Project>()
  177. {
  178. @Override
  179. public boolean apply(@Nullable Project project)
  180. {
  181. return project != null && permissionManager.hasPermission(Permissions.VIEW_VERSION_CONTROL, project, jiraAuthenticationContext.getLoggedInUser());
  182. }
  183. };
  184. private Function<Project, String> projectToProjectKey = new Function<Project, String>()
  185. {
  186. @Override
  187. public String apply(@Nullable Project from)
  188. {
  189. return from.getKey();
  190. }
  191. };
  192. private Function<String, Project> projectKeyToProject = new Function<String, Project>()
  193. {
  194. @Override
  195. public Project apply(@Nullable String from)
  196. {
  197. return projectManager.getProjectObjByKey(from);
  198. }
  199. };
  200. }