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); }
/** * Return information about first part of version that is different. */ public VersionDifference difference(String version1, String version2) { SuffixedVersion v1 = versionParser.parse(version1); SuffixedVersion v2 = versionParser.parse(version2); if (v1.getMajor() != v2.getMajor()) { return VersionDifference.MAJOR; } if (v1.getMinor() != v2.getMinor()) { return VersionDifference.MINOR; } if (v1.getMicro() != v2.getMicro()) { return VersionDifference.MICRO; } if (!v1.getQualifier().equals(v2.getQualifier())) { return VersionDifference.QUALIFIER; } if (!v1.getSuffix().equals(v2.getSuffix())) { return VersionDifference.SUFFIX; } if (!v1.getSuffixVersion().equals(v2.getSuffixVersion())) { return VersionDifference.RH_SUFFIX; } return VersionDifference.EQUAL; }