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

/src/main/java/com/atlassian/jira/plugins/bitbucket/spi/github/impl/GithubChangesetIterator.java

https://bitbucket.org/atlassian/jira-bitbucket-connector/
Java | 146 lines | 118 code | 28 blank | 0 comment | 19 complexity | 12a712127a979221a80c05935ad2f3af MD5 | raw file
  1. package com.atlassian.jira.plugins.bitbucket.spi.github.impl;
  2. import com.atlassian.jira.plugins.bitbucket.api.Changeset;
  3. import com.atlassian.jira.plugins.bitbucket.api.SourceControlRepository;
  4. import java.util.Collections;
  5. import java.util.Iterator;
  6. import java.util.List;
  7. import java.util.ListIterator;
  8. import java.util.NoSuchElementException;
  9. public class GithubChangesetIterator implements Iterator<Changeset>
  10. {
  11. private ListIterator<Changeset> inPageChangesetsIterator = Collections.<Changeset>emptyList().listIterator();
  12. private PagesIterator pagesIterator;
  13. private BranchesIterator branchesIterator;
  14. public GithubChangesetIterator(GithubCommunicator githubCommunicator, SourceControlRepository repository, List<String> branches)
  15. {
  16. branchesIterator = new BranchesIterator(branches, githubCommunicator, repository);
  17. pagesIterator = branchesIterator.next();
  18. }
  19. public boolean hasNext()
  20. {
  21. return inPageChangesetsIterator.hasNext() || (pagesIterator != null && pagesIterator.hasNext()) || branchesIterator.hasNext() ;
  22. }
  23. public Changeset next()
  24. {
  25. if (inPageChangesetsIterator.hasNext())
  26. {
  27. return inPageChangesetsIterator.next();
  28. } else if (pagesIterator.hasNext())
  29. {
  30. inPageChangesetsIterator = pagesIterator.next();
  31. return next();
  32. } else if (branchesIterator.hasNext()) {
  33. pagesIterator = branchesIterator.next();
  34. return next();
  35. }
  36. throw new NoSuchElementException();
  37. }
  38. public void remove()
  39. {
  40. throw new UnsupportedOperationException();
  41. }
  42. }
  43. class PagesIterator implements Iterator<ListIterator<Changeset>>
  44. {
  45. private GithubCommunicator githubCommunicator;
  46. private SourceControlRepository repository;
  47. private int index = 0;
  48. private int currentPageNumber = 0; // github gives us pages indexed from 1 (zero is one before)
  49. private String branch;
  50. private List<Changeset> changesets;
  51. PagesIterator(String branch, GithubCommunicator githubCommunicator, SourceControlRepository repository)
  52. {
  53. this.branch = branch;
  54. this.githubCommunicator = githubCommunicator;
  55. this.repository = repository;
  56. }
  57. @Override
  58. public boolean hasNext()
  59. {
  60. if (index < currentPageNumber) {
  61. return containsChangesets();
  62. }
  63. currentPageNumber++;
  64. changesets = githubCommunicator.getChangesets(repository, branch, currentPageNumber);
  65. return containsChangesets();
  66. }
  67. private boolean containsChangesets() {
  68. return changesets != null && !changesets.isEmpty();
  69. }
  70. @Override
  71. public ListIterator<Changeset> next()
  72. {
  73. index++;
  74. if (index != currentPageNumber && !hasNext()) {
  75. throw new NoSuchElementException();
  76. }
  77. if (changesets != null && !changesets.isEmpty()) {
  78. return changesets.listIterator();
  79. }
  80. return Collections.<Changeset>emptyList().listIterator();
  81. }
  82. @Override
  83. public void remove()
  84. {
  85. throw new UnsupportedOperationException();
  86. }
  87. }
  88. class BranchesIterator implements Iterator<PagesIterator>
  89. {
  90. private ListIterator<String> branchNamesIterator = Collections.<String>emptyList().listIterator();
  91. private GithubCommunicator githubCommunicator;
  92. private SourceControlRepository repository;
  93. BranchesIterator(List<String> branches, GithubCommunicator githubCommunicator, SourceControlRepository repository)
  94. {
  95. this.githubCommunicator = githubCommunicator;
  96. this.repository = repository;
  97. this.branchNamesIterator = branches.listIterator();
  98. }
  99. @Override
  100. public boolean hasNext()
  101. {
  102. return branchNamesIterator.hasNext();
  103. }
  104. @Override
  105. public PagesIterator next()
  106. {
  107. if (!hasNext())
  108. {
  109. return null;
  110. }
  111. return new PagesIterator(branchNamesIterator.next(), githubCommunicator, repository);
  112. }
  113. @Override
  114. public void remove()
  115. {
  116. throw new UnsupportedOperationException();
  117. }
  118. }