/betterrev/app/update/pullrequest/PullRequestImporter.java

https://bitbucket.org/neomatrix369/betterrev · Java · 152 lines · 121 code · 28 blank · 3 comment · 10 complexity · 58f6af189e1097099e218b44764026a9 MD5 · raw file

  1. package update.pullrequest;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import models.Contribution;
  6. import models.ContributionEvent;
  7. import models.ContributionEventType;
  8. import models.State;
  9. import models.User;
  10. import com.fasterxml.jackson.databind.JsonNode;
  11. import org.joda.time.DateTime;
  12. import play.Logger;
  13. import update.BetterrevActor;
  14. /**
  15. * This Class is responsible for importing BitBucket pullrequests into the Betterrev application.
  16. */
  17. public final class PullRequestImporter extends BetterrevActor {
  18. @Override
  19. public void onReceive(Object message) throws Exception {
  20. if (message instanceof ImportPullRequestsEvent) {
  21. Logger.debug("ImportPullRequestsEvent received.");
  22. ImportPullRequestsEvent importRequest = (ImportPullRequestsEvent) message;
  23. List<Contribution> contributions = convertJsonIntoContributions(importRequest.getJsonNode(), importRequest.getProject());
  24. eventStream().publish(new PullRequestsImportedEvent(contributions));
  25. }
  26. }
  27. public List<Contribution> convertJsonIntoContributions(JsonNode response, String repositoryId) {
  28. JsonNode values = response.get("values");
  29. Iterator<JsonNode> elements = values.iterator();
  30. List<Contribution> contributions = new ArrayList<>();
  31. while (elements.hasNext()) {
  32. Contribution contribution = convertJsonNodeIntoContribution(elements.next(), repositoryId);
  33. contributions.add(contribution);
  34. }
  35. return contributions;
  36. }
  37. private Contribution convertJsonNodeIntoContribution(JsonNode requestNode, String repositoryId) {
  38. String requestId = requestNode.get("id").asText();
  39. Contribution contribution = Contribution.findByBitbucketIds(repositoryId, requestId);
  40. DateTime updatedOn = getDateTime(requestNode, "updated_on");
  41. if (contribution == null) {
  42. return createContribution(requestNode, repositoryId, requestId, updatedOn);
  43. } else {
  44. ensureContributionUpdated(requestNode, updatedOn, contribution);
  45. return contribution;
  46. }
  47. }
  48. private static Contribution ensureContributionUpdated(JsonNode requestNode, DateTime updatedOn, Contribution contribution) {
  49. if (!contribution.wasUpdatedBefore(updatedOn)) {
  50. return contribution;
  51. }
  52. contribution.updatedOn = updatedOn;
  53. contribution.name = getTitle(requestNode);
  54. contribution.description = getDescription(requestNode);
  55. String linkToExternalInfo = getLinkToExternalInfo(requestNode);
  56. return updateContribution(contribution, linkToExternalInfo);
  57. }
  58. private static Contribution updateContribution(Contribution contribution, String linkToExternalInfo) {
  59. if (contribution.state != State.OPEN) {
  60. throw new IllegalStateException("Cannot transition from current State of " + contribution.state);
  61. }
  62. contribution.contributionEvents.add(
  63. new ContributionEvent(ContributionEventType.CONTRIBUTION_MODIFIED, linkToExternalInfo));
  64. contribution.state = State.OPEN;
  65. contribution.update();
  66. return contribution;
  67. }
  68. private Contribution createContribution(JsonNode requestNode, String repositoryId, String requestId, DateTime updatedOn) {
  69. JsonNode userNode = requestNode.get("author");
  70. String bitbucketUserName = userNode.get("username").asText();
  71. String displayName = userNode.get("display_name").asText();
  72. User user = User.findOrCreate(bitbucketUserName, displayName);
  73. DateTime createdOn = getDateTime(requestNode, "created_on");
  74. String branchName = getBranchNameFrom(requestNode);
  75. Contribution contribution = new Contribution(repositoryId,
  76. requestId,
  77. getTitle(requestNode),
  78. getDescription(requestNode),
  79. user,
  80. createdOn,
  81. updatedOn,
  82. branchName);
  83. contribution.save();
  84. Logger.debug(String.format("Created new Contribution - id: %s, bitbucket username: %s", requestId, user.bitbucketUserName));
  85. publishContributionGeneratedEvent(contribution, "");
  86. return contribution;
  87. }
  88. private static String getBranchNameFrom(JsonNode requestNode) {
  89. return requestNode.get("destination")
  90. .get("branch")
  91. .get("name")
  92. .asText();
  93. }
  94. private void publishContributionGeneratedEvent(Contribution contribution, String linkToExternalInfo) {
  95. if (contribution.state != State.NULL) {
  96. throw new IllegalStateException("Cannot transition from current State of " + contribution.state);
  97. }
  98. ContributionEvent contributionGeneratedEvent = new ContributionEvent(
  99. ContributionEventType.CONTRIBUTION_GENERATED, linkToExternalInfo
  100. );
  101. contribution.contributionEvents.add(contributionGeneratedEvent);
  102. contribution.state = State.OPEN;
  103. contribution.update();
  104. eventStream().publish(contributionGeneratedEvent);
  105. }
  106. private static DateTime getDateTime(JsonNode requestNode, String field) {
  107. String dateString = requestNode.get(field)
  108. .asText()
  109. .replace(' ', 'T');
  110. return DateTime.parse(dateString);
  111. }
  112. private static String getDescription(JsonNode requestNode) {
  113. return requestNode.get("description").asText();
  114. }
  115. private static String getTitle(JsonNode requestNode) {
  116. return requestNode.get("title").asText();
  117. }
  118. private static String getLinkToExternalInfo(JsonNode requestNode) {
  119. return requestNode.get("links")
  120. .get("self")
  121. .get("href")
  122. .asText();
  123. }
  124. }