PageRenderTime 31ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/jira-project/jira-components/jira-core/src/main/java/com/atlassian/jira/upgrade/UpgradeVersionHistoryManagerImpl.java

https://bitbucket.org/ahmed_bilal_360factors/jira7-core
Java | 141 lines | 120 code | 20 blank | 1 comment | 14 complexity | cac5bf77ff9004f767c2993e007659f8 MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.jira.upgrade;
  2. import com.atlassian.jira.database.QueryDslAccessor;
  3. import com.atlassian.jira.model.querydsl.UpgradeVersionHistoryDTO;
  4. import com.google.common.collect.Lists;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import javax.annotation.Nonnull;
  8. import java.sql.Timestamp;
  9. import java.util.Collections;
  10. import java.util.List;
  11. import java.util.Objects;
  12. import java.util.Optional;
  13. import java.util.regex.Matcher;
  14. import java.util.regex.Pattern;
  15. import static com.atlassian.jira.model.querydsl.QUpgradeHistory.UPGRADE_HISTORY;
  16. import static com.atlassian.jira.model.querydsl.QUpgradeVersionHistory.UPGRADE_VERSION_HISTORY;
  17. public class UpgradeVersionHistoryManagerImpl implements UpgradeVersionHistoryManager {
  18. private static final Logger log = LoggerFactory.getLogger(UpgradeVersionHistoryManagerImpl.class);
  19. private static final Pattern BUILD_NUMBER_PATTERN = Pattern.compile("\\d+$");
  20. private final BuildVersionRegistry buildVersionRegistry;
  21. private final QueryDslAccessor queryDslAccessor;
  22. @SuppressWarnings("WeakerAccess")
  23. public UpgradeVersionHistoryManagerImpl(
  24. final BuildVersionRegistry buildVersionRegistry,
  25. final QueryDslAccessor queryDslAccessor
  26. ) {
  27. this.buildVersionRegistry = buildVersionRegistry;
  28. this.queryDslAccessor = queryDslAccessor;
  29. }
  30. @Override
  31. public List<UpgradeVersionHistoryItem> getAllUpgradeVersionHistory() {
  32. final List<UpgradeVersionHistoryItem> upgradeHistory = Lists.newArrayList();
  33. String previousVersion = null;
  34. String previousBuildNumber = null;
  35. final Optional<UpgradeVersionHistoryItem> latestUpgradeTaskWithNoBuildNumber = getLatestUpgradeTaskWithNoBuildNumber();
  36. if (latestUpgradeTaskWithNoBuildNumber.isPresent()) {
  37. upgradeHistory.add(latestUpgradeTaskWithNoBuildNumber.get());
  38. previousVersion = latestUpgradeTaskWithNoBuildNumber.get().getTargetVersion();
  39. previousBuildNumber = latestUpgradeTaskWithNoBuildNumber.get().getTargetBuildNumber();
  40. }
  41. final List<UpgradeVersionHistoryDTO> versionHistory = queryDslAccessor.executeQuery(connection -> connection.newSqlQuery()
  42. .select(UPGRADE_VERSION_HISTORY)
  43. .from(UPGRADE_VERSION_HISTORY)
  44. .orderBy(UPGRADE_VERSION_HISTORY.timeperformed.asc())
  45. .fetch());
  46. for (UpgradeVersionHistoryDTO upgradeVersionHistory : versionHistory) {
  47. upgradeHistory.add(
  48. new UpgradeVersionHistoryItemImpl(
  49. upgradeVersionHistory.getTimeperformed(),
  50. upgradeVersionHistory.getTargetbuild(),
  51. upgradeVersionHistory.getTargetversion(),
  52. previousBuildNumber,
  53. previousVersion
  54. )
  55. );
  56. previousVersion = upgradeVersionHistory.getTargetversion();
  57. previousBuildNumber = upgradeVersionHistory.getTargetbuild();
  58. }
  59. Collections.sort(upgradeHistory, (o1, o2) -> {
  60. if (o1.getTimePerformed() != null && o2.getTimePerformed() != null) {
  61. return o2.getTimePerformed().compareTo(o1.getTimePerformed());
  62. } else if (o1.getTimePerformed() == null) {
  63. return 1;
  64. } else {
  65. return -1;
  66. }
  67. });
  68. return upgradeHistory;
  69. }
  70. @Override
  71. public void addUpgradeVersionHistory(final int buildNumber, final String version) {
  72. queryDslAccessor.execute(connection -> {
  73. final boolean alreadyContainsBuild = (connection.newSqlQuery()
  74. .select(UPGRADE_VERSION_HISTORY)
  75. .from(UPGRADE_VERSION_HISTORY)
  76. .where(UPGRADE_VERSION_HISTORY.targetbuild.eq(String.valueOf(buildNumber)))
  77. .fetchCount() > 0);
  78. if (alreadyContainsBuild) {
  79. log.debug("A record already exists for build number '{}' - skipping creation.", buildNumber);
  80. return;
  81. }
  82. final Timestamp timePerformed = new Timestamp(System.currentTimeMillis());
  83. connection
  84. .insert(UPGRADE_VERSION_HISTORY)
  85. .set(UPGRADE_VERSION_HISTORY.timeperformed, timePerformed)
  86. .set(UPGRADE_VERSION_HISTORY.targetversion, version)
  87. .set(UPGRADE_VERSION_HISTORY.targetbuild, String.valueOf(buildNumber))
  88. .executeWithId();
  89. });
  90. }
  91. private Optional<UpgradeVersionHistoryItem> getLatestUpgradeTaskWithNoBuildNumber() {
  92. final Optional<Integer> latestUpgradeTaskWithNoTargetBuild = queryDslAccessor.executeQuery(connection -> connection.newSqlQuery()
  93. .select(UPGRADE_HISTORY.upgradeclass)
  94. .from(UPGRADE_HISTORY)
  95. .where(UPGRADE_HISTORY.targetbuild.isEmpty().or(UPGRADE_HISTORY.targetbuild.isNull()))
  96. .fetch()
  97. .stream()
  98. .map(this::extractBuildNumberFromUpgradeClass)
  99. .filter(Objects::nonNull)
  100. .max(Integer::compare));
  101. if (latestUpgradeTaskWithNoTargetBuild.isPresent()) {
  102. final Integer buildNumber = latestUpgradeTaskWithNoTargetBuild.get();
  103. final BuildVersionRegistry.BuildVersion targetVersion = buildVersionRegistry.getVersionForBuildNumber(
  104. buildNumber);
  105. return Optional.of(new UpgradeVersionHistoryItemImpl(null,
  106. Integer.toString(targetVersion.getBuildNumberAsInteger()), targetVersion.getVersion(),
  107. Integer.toString(buildNumber), null, true
  108. ));
  109. } else {
  110. return Optional.empty();
  111. }
  112. }
  113. private Integer extractBuildNumberFromUpgradeClass(@Nonnull final String upgradeClassName) {
  114. final Matcher matcher = BUILD_NUMBER_PATTERN.matcher(upgradeClassName);
  115. if (matcher.find()) {
  116. // Pattern validates that it will parse
  117. return Integer.valueOf(matcher.group(0));
  118. }
  119. return null;
  120. }
  121. }