package org.docear.plugin.core;
import java.net.URL;
import java.sql.Date;
public class Version implements Comparable<Version> {
private final int id;
private final URL href;
private Date releaseDate;
private Integer buildNumber;
private String releaseNotes;
protected int[] versionNumber = new int[5];
public enum VersionField {
MAJOR (0), MIDDLE(1), MINOR(2), STATUS_NO(3), STATUS(4);
public final int index;
VersionField(int index) {
this.index = index;
}
}
public enum CompareCode {
LOWER(-1), EQUALS(0), DEVEL(1), BETA(2), RC(2), MINOR(3), MIDDLE(4), MAJOR(5);
public final int code;
CompareCode(int code) {
this.code = code;
}
}
public enum StatusName {
devel(1), alpha(2), beta(3), rc(4), stable(5);
public final int code;
StatusName(int code) {
this.code = code;
}
}
public Version() {
this.id = -1;
this.href = null;
}
public Version(int id, URL href) {
this.id = id;
this.href = href;
}
public int getId() {
return id;
}
public URL getHref() {
return href;
}
public Date getReleaseDate() {
return releaseDate;
}
public void setReleaseDate(Date releaseDate) {
this.releaseDate = releaseDate;
}
public Integer getBuildNumber() {
return buildNumber;
}
public void setBuildNumber(Integer buildNumber) {
this.buildNumber = buildNumber;
}
public Integer getMajorVersion() {
return versionNumber[VersionField.MAJOR.index];
}
public void setMajorVersion(Integer majorVersion) {
versionNumber[VersionField.MAJOR.index] = majorVersion;
}
public Integer getMiddleVersion() {
return versionNumber[VersionField.MIDDLE.index];
}
public void setMiddleVersion(Integer middleVersion) {
versionNumber[VersionField.MIDDLE.index] = middleVersion;
}
public Integer getMinorVersion() {
return versionNumber[VersionField.MINOR.index];
}
public void setMinorVersion(Integer minorVersion) {
this.versionNumber[VersionField.MINOR.index] = minorVersion;
}
public String getStatus() {
for(StatusName status : StatusName.values()) {
if(status.code == versionNumber[VersionField.STATUS.index]) {
return status.name();
}
}
return null;
}
public void setStatus(String status) {
versionNumber[VersionField.STATUS.index] = StatusName.valueOf(status).code;
}
public Integer getStatusNumber() {
return versionNumber[VersionField.STATUS_NO.index];
}
public void setStatusNumber(Integer statusNumber) {
this.versionNumber[VersionField.STATUS_NO.index] = statusNumber;
}
public String getReleaseNotes() {
return releaseNotes;
}
public void setReleaseNotes(String releaseNotes) {
this.releaseNotes = releaseNotes;
}
protected long getComputableVersionNumber() {
long result = 0;
for (int field : versionNumber) {
result = result*1000 + field;
}
return result;
}
public int compareTo(Version o) {
// this.setStatus("devel");
// this.setStatusNumber(4);
// o.setStatus("beta");
// o.setBuildNumber(82);
long me = this.getComputableVersionNumber();
long other = o.getComputableVersionNumber();
if (me < other) {
return CompareCode.LOWER.code;
}
else if (me == other) {
if (this.getBuildNumber() < o.getBuildNumber()) {
return CompareCode.LOWER.code;
}
else if (this.getBuildNumber() == o.getBuildNumber()) {
return CompareCode.EQUALS.code;
}
else {
return getCompareCode();
}
}
//ME > OTHER
int index = 0;
for (int i=VersionField.STATUS.index; i>=VersionField.MAJOR.index; i--) {
if((other%1000) < versionNumber[i]) {
index = i;
}
other /= 1000;
}
if (index == VersionField.STATUS_NO.index) {
return getCompareCode();
}
else if (index == VersionField.STATUS.index) {
return getCompareCode();
}
else if (index == VersionField.MINOR.index) {
return CompareCode.MINOR.code;
}
else if (index == VersionField.MIDDLE.index) {
return CompareCode.MIDDLE.code;
}
return CompareCode.MAJOR.code;
}
private int getCompareCode() {
if(StatusName.valueOf(getStatus()).code < StatusName.beta.code) {
return CompareCode.DEVEL.code;
}
else if(StatusName.valueOf(getStatus()).code <= StatusName.rc.code) {
return CompareCode.BETA.code;
}
else {
return CompareCode.MINOR.code;
}
}
public String toString() {
String versionString = ""+getMajorVersion()+"."+getMiddleVersion()+"."+getMinorVersion();
Integer statusNumber = getStatusNumber();
if (statusNumber != null && statusNumber > 0) {
versionString += "."+statusNumber;
}
String status = getStatus();
if (status != null && status.length()>0) {
versionString += " "+status;
}
versionString += " build";
Integer buildNumber = getBuildNumber();
if (buildNumber != null && buildNumber>0) {
versionString += buildNumber;
}
return versionString;
}
}