PageRenderTime 50ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/src/main/java/com/atlassian/jira/plugins/bitbucket/spi/DefaultSynchronisationOperation.java

https://bitbucket.org/atlassian/jira-bitbucket-connector/
Java | 95 lines | 77 code | 16 blank | 2 comment | 6 complexity | 9af0bbaba332e29fab665ac624ddcdc7 MD5 | raw file
  1. package com.atlassian.jira.plugins.bitbucket.spi;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. import java.util.regex.Matcher;
  5. import java.util.regex.Pattern;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8. import com.atlassian.jira.plugins.bitbucket.DefaultSynchronizer;
  9. import com.atlassian.jira.plugins.bitbucket.api.Changeset;
  10. import com.atlassian.jira.plugins.bitbucket.api.ProgressWriter;
  11. import com.atlassian.jira.plugins.bitbucket.api.SourceControlException;
  12. import com.atlassian.jira.plugins.bitbucket.api.SynchronizationKey;
  13. public class DefaultSynchronisationOperation implements SynchronisationOperation
  14. {
  15. private static final Logger log = LoggerFactory.getLogger(DefaultSynchronizer.class);
  16. protected final SynchronizationKey key;
  17. protected final RepositoryManager repositoryManager;
  18. private final ProgressWriter progressProvider;
  19. private final Communicator communicator;
  20. public DefaultSynchronisationOperation(SynchronizationKey key, RepositoryManager repositoryManager,
  21. Communicator communicator, ProgressWriter progressProvider)
  22. {
  23. this.key = key;
  24. this.repositoryManager = repositoryManager;
  25. this.communicator = communicator;
  26. this.progressProvider = progressProvider;
  27. }
  28. @Override
  29. public void synchronise()
  30. {
  31. Iterable<Changeset> changesets = getChangsetsIterator();
  32. int changesetCount = 0;
  33. int jiraCount = 0;
  34. for (Changeset changeset : changesets)
  35. {
  36. changesetCount ++;
  37. String message = changeset.getMessage();
  38. log.debug("syncing changeset [{}] [{}]", changeset.getNode(), changeset.getMessage());
  39. if (message.contains(key.getRepository().getProjectKey()))
  40. {
  41. Set<String> extractedIssues = extractProjectKey(key.getRepository().getProjectKey(), message);
  42. for (String extractedIssue : extractedIssues)
  43. {
  44. jiraCount ++;
  45. String issueId = extractedIssue.toUpperCase();
  46. try
  47. {
  48. repositoryManager.addChangeset(key.getRepository(), issueId, changeset);
  49. } catch (SourceControlException e)
  50. {
  51. log.error("Error adding changeset " + changeset, e);
  52. }
  53. }
  54. }
  55. progressProvider.inProgress(changesetCount, jiraCount);
  56. }
  57. }
  58. private static Set<String> extractProjectKey(String projectKey, String message)
  59. {
  60. // should check that issue exists?
  61. Pattern projectKeyPattern = Pattern.compile("(" + projectKey + "-\\d+)", Pattern.CASE_INSENSITIVE);
  62. Matcher match = projectKeyPattern.matcher(message);
  63. Set<String> matches = new HashSet<String>();
  64. while (match.find())
  65. {
  66. // Get all groups for this match
  67. for (int i = 0; i <= match.groupCount(); i++)
  68. matches.add(match.group(i));
  69. }
  70. return matches;
  71. }
  72. public Iterable<Changeset> getChangsetsIterator()
  73. {
  74. log.debug("synchronize [ {} ] with [ {} ]", key.getRepository().getProjectKey(),
  75. key.getRepository().getRepositoryUri().getRepositoryUrl());
  76. Iterable<Changeset> changesets = key.getChangesets() == null ? communicator.getChangesets(key.getRepository()) : key.getChangesets();
  77. return changesets;
  78. }
  79. }