ModelPackages.java
/**
* Copyright (c) 2018 European Organisation for Nuclear Research (CERN), All Rights Reserved.
*/
package org.jmad.modelpack.domain;
import java.util.Comparator;
import java.util.Objects;
import org.jmad.modelpack.util.VersionStrings;
/**
* Utility methods for jmad model packages
*
* @author kfuchsbe
*/
public final class ModelPackages {
private static final Comparator<Variant> LATEST_RELEASE_LAST_COMPARATOR = (Variant v1, Variant v2) -> {
if (Objects.equals(v1, v2)) {
return 0;
} else if (Objects.isNull(v1)) {
return -1;
} else if (Objects.isNull(v2)) {
return 1;
}
int variantTypeOrder = v1.type().ordinal() - v2.type().ordinal();
if (variantTypeOrder != 0) {
return variantTypeOrder;
}
if (isRelease(v1)) {
return VersionStrings.versionComparator().compare(v1.name(), v2.name());
} else {
return v1.name().compareToIgnoreCase(v2.name());
}
};
private static final Comparator<Variant> LATEST_FIRST_VARIANT_COMPARATOR = LATEST_RELEASE_LAST_COMPARATOR
.reversed();
private static final Comparator<ModelPackageVariant> PACKAGE_VARIANT_COMPARATOR = Comparator
.<ModelPackageVariant, String> comparing(ti -> ti.modelPackage().name())
.thenComparing(ModelPackageVariant::variant, LATEST_FIRST_VARIANT_COMPARATOR);
private ModelPackages() {
/* Only static methods */
}
public static Comparator<ModelPackageVariant> latestFirstPackageVariantComparator() {
return PACKAGE_VARIANT_COMPARATOR;
}
/**
* Provides a comparator for {@link Variant}s that sorts according the following:
* <ol>
* <li>{@code null} elements</li>
* <li>branches, internally sorted alphabetically by name, ignoring case</li>
* <li>tags, internally sorted alphabetically by name, ignoring case</li>
* <li>releases sorted by version numbers, according to {@link VersionStrings#versionComparator()}</li>
* </ol>
*
* @return a comparator following the
*/
public static Comparator<Variant> latestLastVariantComparator() {
return LATEST_RELEASE_LAST_COMPARATOR;
}
private static boolean isRelease(Variant v1) {
return VariantType.RELEASE == v1.type();
}
}