001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019 package org.apache.xbean.osgi.bundle.util;
020
021 import org.osgi.framework.Version;
022
023 public class VersionRange {
024
025 private Version low = null;
026 private boolean isLowInclusive = false;
027 private Version high = null;
028 private boolean isHighInclusive = false;
029
030 public static final VersionRange infiniteRange = new VersionRange(Version.emptyVersion, true, null, true);
031
032 public VersionRange(Version low, boolean isLowInclusive, Version high, boolean isHighInclusive) {
033 this.low = low;
034 this.isLowInclusive = isLowInclusive;
035 this.high = high;
036 this.isHighInclusive = isHighInclusive;
037 }
038
039 public Version getLow() {
040 return low;
041 }
042
043 public boolean isLowInclusive() {
044 return isLowInclusive;
045 }
046
047 public Version getHigh() {
048 return high;
049 }
050
051 public boolean isHighInclusive() {
052 return isHighInclusive;
053 }
054
055 public boolean isInRange(Version version) {
056 // We might not have an upper end to the range.
057 if (high == null) {
058 return (version.compareTo(low) >= 0);
059 } else if (isLowInclusive() && isHighInclusive()) {
060 return (version.compareTo(low) >= 0) && (version.compareTo(high) <= 0);
061 } else if (isHighInclusive()) {
062 return (version.compareTo(low) > 0) && (version.compareTo(high) <= 0);
063 } else if (isLowInclusive()) {
064 return (version.compareTo(low) >= 0) && (version.compareTo(high) < 0);
065 }
066 return (version.compareTo(low) > 0) && (version.compareTo(high) < 0);
067 }
068
069 public static VersionRange parse(String range) {
070 // Check if the version is an interval.
071 if (range.indexOf(',') >= 0) {
072 String s = range.substring(1, range.length() - 1);
073 String vlo = s.substring(0, s.indexOf(',')).trim();
074 String vhi = s.substring(s.indexOf(',') + 1, s.length()).trim();
075 return new VersionRange (
076 new Version(vlo), (range.charAt(0) == '['),
077 new Version(vhi), (range.charAt(range.length() - 1) == ']'));
078 } else {
079 return new VersionRange(new Version(range), true, null, false);
080 }
081 }
082
083 public String toString() {
084 if (high != null) {
085 StringBuffer sb = new StringBuffer();
086 sb.append(isLowInclusive ? '[' : '(');
087 sb.append(low.toString());
088 sb.append(',');
089 sb.append(high.toString());
090 sb.append(isHighInclusive ? ']' : ')');
091 return sb.toString();
092 } else {
093 return low.toString();
094 }
095 }
096 }