public PowerShellInfo selectTool()

in powershell-agent/src/main/java/jetbrains/buildServer/powershell/agent/PowerShellInfoProvider.java [165:227]


  public PowerShellInfo selectTool(@Nullable final PowerShellBitness bit,
                                   @Nullable final String version,
                                   @Nullable final PowerShellEdition edition) {
    // filter by edition
    List<PowerShellInfo> availableShells = new ArrayList<>(myHolder.getShells().values());
    if (edition != null) {
      availableShells = CollectionsUtil.filterCollection(availableShells, data -> edition.equals(data.getEdition()));
    }
    // filter by version
    if (version != null) {
      availableShells = CollectionsUtil.filterCollection(availableShells, data -> VersionComparatorUtil.compare(data.getVersion(), version) >= 0);
    }
    // filter by bitness
    if (bit != null) {
      availableShells = CollectionsUtil.filterCollection(availableShells, data -> data.getBitness().equals(bit));
    }
    if (availableShells.isEmpty()) {
      return null;
    }
    if (availableShells.size() == 1) {
      return availableShells.get(0);
    }
    // prefer desktop over core
    if (edition == null) {
      Map<PowerShellEdition, List<PowerShellInfo>> byEdition = new HashMap<>();
      for (PowerShellInfo info : availableShells) {
        if (!byEdition.containsKey(info.getEdition())) {
          byEdition.put(info.getEdition(), new ArrayList<>());
        }
        byEdition.get(info.getEdition()).add(info);
      }
      if (byEdition.get(PowerShellEdition.DESKTOP) != null) {
        availableShells = byEdition.get(PowerShellEdition.DESKTOP);
      } else {
        availableShells = byEdition.get(PowerShellEdition.CORE);
      }
    }
    if (availableShells.size() == 1) {
      return availableShells.get(0);
    }
    // prefer 64bit over 32bit
    if (bit == null) {
      Map<PowerShellBitness, List<PowerShellInfo>> byBits = new HashMap<>();
      for (PowerShellInfo info : availableShells) {
        if (!byBits.containsKey(info.getBitness())) {
          byBits.put(info.getBitness(), new ArrayList<>());
        }
        byBits.get(info.getBitness()).add(info);
      }
      if (byBits.containsKey(PowerShellBitness.x64)) {
        availableShells = byBits.get(PowerShellBitness.x64);
      } else {
        availableShells = byBits.get(PowerShellBitness.x86);
      }
    }
    if (availableShells.isEmpty()) {
      return null;
    }
    if (availableShells.size() == 1) {
      return availableShells.get(0);
    }
    return Collections.max(availableShells, (info1, info2) -> VersionComparatorUtil.compare(info1.getVersion(), info2.getVersion()));
  }