blob: da8fe6f14c3f6fb98e16008163be88dcf805db62 [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2007, 2012 SpringSource
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.virgo.ide.bundlerepository.domain;
import java.util.StringTokenizer;
import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
import org.osgi.framework.Version;
/**
* Persistable OSGi Version (with major, minor, service/micro and qualifier levels)
*/
public class OsgiVersion implements Comparable<OsgiVersion> {
private int major;
private int minor;
private int service;
private String qualifier = "";
/* for persistence only */
protected OsgiVersion() {
}
/**
* Create an OsgiVersion from a Bundle by getting the BUNDLE_VERSION header
*
* @param bundle
* @return an OSGiVersion object representing the version of the bundle
*/
public static OsgiVersion ofBundle(Bundle bundle) {
String headerValue = bundle.getHeaders().get(Constants.BUNDLE_VERSION);
if (headerValue == null) {
return new OsgiVersion(0, 0, 0, "");
}
return new OsgiVersion(headerValue.replaceAll("\"", ""));
}
/**
* Build an OsgiVersion from its String representation. Acceptable forms are: 1 1.0 1.0.1 1.0.0.qualifier etc.
*
* @param the string version
* @throws IllegalArgumentException
*/
public OsgiVersion(String s) throws IllegalArgumentException {
if (s == null) {
throw new IllegalArgumentException("no version string specified");
}
s = s.trim();
StringTokenizer tokenizer = new StringTokenizer(s, ".");
if (!tokenizer.hasMoreTokens()) {
throw new IllegalArgumentException("Can't convert '" + s + "' into an OSGi version");
}
try {
this.major = Integer.parseInt(tokenizer.nextToken());
this.minor = tokenizer.hasMoreTokens() ? Integer.parseInt(tokenizer.nextToken()) : 0;
this.service = tokenizer.hasMoreTokens() ? Integer.parseInt(tokenizer.nextToken()) : 0;
this.qualifier = tokenizer.hasMoreTokens() ? tokenizer.nextToken() : "";
} catch (NumberFormatException nfEx) {
throw new IllegalArgumentException("Can't convert '" + s + "' into an OSGi version");
}
}
/**
* Create an OsgiVersion explicitly specifying all levels.
*
* @param major
* @param minor
* @param service
* @param qualifier
*/
public OsgiVersion(int major, int minor, int service, String qualifier) {
this.major = major;
this.minor = minor;
this.service = service;
this.qualifier = null != qualifier ? qualifier : "";
}
/**
* Create a persistable OsgiVersion from OSGi's own (non-persistent) Version type
*
* @param v
*/
public OsgiVersion(Version v) {
this.major = v.getMajor();
this.minor = v.getMinor();
this.service = v.getMicro();
this.qualifier = null != v.getQualifier() ? v.getQualifier() : "";
}
public int getMajor() {
return this.major;
}
public int getMinor() {
return this.minor;
}
public int getService() {
return this.service;
}
public String getQualifier() {
return this.qualifier;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append(this.major);
builder.append(".");
builder.append(this.minor);
builder.append(".");
builder.append(this.service);
if (this.qualifier != null && !this.qualifier.equals("")) {
builder.append(".");
builder.append(this.qualifier);
}
return builder.toString();
}
/**
* Orders as you would expect for major,minor,service, and alphabetically for qualifier.
*/
public int compareTo(OsgiVersion o) {
if (o == this) {
return 0;
}
if (this.major > o.major) {
return 1;
} else if (this.major < o.major) {
return -1;
} else if (this.minor > o.minor) { // major versions equal
return 1;
} else if (this.minor < o.minor) {
return -1;
} else if (this.service > o.service) { // major and minor versions equal
return 1;
} else if (this.service < o.service) {
return -1;
} else { // major, minor, and service versions equals
String myQualifier = this.qualifier;
String otherQualifier = o.qualifier;
if (myQualifier == null) {
myQualifier = "";
}
if (otherQualifier == null) {
otherQualifier = "";
}
return myQualifier.compareTo(otherQualifier);
}
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof OsgiVersion)) {
return false;
}
OsgiVersion version = (OsgiVersion) obj;
return this.toString().equals(version.toString());
}
@Override
public int hashCode() {
return this.toString().hashCode();
}
}