blob: 116159b9fe782e6f9faf242864c152e29fbef8ce [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with this
* work for additional information regarding copyright ownership. The ASF
* licenses this file to You 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.apache.sling.provisioning.model;
/**
* Version object supporting Maven and OSGi versions.
* @since 1.4
*/
public class Version implements Comparable<Version> {
private final int majorVersion;
private final int minorVersion;
private final int microVersion;
private final String qualifier;
/**
* Creates a version identifier from the specified string.
* @throws IllegalArgumentException if the version string can't be parsed
*/
public Version(final String version) {
String parts[] = version.split("\\.");
if ( parts.length > 4 ) {
throw new IllegalArgumentException("Invalid version " + version);
}
if ( parts.length < 4) {
final int pos = parts[parts.length - 1].indexOf('-');
if ( pos != -1 ) {
final String[] newParts = new String[4];
newParts[0] = parts.length > 1 ? parts[0] : parts[0].substring(0, pos);
newParts[1] = parts.length > 2 ? parts[1] : (parts.length > 1 ? parts[1].substring(0, pos) : "0");
newParts[2] = parts.length > 3 ? parts[2] : (parts.length > 2 ? parts[2].substring(0, pos) : "0");
newParts[3] = parts[parts.length - 1].substring(pos + 1);
parts = newParts;
}
}
this.majorVersion = parseInt(parts[0], version);
if ( parts.length > 1 ) {
this.minorVersion = parseInt(parts[1], version);
} else {
this.minorVersion = 0;
}
if ( parts.length > 2 ) {
this.microVersion = parseInt(parts[2], version);
} else {
this.microVersion = 0;
}
this.qualifier = (parts.length > 3 ? parts[3] : "");
}
/**
* Get the major version
* @return The major version
* @since 1.8.0
*/
public int getMajorVersion() {
return majorVersion;
}
/**
* Get the major version
* @return The major version
* @since 1.8.0
*/
public int getMinorVersion() {
return minorVersion;
}
/**
* Get the minor version
* @return The minor version
* @since 1.8.0
*/
public int getMicroVersion() {
return microVersion;
}
/**
* Get the qualifier
* @return The qualifier, the qualifier might be the empty string.
* @since 1.8.0
*/
public String getQualifier() {
return qualifier;
}
/**
* Parse an integer.
*/
private static int parseInt(final String value, final String version) {
try {
return Integer.parseInt(value);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("Invalid version " + version);
}
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + majorVersion;
result = prime * result + microVersion;
result = prime * result + minorVersion;
result = prime * result + ((qualifier == null) ? 0 : qualifier.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Version other = (Version) obj;
if (majorVersion != other.majorVersion)
return false;
if (microVersion != other.microVersion)
return false;
if (minorVersion != other.minorVersion)
return false;
if (qualifier == null) {
if (other.qualifier != null)
return false;
} else if (!qualifier.equals(other.qualifier))
return false;
return true;
}
/**
* Compares this {@code Version} object to another {@code Version}.
*/
@Override
public int compareTo(final Version other) {
int result = 0;
if (other != this) {
result = majorVersion - other.majorVersion;
if (result == 0) {
result = minorVersion - other.minorVersion;
if (result == 0) {
result = microVersion - other.microVersion;
if (result == 0) {
result = qualifier.compareTo(other.qualifier);
if ( result != 0 ) {
if ( "SNAPSHOT".equals(qualifier) ) {
result = -1;
} else if ( "SNAPSHOT".equals(other.qualifier) ) {
result = 1;
}
}
}
}
}
}
return result;
}
@Override
public String toString() {
return String.valueOf(this.majorVersion) + "."
+ String.valueOf(this.minorVersion + "."
+ String.valueOf(this.microVersion) +
(this.qualifier.length() == 0 ? "" : "." + this.qualifier));
}
}