blob: f1e28382eb33d2178bce51e9f09d9c4b3b779501 [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.felix.deploymentadmin;
import org.osgi.framework.Version;
/**
* This class represents a version range as defined in section 3.2.5 of the OSGi r4 specification.
*/
public class VersionRange {
public static final VersionRange infiniteRange = new VersionRange(Version.emptyVersion, true, null, true);
private Version m_low = null;
private boolean m_isLowInclusive = false;
private Version m_high = null;
private boolean m_isHighInclusive = false;
private String m_toString = null;
/**
* Create an instance of the VersionRange class.
*
* @param low Lower bound version
* @param isLowInclusive True if lower bound should be included in the range
* @param high Upper bound version
* @param isHighInclusive True if upper bound should be included in the range
*/
public VersionRange(Version low, boolean isLowInclusive, Version high, boolean isHighInclusive) {
m_low = low;
m_isLowInclusive = isLowInclusive;
m_high = high;
m_isHighInclusive = isHighInclusive;
}
/**
* Creates an instance of the VersionRange class which resembles [version,*)
*
* @param version The lower boundary of the version range
*/
public VersionRange(Version version) {
this(version, true, null, false);
}
/**
* Get the lower boundary of the version range, the boundary being inclusive or not is not taken into account.
*
* @return Version resembling the lower boundary of the version range
*/
public Version getLow() {
return m_low;
}
/**
* Determines whether the lower boundary is inclusive or not.
*
* @return True if the lower boundary is inclusive, false otherwise.
*/
public boolean isLowInclusive() {
return m_isLowInclusive;
}
/**
* Get the upper boundary of the version range, the boundary being inclusive or not is not taken in to account.
*
* @return Version resembling the upper boundary of the version range.
*/
public Version getHigh() {
return m_high;
}
/**
* Determines whether the upper boundary is inclusive or not.
*
* @return True if the upper boundary is inclusive, false otherwise.
*/
public boolean isHighInclusive() {
return m_isHighInclusive;
}
/**
* Determine if the specified version is part of the version range or not.
*
* @param version The version to verify
* @return True if the specified version is included in this version range, false otherwise.
*/
public boolean isInRange(Version version) {
// We might not have an upper end to the range.
if (m_high == null) {
return (version.compareTo(m_low) >= 0);
}
else if (isLowInclusive() && isHighInclusive()) {
return (version.compareTo(m_low) >= 0) && (version.compareTo(m_high) <= 0);
}
else if (isHighInclusive()) {
return (version.compareTo(m_low) > 0) && (version.compareTo(m_high) <= 0);
}
else if (isLowInclusive()) {
return (version.compareTo(m_low) >= 0) && (version.compareTo(m_high) < 0);
}
return (version.compareTo(m_low) > 0) && (version.compareTo(m_high) < 0);
}
/**
* Parses a version range from the specified string.
*
* @param range String representation of the version range.
* @return A <code>VersionRange</code> object representing the version range.
* @throws IllegalArgumentException If <code>range</code> is improperly formatted.
*/
public static VersionRange parse(String range) throws IllegalArgumentException {
// Check if the version is an interval.
if (range.indexOf(',') >= 0) {
String s = range.substring(1, range.length() - 1);
String vlo = s.substring(0, s.indexOf(',')).trim();
String vhi = s.substring(s.indexOf(',') + 1, s.length()).trim();
return new VersionRange(new Version(vlo), (range.charAt(0) == '['), new Version(vhi), (range.charAt(range.length() - 1) == ']'));
}
else {
return new VersionRange(new Version(range), true, null, false);
}
}
public String toString() {
if (m_toString == null) {
if (m_high != null) {
StringBuffer sb = new StringBuffer();
sb.append(m_isLowInclusive ? '[' : '(');
sb.append(m_low.toString());
sb.append(',');
sb.append(m_high.toString());
sb.append(m_isHighInclusive ? ']' : ')');
m_toString = sb.toString();
}
else {
m_toString = m_low.toString();
}
}
return m_toString;
}
}