/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.pepsoft.util;
import java.io.Serializable;
import java.util.Arrays;
import java.util.StringJoiner;
import java.util.stream.Collectors;
/**
*
* @author pepijn
*/
public class Version implements Comparable<Version>, Serializable {
public Version(int... parts) {
this.parts = parts;
for (int part: parts) {
if (part < 0) {
throw new IllegalArgumentException("Negative numbers not allowed");
}
}
}
public int[] getParts() {
return Arrays.copyOf(parts, parts.length);
}
@Override
public int compareTo(Version o) {
for (int i = 0; i < Math.max(parts.length, o.parts.length); i++) {
if (i < parts.length) {
if (i < o.parts.length) {
// Part present in both
if (parts[i] < o.parts[i]) {
return -1;
} else if (parts[i] > o.parts[i]) {
return 1;
}
// Parts are the same, continue to next part (if any)
} else {
// Part only present in us; assume other part is 0
if (parts[i] > 0) {
return 1;
}
// Parts are the same, continue to next part (if any)
}
} else {
// Part only present in other; assume our part is 0
if (o.parts[i] > 0) {
return -1;
}
// Parts are the same, continue to next part (if any)
}
}
return 0;
}
/**
* Create a new <code>Version</code> from a string of the form
* <code>x.y.z</code> (with any number of parts).
*
* @param str The string to parse.
* @return The resulting Version object.
* @throws NumberFormatException If there are non-numeric characters in the
* string.
*/
public static Version parse(String str) {
String[] partStrs = str.split("\\.");
int[] parts = new int[partStrs.length];
for (int i = 0; i < partStrs.length; i++) {
parts[i] = Integer.parseInt(partStrs[i]);
}
return new Version(parts);
}
@Override
public int hashCode() {
int hash = 7;
hash = 41 * hash + Arrays.hashCode(this.parts);
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Version other = (Version) obj;
if (!Arrays.equals(this.parts, other.parts)) {
return false;
}
return true;
}
@Override
public String toString() {
return Arrays.stream(parts).mapToObj(Integer::toString).collect(Collectors.joining("."));
}
private final int[] parts;
private static final long serialVersionUID = 1L;
}