PageRenderTime 40ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

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

https://bitbucket.org/atlassian/jira-bitbucket-connector/
Java | 186 lines | 155 code | 23 blank | 8 comment | 0 complexity | 5a860028959dbc06dd35f3d0a6ca9942 MD5 | raw file
  1. package com.atlassian.jira.plugins.bitbucket.streams;
  2. import com.atlassian.jira.plugins.bitbucket.IssueLinker;
  3. import com.atlassian.jira.plugins.bitbucket.activeobjects.v2.IssueMapping;
  4. import com.atlassian.jira.plugins.bitbucket.api.Changeset;
  5. import com.atlassian.jira.plugins.bitbucket.api.SourceControlRepository;
  6. import com.atlassian.jira.plugins.bitbucket.spi.CustomStringUtils;
  7. import com.atlassian.jira.plugins.bitbucket.spi.RepositoryManager;
  8. import com.atlassian.jira.plugins.bitbucket.velocity.VelocityUtils;
  9. import com.atlassian.sal.api.ApplicationProperties;
  10. import com.atlassian.sal.api.message.I18nResolver;
  11. import com.atlassian.streams.api.ActivityObjectTypes;
  12. import com.atlassian.streams.api.ActivityRequest;
  13. import com.atlassian.streams.api.ActivityVerbs;
  14. import com.atlassian.streams.api.Html;
  15. import com.atlassian.streams.api.StreamsEntry;
  16. import com.atlassian.streams.api.StreamsException;
  17. import com.atlassian.streams.api.StreamsFeed;
  18. import com.atlassian.streams.api.UserProfile;
  19. import com.atlassian.streams.api.common.ImmutableNonEmptyList;
  20. import com.atlassian.streams.api.common.Option;
  21. import com.atlassian.streams.spi.CancellableTask;
  22. import com.atlassian.streams.spi.Filters;
  23. import com.atlassian.streams.spi.StandardStreamsFilterOption;
  24. import com.atlassian.streams.spi.StreamsActivityProvider;
  25. import com.atlassian.streams.spi.UserProfileAccessor;
  26. import com.atlassian.templaterenderer.TemplateRenderer;
  27. import com.google.common.base.Function;
  28. import com.google.common.collect.Iterables;
  29. import org.joda.time.DateTime;
  30. import org.slf4j.Logger;
  31. import org.slf4j.LoggerFactory;
  32. import org.springframework.beans.factory.annotation.Qualifier;
  33. import java.io.IOException;
  34. import java.io.StringWriter;
  35. import java.net.URI;
  36. import java.util.HashMap;
  37. import java.util.Map;
  38. public class BitbucketStreamsActivityProvider implements StreamsActivityProvider
  39. {
  40. private I18nResolver i18nResolver;
  41. private ApplicationProperties applicationProperties;
  42. private UserProfileAccessor userProfileAccessor;
  43. private RepositoryManager globalRepositoryManager;
  44. private static final Logger log = LoggerFactory.getLogger(BitbucketStreamsActivityProvider.class);
  45. private final IssueLinker issueLinker;
  46. private final TemplateRenderer templateRenderer;
  47. public BitbucketStreamsActivityProvider(I18nResolver i18nResolver, ApplicationProperties applicationProperties,
  48. UserProfileAccessor userProfileAccessor, @Qualifier("globalRepositoryManager") RepositoryManager globalRepositoryManager,
  49. IssueLinker issueLinker, TemplateRenderer templateRenderer)
  50. {
  51. this.applicationProperties = applicationProperties;
  52. this.i18nResolver = i18nResolver;
  53. this.userProfileAccessor = userProfileAccessor;
  54. this.globalRepositoryManager = globalRepositoryManager;
  55. this.issueLinker = issueLinker;
  56. this.templateRenderer = templateRenderer;
  57. }
  58. public Iterable<StreamsEntry> transformEntries(Iterable<Changeset> changesetEntries) throws StreamsException
  59. {
  60. return Iterables.transform(changesetEntries, new Function<Changeset, StreamsEntry>()
  61. {
  62. public StreamsEntry apply(Changeset from)
  63. {
  64. return toStreamsEntry(from);
  65. }
  66. });
  67. }
  68. /**
  69. * Transforms a single {@link IssueMapping} to a {@link StreamsEntry}.
  70. *
  71. * @param changeset the changeset entry
  72. * @return the transformed streams entry
  73. */
  74. private StreamsEntry toStreamsEntry(final Changeset changeset)
  75. {
  76. StreamsEntry.ActivityObject activityObject = new StreamsEntry.ActivityObject(StreamsEntry.ActivityObject.params()
  77. .id(changeset.getNode()).alternateLinkUri(URI.create(""))
  78. .activityObjectType(ActivityObjectTypes.status()));
  79. final String author = changeset.getAuthor();
  80. final UserProfile userProfile = userProfileAccessor.getAnonymousUserProfile();
  81. StreamsEntry.Renderer renderer = new StreamsEntry.Renderer()
  82. {
  83. public Html renderTitleAsHtml(StreamsEntry entry)
  84. {
  85. SourceControlRepository repo = globalRepositoryManager.getRepository(changeset.getRepositoryId());
  86. Map<String, Object> templateMap = new HashMap<String, Object>();
  87. templateMap.put("changeset", changeset);
  88. templateMap.put("user_name", changeset.getRawAuthor());
  89. templateMap.put("login", author);
  90. templateMap.put("user_url", repo.getRepositoryUri().getUserUrl(CustomStringUtils.encodeUriPath(author)));
  91. templateMap.put("commit_url", repo.getRepositoryUri().getCommitUrl(changeset.getNode()));
  92. StringWriter sw = new StringWriter();
  93. try
  94. {
  95. templateRenderer.render("/templates/com/atlassian/jira/plugins/bitbucket/streams/activityentry-title.vm", templateMap, sw);
  96. } catch (IOException e)
  97. {
  98. log.warn(e.getMessage(), e);
  99. }
  100. return new Html(sw.toString());
  101. }
  102. public Option<Html> renderSummaryAsHtml(StreamsEntry entry)
  103. {
  104. return Option.none();
  105. }
  106. public Option<Html> renderContentAsHtml(StreamsEntry entry)
  107. {
  108. Map<String, Object> templateMap = new HashMap<String, Object>();
  109. templateMap.put("velocity_utils", new VelocityUtils());
  110. templateMap.put("issue_linker", issueLinker);
  111. templateMap.put("changeset", changeset);
  112. templateMap.put("repository", globalRepositoryManager.getRepository(changeset.getRepositoryId()));
  113. StringWriter sw = new StringWriter();
  114. try
  115. {
  116. templateRenderer.render("/templates/com/atlassian/jira/plugins/bitbucket/streams/activityentry-summary.vm", templateMap, sw);
  117. } catch (IOException e)
  118. {
  119. log.warn(e.getMessage(), e);
  120. }
  121. return Option.some(new Html(sw.toString()));
  122. }
  123. };
  124. return new StreamsEntry(StreamsEntry.params()
  125. .id(URI.create(""))
  126. .postedDate(new DateTime(changeset.getTimestamp()))
  127. .authors(ImmutableNonEmptyList.of(userProfile))
  128. .addActivityObject(activityObject)
  129. .verb(ActivityVerbs.update())
  130. .alternateLinkUri(URI.create(""))
  131. .renderer(renderer)
  132. .applicationType(applicationProperties.getDisplayName()), i18nResolver);
  133. }
  134. public CancellableTask<StreamsFeed> getActivityFeed(final ActivityRequest activityRequest) throws StreamsException
  135. {
  136. final GlobalFilter gf = new GlobalFilter();
  137. //get all changeset entries that match the specified activity filters
  138. gf.setInProjects(Filters.getIsValues(activityRequest.getStandardFilters().get(StandardStreamsFilterOption.PROJECT_KEY)));
  139. gf.setNotInProjects(Filters.getNotValues(activityRequest.getStandardFilters().get(StandardStreamsFilterOption.PROJECT_KEY)));
  140. gf.setInUsers(Filters.getIsValues(activityRequest.getStandardFilters().get(StandardStreamsFilterOption.USER.getKey())));
  141. gf.setNotInUsers(Filters.getNotValues(activityRequest.getStandardFilters().get(StandardStreamsFilterOption.USER.getKey())));
  142. gf.setInIssues(Filters.getIsValues(activityRequest.getStandardFilters().get(StandardStreamsFilterOption.ISSUE_KEY.getKey())));
  143. gf.setNotInIssues(Filters.getNotValues(activityRequest.getStandardFilters().get(StandardStreamsFilterOption.ISSUE_KEY.getKey())));
  144. log.debug("GlobalFilter: " + gf);
  145. return new CancellableTask<StreamsFeed>()
  146. {
  147. @Override
  148. public StreamsFeed call() throws Exception
  149. {
  150. Iterable<Changeset> changesetEntries = globalRepositoryManager.getLatestChangesets(activityRequest.getMaxResults(), gf);
  151. log.debug("Found changeset entries: " + changesetEntries);
  152. Iterable<StreamsEntry> streamEntries = transformEntries(changesetEntries);
  153. return new StreamsFeed(i18nResolver.getText("streams.external.feed.title"), streamEntries, Option.<String>none());
  154. }
  155. @Override
  156. public Result cancel()
  157. {
  158. // TODO Auto-generated method stub
  159. return null;
  160. }
  161. };
  162. }
  163. }