AprVersionStrategy.java
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.basepom.mojo.dvc.strategy;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Comparator;
import javax.inject.Named;
import javax.inject.Singleton;
import com.google.common.base.Strings;
import org.apache.maven.artifact.versioning.ArtifactVersion;
import org.apache.maven.artifact.versioning.ComparableVersion;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
/**
* Implements Apache versioning strategy for two or three digits. It expects versions formatted as x.y, x.y.z. Versions can have an additional qualifier.
* <p>
* Version A (xa.ya.za) can replace Version B (xb.yb.zb) if xa == xb and xa >= xb. component z is always compatible.
* <p>
* If an additional qualifier exists, the qualifiers must match.
*/
@Named("apr")
@Singleton
public class AprVersionStrategy
implements Strategy {
private final Comparator<ArtifactVersion> comparator = Comparator
.comparing(ArtifactVersion::getMajorVersion, this::checkMajorCompatible)
.thenComparing(ArtifactVersion::getMinorVersion, this::checkMinorCompatible)
.thenComparing(ArtifactVersion::getIncrementalVersion, this::checkPatchCompatible)
.thenComparing(ArtifactVersion::getQualifier, (a, e) -> checkQualifierCompatible(Strings.nullToEmpty(a), Strings.nullToEmpty(e)));
@Override
public String getName() {
return "apr";
}
@Override
public final boolean isCompatible(final ComparableVersion expectedVersion, final ComparableVersion resolvedVersion) {
final ArtifactVersion aprExpectedVersion = new DefaultArtifactVersion(checkNotNull(expectedVersion, "expectedVersion is null").getCanonical());
final ArtifactVersion aprResolvedVersion = new DefaultArtifactVersion(checkNotNull(resolvedVersion, "resolvedVersion is null").getCanonical());
// Expected version must be before or equal the resolved version.
//
// for each method:
//
// -1 means incompatible.
// 0 means more testing.
// 1 means compatible.
//
return comparator.compare(aprExpectedVersion, aprResolvedVersion) >= 0; // more testing or compatible wins here.
}
protected int checkMajorCompatible(int expectedMajor, int resolvedMajor) {
if (expectedMajor != resolvedMajor) {
return -1; // incompatible if majors differ.
}
return 0; // otherwise more testing.
}
protected int checkMinorCompatible(int expectedMinor, int resolvedMinor) {
if (resolvedMinor < expectedMinor) {
return -1; // smaller version is not forward compatible
}
return 0; // otherwise more testing.
}
protected int checkPatchCompatible(int expectedPatch, int resolvedPatch) {
return 0; // all patches are compatible, check the qualifiers
}
protected int checkQualifierCompatible(String expectedQualifier, String resolvedQualifier) {
if (!expectedQualifier.equals(resolvedQualifier)) {
return -1; // if qualifiers don't match, things are not compatible (this makes things like 1.2.3-android and 1.2.3-jre not compatible!
}
return 0;
}
}