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    }