private CompletableFuture<VersionAnalysisResult> analyzeVersions(VersionParser versionParser, String version, CompletableFuture<Set<ProductArtifacts>> availableArtifacts) { VersionAnalyzer va = new VersionAnalyzer(versionParser); return availableArtifacts.thenApply(pas-> { List<String> versions = pas.stream() .flatMap(as -> as.getArtifacts().stream()) .map(a -> a.getGav().getVersion()) .collect(Collectors.toList()); return va.analyseVersions(version, versions); }); }
public VersionAnalysisResult analyseVersions(String querry, Collection<String> versions){ VersionComparator comparator = new VersionComparator(querry, versionParser); List<String> sortedVersions = new ArrayList<>(); List<SuffixedVersion> parsedVersions = versions.stream() .sorted(comparator) .distinct() .peek(v -> sortedVersions.add(v)) .map(versionParser::parse) .collect(Collectors.toList()); SuffixedVersion version = versionParser.parse(querry); Optional<String> bmv = findBiggestMatchingVersion(version, parsedVersions); return new VersionAnalysisResult(bmv, sortedVersions); }
private Optional<String> findBiggestMatchingVersion(SuffixedVersion queryVersion, Collection<SuffixedVersion> versions) { String bestMatchVersion = null; int biggestBuildNumber = 0; String unsuffixedVesion = queryVersion.unsuffixedVesion(); List<SuffixedVersion> candidateVersions = versions.stream() .filter(SuffixedVersion::isSuffixed) .filter(v-> unsuffixedVesion.equals(v.unsuffixedVesion())) .collect(Collectors.toList()); boolean onlyDefaultSuffixPresent = candidateVersions.stream() .map(v -> v.getSuffix().get()) .allMatch(VersionAnalyzer::isDefaultSuffix); List<SuffixedVersion> versionsToSearch = candidateVersions.stream() .filter(v -> onlyDefaultSuffixPresent || !isDefaultSuffix(v.getSuffix().get())) .collect(Collectors.toList()); for (SuffixedVersion ver : versionsToSearch) { int foundBuildNumber = ver.getSuffixVersion().get(); if (bestMatchVersion == null || foundBuildNumber > biggestBuildNumber) { bestMatchVersion = ver.getOriginalVersion(); biggestBuildNumber = foundBuildNumber; } else if (foundBuildNumber == biggestBuildNumber) { bestMatchVersion = getMoreSpecificVersion(bestMatchVersion, ver.getOriginalVersion()); } } return Optional.ofNullable(bestMatchVersion); }