PageRenderTime 44ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/src/main/java/com/atlassian/bamboo/plugin/dotnet/msbuild/MsBuildCapabilityDefaultsHelper.java

https://bitbucket.org/atlassian/bamboo-dotnet-plugin/
Java | 150 lines | 127 code | 22 blank | 1 comment | 9 complexity | 4b314a5eaea41938e8c919369c4b9465 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. package com.atlassian.bamboo.plugin.dotnet.msbuild;
  2. import com.atlassian.bamboo.v2.build.agent.capability.Capability;
  3. import com.atlassian.bamboo.v2.build.agent.capability.CapabilityDefaultsHelper;
  4. import com.atlassian.bamboo.v2.build.agent.capability.CapabilityImpl;
  5. import com.atlassian.bamboo.v2.build.agent.capability.CapabilitySet;
  6. import org.apache.commons.lang3.SystemUtils;
  7. import org.apache.log4j.Logger;
  8. import org.jetbrains.annotations.NotNull;
  9. import java.io.File;
  10. import java.util.Arrays;
  11. import java.util.Optional;
  12. import java.util.regex.Pattern;
  13. import java.util.stream.Stream;
  14. public class MsBuildCapabilityDefaultsHelper implements CapabilityDefaultsHelper
  15. {
  16. private static final Logger log = Logger.getLogger(MsBuildCapabilityDefaultsHelper.class);
  17. private static final Pattern IS_VERSION_NUMBER = Pattern.compile("[0-9.]+");
  18. private enum DotNetFrameworkType
  19. {
  20. ARCH_32_BIT,
  21. ARCH_64_BIT
  22. }
  23. @Override
  24. @NotNull
  25. public CapabilitySet addDefaultCapabilities(@NotNull final CapabilitySet capabilitySet)
  26. {
  27. if (!SystemUtils.IS_OS_WINDOWS)
  28. {
  29. return capabilitySet;
  30. }
  31. addMsBuildPre12Capability(capabilitySet);
  32. addMsBuild12PlusCapabilities(capabilitySet);
  33. return capabilitySet;
  34. }
  35. //MsBuild versions 12+ are installed in a different location
  36. private void addMsBuild12PlusCapabilities(@NotNull final CapabilitySet capabilitySet)
  37. {
  38. final Optional<File> programFiles = WindowsSystemPaths.PROGRAM_FILES.get();
  39. programFiles.ifPresent(
  40. programFilesFolder ->
  41. {
  42. final File msBuildDirectory = new File(programFilesFolder, "MSBuild");
  43. processFrameworkDirForMsBuild12Plus(capabilitySet, msBuildDirectory);
  44. }
  45. );
  46. final Optional<File> programFilesX86 = WindowsSystemPaths.PROGRAM_FILES_X86.get();
  47. programFilesX86.ifPresent(
  48. programFilesX86Folder -> {
  49. if (!programFiles.isPresent() || !programFiles.get().getAbsoluteFile().equals(programFilesX86Folder.getAbsoluteFile()))
  50. {
  51. final File msBuildDirectory = new File(programFilesX86Folder, "MSBuild");
  52. processFrameworkDirForMsBuild12Plus(capabilitySet, msBuildDirectory);
  53. }
  54. }
  55. );
  56. }
  57. private static void addMsBuildPre12Capability(@NotNull final CapabilitySet capabilitySet)
  58. {
  59. WindowsSystemPaths.WINDOWS.get().ifPresent(
  60. windowsFolder -> {
  61. final File netFramework32 = new File(windowsFolder, "\\Microsoft.NET\\Framework");
  62. processFrameworkDirForMsBuildPre12(capabilitySet, netFramework32, DotNetFrameworkType.ARCH_32_BIT);
  63. final File netFramework64 = new File(windowsFolder, "\\Microsoft.NET\\Framework64");
  64. processFrameworkDirForMsBuildPre12(capabilitySet, netFramework64, DotNetFrameworkType.ARCH_64_BIT);
  65. }
  66. );
  67. }
  68. private static void processFrameworkDirForMsBuildPre12(@NotNull final CapabilitySet capabilitySet, @NotNull final File frameworkDirectory, @NotNull final DotNetFrameworkType dotNetFrameworkType)
  69. {
  70. subdirectoriesOf(frameworkDirectory)
  71. .filter(subDir -> subDir.getName().startsWith("v"))
  72. .forEach(subDir -> addMSBuildCapability(capabilitySet, subDir, dotNetFrameworkType));
  73. }
  74. private static void processFrameworkDirForMsBuild12Plus(@NotNull final CapabilitySet capabilitySet, final File frameworkDirectory)
  75. {
  76. subdirectoriesOf(frameworkDirectory)
  77. .filter(subDir -> IS_VERSION_NUMBER.matcher(subDir.getName()).matches())
  78. .forEach(subDir -> processFrameworkSubdirFileSince12(capabilitySet, subDir));
  79. }
  80. private static void processFrameworkSubdirFileSince12(@NotNull final CapabilitySet capabilitySet, final File subDirectory)
  81. {
  82. final String frameworkVersion = subDirectory.getName();
  83. final String friendlyVersion = frameworkVersion.length() >= 5 ? frameworkVersion.substring(0, 5) : frameworkVersion;
  84. final String labelPrefix = "MSBuild v" + friendlyVersion;
  85. final File msBuildPath32 = new File(subDirectory + "/bin", "MSBuild.exe");
  86. if (msBuildPath32.exists())
  87. {
  88. addMSBuilCapability(capabilitySet, msBuildPath32, labelPrefix + " (32bit)");
  89. }
  90. final File msBuildPath64 = new File(subDirectory + "/bin/amd64", "MSBuild.exe");
  91. if (msBuildPath64.exists())
  92. {
  93. addMSBuilCapability(capabilitySet, msBuildPath64, labelPrefix + " (64bit)");
  94. }
  95. }
  96. private static void addMSBuildCapability(@NotNull final CapabilitySet capabilitySet, @NotNull final File frameworkDirectory, @NotNull final DotNetFrameworkType dotNetFrameworkType)
  97. {
  98. final File msBuildPath = new File(frameworkDirectory, "MSBuild.exe");
  99. if (msBuildPath.exists())
  100. {
  101. final String frameworkVersion = frameworkDirectory.getName().substring(1);
  102. final String friendlyVersion = frameworkVersion.length() >= 3 ? frameworkVersion.substring(0, 3) : frameworkVersion;
  103. final String architecture = dotNetFrameworkType == DotNetFrameworkType.ARCH_64_BIT ? "64bit" : "32bit";
  104. final String label = "MSBuild v" + friendlyVersion + " (" + architecture + ')';
  105. addMSBuilCapability(capabilitySet, msBuildPath, label);
  106. }
  107. }
  108. private static void addMSBuilCapability(@NotNull final CapabilitySet capabilitySet, @NotNull final File msBuildPath, @NotNull final String label)
  109. {
  110. final Capability capability = new CapabilityImpl(MsBuildTaskType.MSBUILD_CAPABILITY_PREFIX + '.' + label, msBuildPath.getAbsolutePath());
  111. capabilitySet.addCapability(capability);
  112. }
  113. private static Stream<File> subdirectoriesOf(final File frameworkDirectory)
  114. {
  115. if (!frameworkDirectory.isDirectory())
  116. {
  117. log.warn("Framework directory " + frameworkDirectory + " is not a directory");
  118. return Stream.empty();
  119. }
  120. final File[] files = frameworkDirectory.listFiles();
  121. if (files==null)
  122. {
  123. log.warn("Framework directory " + frameworkDirectory + " could not be listed");
  124. return Stream.empty();
  125. }
  126. return Arrays.stream(files).filter(File::isDirectory);
  127. }
  128. }