blob: 820e5ce0c91e31b5be0b3b354cadc26702ca2d9f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.osgi.impl.bundle.obr.resource;
import org.osgi.framework.Version;
/**
* This class represents a version range.
* @since 3.1
*/
public class VersionRange {
private static final Version versionMax = new Version(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
/**
* An empty version
*/
public static final VersionRange emptyRange = new VersionRange(null);
private Version minVersion;
private boolean includeMin;
private Version maxVersion;
private boolean includeMax;
/**
* Constructs a VersionRange with the specified minVersion and maxVersion.
* @param minVersion the minimum version of the range
* @param maxVersion the maximum version of the range
*/
public VersionRange(Version minVersion, boolean includeMin, Version maxVersion, boolean includeMax) {
this.minVersion = minVersion;
this.includeMin = includeMin;
this.maxVersion = maxVersion;
this.includeMax = includeMax;
}
/**
* Constructs a VersionRange from the given versionRange String.
* @param versionRange a version range String that specifies a range of
* versions.
*/
public VersionRange(String versionRange) {
if (versionRange == null || versionRange.length() == 0) {
minVersion = Version.emptyVersion;
includeMin = true;
maxVersion = VersionRange.versionMax;
includeMax = true;
return;
}
versionRange = versionRange.trim();
if (versionRange.charAt(0) == '[' || versionRange.charAt(0) == '(') {
int comma = versionRange.indexOf(',');
if (comma < 0)
throw new IllegalArgumentException();
char last = versionRange.charAt(versionRange.length() - 1);
if (last != ']' && last != ')')
throw new IllegalArgumentException();
minVersion = Version.parseVersion(versionRange.substring(1, comma).trim());
includeMin = versionRange.charAt(0) == '[';
maxVersion = Version.parseVersion(versionRange.substring(comma + 1, versionRange.length() - 1).trim());
includeMax = last == ']';
} else {
minVersion = Version.parseVersion(versionRange.trim());
includeMin = true;
maxVersion = VersionRange.versionMax;
includeMax = true;
}
}
/**
* Returns the minimum Version of this VersionRange
* @return the minimum Version of this VersionRange
*/
public Version getMinimum() {
return minVersion;
}
/**
* Indicates if the minimum version is included in the version range.
* @return true if the minimum version is included in the version range;
* otherwise false is returned
*/
public boolean getIncludeMinimum() {
return includeMin;
}
/**
* Returns the maximum Version of this VersionRange
* @return the maximum Version of this VersionRange
*/
public Version getMaximum() {
return maxVersion;
}
/**
* Indicates if the maximum version is included in the version range.
* @return true if the maximum version is included in the version range;
* otherwise false is returned
*/
public boolean getIncludeMaximum() {
return includeMax;
}
/**
* Returns whether the given version is included in this VersionRange.
* This will depend on the minimum and maximum versions of this VersionRange
* and the given version.
*
* @param version a version to be tested for inclusion in this VersionRange.
* (may be <code>null</code>)
* @return <code>true</code> if the version is include,
* <code>false</code> otherwise
*/
public boolean isIncluded(Version version) {
Version minRequired = getMinimum();
if (minRequired == null)
return true;
if (version == null)
return false;
Version maxRequired = getMaximum() == null ? VersionRange.versionMax : getMaximum();
int minCheck = includeMin ? 0 : 1;
int maxCheck = includeMax ? 0 : -1;
return version.compareTo(minRequired) >= minCheck && version.compareTo(maxRequired) <= maxCheck;
}
public boolean equals(Object object) {
if (!(object instanceof VersionRange))
return false;
VersionRange vr = (VersionRange) object;
if (minVersion != null && vr.getMinimum() != null) {
if (minVersion.equals(vr.getMinimum()) && includeMin == vr.includeMin)
if (maxVersion != null && vr.getMaximum() != null) {
if (maxVersion.equals(vr.getMaximum()) && includeMax == vr.includeMax)
return true;
}
else
return maxVersion == vr.getMaximum();
}
else {
return minVersion == vr.getMinimum();
}
return false;
}
public String toString() {
if (minVersion == null)
return Version.emptyVersion.toString();
if (VersionRange.versionMax.equals(maxVersion))
return minVersion.toString();
StringBuffer result = new StringBuffer();
result.append(includeMin ? '[' : '(');
result.append(minVersion);
result.append(',');
result.append(maxVersion);
result.append(includeMax ? ']' : ')');
return result.toString();
}
}