package japicmp.versioning;
import com.google.common.base.Optional;
import japicmp.exception.JApiCmpException;
import java.util.ArrayList;
import java.util.List;
public class VersionChange {
private final List<SemanticVersion> oldVersions;
private final List<SemanticVersion> newVersions;
private final boolean ignoreMissingOldVersion;
private final boolean ignoreMissingNewVersion;
public VersionChange(List<SemanticVersion> oldVersions, List<SemanticVersion> newVersions, boolean ignoreMissingOldVersion,
boolean ignoreMissingNewVersion) {
this.oldVersions = oldVersions;
this.newVersions = newVersions;
this.ignoreMissingOldVersion = ignoreMissingOldVersion;
this.ignoreMissingNewVersion = ignoreMissingNewVersion;
}
public Optional<SemanticVersion.ChangeType> computeChangeType() throws JApiCmpException {
if (this.oldVersions.isEmpty()) {
if (ignoreMissingOldVersion) {
throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, "Could not extract semantic version for at least one old version. Please " +
"follow the rules for semantic versioning.");
} else {
return Optional.absent();
}
}
if (this.newVersions.isEmpty()) {
if (ignoreMissingNewVersion) {
throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, "Could not extract semantic version for at least one new version. Please " +
"follow the rules for semantic versioning.");
} else {
return Optional.absent();
}
}
if (allVersionsTheSame(oldVersions) && allVersionsTheSame(newVersions)) {
SemanticVersion oldVersion = oldVersions.get(0);
SemanticVersion newVersion = newVersions.get(0);
return oldVersion.computeChangeType(newVersion);
} else {
if (oldVersions.size() != newVersions.size()) {
throw new JApiCmpException(JApiCmpException.Reason.IllegalArgument, "Cannot compare versions because the number of old versions is different than the number of new versions.");
} else {
List<SemanticVersion.ChangeType> changeTypes = new ArrayList<>();
for (int i=0; i<oldVersions.size(); i++) {
SemanticVersion oldVersion = oldVersions.get(i);
SemanticVersion newVersion = newVersions.get(i);
Optional<SemanticVersion.ChangeType> changeTypeOptional = oldVersion.computeChangeType(newVersion);
if (changeTypeOptional.isPresent()) {
changeTypes.add(changeTypeOptional.get());
}
}
SemanticVersion.ChangeType maxRank = SemanticVersion.ChangeType.UNCHANGED;
for (SemanticVersion.ChangeType changeType : changeTypes) {
if (changeType.getRank() > maxRank.getRank()) {
maxRank = changeType;
}
}
return Optional.fromNullable(maxRank);
}
}
}
public boolean isAllMajorVersionsZero() {
boolean allMajorVersionsZero = true;
for (SemanticVersion semanticVersion : newVersions) {
int major = semanticVersion.getMajor();
if (major > 0) {
allMajorVersionsZero = false;
break;
}
}
return allMajorVersionsZero;
}
private boolean allVersionsTheSame(List<SemanticVersion> versions) {
boolean allVersionsTheSame = true;
if (versions.size() > 1) {
SemanticVersion firstVersion = versions.get(0);
for (int i = 1; i < versions.size(); i++) {
SemanticVersion version = versions.get(i);
if (!firstVersion.equals(version)) {
allVersionsTheSame = false;
break;
}
}
}
return allVersionsTheSame;
}
}