/**
* Copyright 2012-2013 Maciej Jaworski, Mariusz Kapcia, Paweł Kędzia, Mateusz Kubuszok
*
* <p>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</p>
*
* <p>http://www.apache.org/licenses/LICENSE-2.0</p>
*
* <p>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.</p>
*/
package com.autoupdater.client.models;
import java.util.Comparator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Class representing version number of Package or Update.
*
* @see com.autoupdater.client.models.Package
* @see com.autoupdater.client.models.Update
*/
public class VersionNumber implements IModel<VersionNumber> {
public static final VersionNumber UNVERSIONED = new VersionNumber(0, 0, 0, 0);
private int major;
private int minor;
private int release;
private int nightly;
/**
* Creates new VersionNumber using String as reference.
*
* @param versionNumber
* String in format [major].[minor].[release].[nightly]
*/
public VersionNumber(String versionNumber) {
parseVersionNumber(versionNumber);
}
/**
* Creates new VersionNumber using respective numbers.
*
* @param major
* major version number
* @param minor
* minor version number
* @param release
* release version number
* @param nightly
* nightly version number
*/
public VersionNumber(int major, int minor, int release, int nightly) {
this.major = major;
this.minor = minor;
this.release = release;
this.nightly = nightly;
}
/**
* Gets major version number.
*
* @return major version number
*/
public int getMajor() {
return major;
}
/**
* Gets minor version number.
*
* @return minor version number
*/
public int getMinor() {
return minor;
}
/**
* Gets release version number.
*
* @return release version number
*/
public int getRelease() {
return release;
}
/**
* Gets nightly version number.
*
* @return nightly version number
*/
public int getNightly() {
return nightly;
}
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof VersionNumber))
return false;
else if (obj == this)
return true;
VersionNumber versionNumber = (VersionNumber) obj;
return this.major == versionNumber.major && this.minor == versionNumber.minor
&& this.release == versionNumber.release && this.nightly == versionNumber.nightly;
}
@Override
public int hashCode() {
return (int) (nightly + Math.pow(release, 2) + Math.pow(minor, 4) + Math.pow(major, 8));
}
/**
* Parses String into respective values.
*
* @param versionNumber
* String in format [major].[minor].[release].[nightly]
*/
private void parseVersionNumber(String versionNumber) {
major = 0;
minor = 0;
release = 0;
nightly = 0;
if (versionNumber == null)
return;
Pattern pattern = Pattern.compile("^([0-9]+)(\\.([0-9]+)(\\.([0-9]+)(\\.([0-9]+))?)?)?$");
Matcher matcher = pattern.matcher(versionNumber);
if (!matcher.find())
return;
String checkedMajor = matcher.group(1);
if (checkedMajor == null || checkedMajor.isEmpty())
return;
major = Integer.parseInt(checkedMajor);
String checkedMinor = matcher.group(3);
if (checkedMinor == null || checkedMinor.isEmpty())
return;
minor = Integer.parseInt(checkedMinor);
String checkedRelease = matcher.group(5);
if (checkedRelease == null || checkedRelease.isEmpty())
return;
release = Integer.parseInt(checkedRelease);
String checkedNightly = matcher.group(7);
if (checkedNightly == null || checkedNightly.isEmpty())
return;
nightly = Integer.parseInt(checkedNightly);
}
@Override
public String toString() {
if (equals(UNVERSIONED))
return "Not installed";
return String.valueOf(major) + "." + String.valueOf(minor) + "." + String.valueOf(release)
+ "." + String.valueOf(nightly);
}
@Override
public int compareTo(VersionNumber o) {
if (o == null)
return 1;
else if (o == this)
return 0;
else if (major != o.major)
return major - o.major;
else if (minor != o.minor)
return minor - o.minor;
else if (release != o.release)
return release - o.release;
return nightly - o.nightly;
}
@Override
public Comparator<VersionNumber> getInstallationsServerPropertiesComparator() {
return new GeneralComparator();
}
@Override
public Comparator<VersionNumber> getLocalInstallationsComparator() {
return new GeneralComparator();
}
@Override
public Comparator<VersionNumber> getLocal2ServerComparator() {
return new GeneralComparator();
}
/**
* Comparator for everything.
*/
static class GeneralComparator implements Comparator<VersionNumber> {
@Override
public int compare(VersionNumber o1, VersionNumber o2) {
if (o1 == null)
return (o2 == null ? 0 : -1);
else if (o1.major != o2.major)
return o1.major - o2.major;
else if (o1.minor != o2.minor)
return o1.minor - o2.minor;
else if (o1.release != o2.release)
return o1.release - o2.release;
return o1.nightly - o2.nightly;
}
}
/**
* Creates new VersionNumber using String as reference.
*
* @param version
* String in format [major].[minor].[release].[nightly]
* @return VersionNumber instance
*/
public static VersionNumber version(String version) {
return new VersionNumber(version);
}
/**
* Creates new VersionNumber using respective numbers.
*
* @param major
* major version number
* @param minor
* minor version number
* @param release
* release version number
* @param nightly
* nightly version number
* @return VersionNumber instance
*/
public static VersionNumber version(int major, int minor, int release, int nightly) {
return new VersionNumber(major, minor, release, nightly);
}
}