/* * Copyright (c) OSGi Alliance (2002, 2006, 2007). All Rights Reserved. * * 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 * * 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.osgi.service.indexer.impl.types; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.osgi.framework.Version; public class VersionRange implements Comparable<VersionRange> { final Version high; final Version low; char start = '['; char end = ']'; static String V = "[0-9]+(\\.[0-9]+(\\.[0-9]+(\\.[a-zA-Z0-9_-]+)?)?)?"; static Pattern RANGE = Pattern.compile("(\\(|\\[)\\s*(" + V + ")\\s*,\\s*(" + V + ")\\s*(\\)|\\])"); public VersionRange(boolean lowInclusive, Version low, Version high, boolean highInclusive) { if (low.compareTo(high) > 0) throw new IllegalArgumentException("Low Range is higher than High Range: " + low + "-" + high); this.low = low; this.high = high; this.start = lowInclusive ? '[' : '('; this.end = highInclusive ? ']' : ')'; } public VersionRange(String string) { string = string.trim(); Matcher m = RANGE.matcher(string); if (m.matches()) { start = m.group(1).charAt(0); low = new Version(m.group(2)); high = new Version(m.group(6)); end = m.group(10).charAt(0); if (low.compareTo(high) > 0) throw new IllegalArgumentException("Low Range is higher than High Range: " + low + "-" + high); } else { start = '['; high = low = new Version(string); end = ']'; } } public boolean isRange() { return high != low; } public boolean includeLow() { return start == '['; } public boolean includeHigh() { return end == ']'; } public String toString() { if (high == low) return high.toString(); StringBuffer sb = new StringBuffer(); sb.append(start); sb.append(low); sb.append(','); sb.append(high); sb.append(end); return sb.toString(); } public boolean equals(VersionRange other) { return compareTo(other) == 0; } public int hashCode() { return low.hashCode() * high.hashCode(); } public int compareTo(VersionRange range) { VersionRange a = this, b = range; if (range.isRange()) { a = range; b = this; } else { if (!isRange()) return low.compareTo(range.high); } int l = a.low.compareTo(b.low); boolean ll = false; if (a.includeLow()) ll = l <= 0; else ll = l < 0; if (!ll) return -1; int h = a.high.compareTo(b.high); if (a.includeHigh()) ll = h >= 0; else ll = h > 0; if (ll) return 0; else return 1; } public Version getHigh() { return high; } public Version getLow() { return low; } public boolean match(Version version) { int lowmatch = version.compareTo(low); if (lowmatch < 0) return false; if (lowmatch == 0 && !includeLow()) return false; int highmatch = version.compareTo(high); if (highmatch > 0) return false; if (highmatch == 0 && !includeHigh()) return false; return true; } }