View Javadoc

1   // ========================================================================
2   // Copyright 2002-2005 Mort Bay Consulting Pty. Ltd.
3   // ------------------------------------------------------------------------
4   // Licensed under the Apache License, Version 2.0 (the "License");
5   // you may not use this file except in compliance with the License.
6   // You may obtain a copy of the License at 
7   // http://www.apache.org/licenses/LICENSE-2.0
8   // Unless required by applicable law or agreed to in writing, software
9   // distributed under the License is distributed on an "AS IS" BASIS,
10  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11  // See the License for the specific language governing permissions and
12  // limitations under the License.
13  // ========================================================================
14  package org.mortbay.start;
15  
16  /**
17   * Utility class for parsing and comparing version strings.
18   * JDK 1.1 compatible.
19   * @author Jan Hlavatý
20   */
21   
22  public class Version {
23   
24      int _version = 0;
25      int _revision = 0;
26      int _subrevision = 0;
27      String _suffix = "";
28      
29      public Version() {
30      }
31      
32      public Version(String version_string) {
33          parse(version_string);
34      }
35      
36      /**
37       * parses version string in the form version[.revision[.subrevision[extension]]]
38       * into this instance.
39       */
40      public void parse(String version_string) {
41          _version = 0;
42          _revision = 0;
43          _subrevision = 0;
44          _suffix = "";
45          int pos = 0;
46          int startpos = 0;
47          int endpos = version_string.length();
48          while ( (pos < endpos) && Character.isDigit(version_string.charAt(pos))) {
49              pos++;
50          }
51          _version = Integer.parseInt(version_string.substring(startpos,pos));
52          if ((pos < endpos) && version_string.charAt(pos)=='.') {
53              startpos = ++pos;
54              while ( (pos < endpos) && Character.isDigit(version_string.charAt(pos))) {
55                  pos++;
56              }
57              _revision = Integer.parseInt(version_string.substring(startpos,pos));
58          }
59          if ((pos < endpos) && version_string.charAt(pos)=='.') {
60              startpos = ++pos;
61              while ( (pos < endpos) && Character.isDigit(version_string.charAt(pos))) {
62                  pos++;
63              }
64              _subrevision = Integer.parseInt(version_string.substring(startpos,pos));
65          }
66          if (pos < endpos) {
67              _suffix = version_string.substring(pos);
68          }
69      }
70      
71      /**
72       * @return string representation of this version
73       */
74      public String toString() {
75          StringBuffer sb = new StringBuffer(10);
76          sb.append(_version);
77          sb.append('.');
78          sb.append(_revision);
79          sb.append('.');
80          sb.append(_subrevision);
81          sb.append(_suffix);
82          return sb.toString();
83      }
84      
85      // java.lang.Comparable is Java 1.2! Cannot use it
86      /**
87       * Compares with other version. Does not take extension into account,
88       * as there is no reliable way to order them.
89       * @return -1 if this is older version that other,
90       *         0 if its same version,
91       *         1 if it's newer version than other
92       */
93      public int compare(Version other) {
94          if (other == null) throw new NullPointerException("other version is null");
95          if (this._version < other._version) return -1;
96          if (this._version > other._version) return 1;
97          if (this._revision < other._revision) return -1;
98          if (this._revision > other._revision) return 1;
99          if (this._subrevision < other._subrevision) return -1;
100         if (this._subrevision > other._subrevision) return 1;
101         return 0;
102     }
103     
104     /**
105      * Check whether this verion is in range of versions specified
106      */
107     public boolean isInRange(Version low, Version high) {
108         return (compare(low)>=0 && compare(high)<=0);
109     }
110 }