1 19 package org.java.plugin.registry; 20 21 import java.io.IOException ; 22 import java.io.ObjectInputStream ; 23 import java.io.ObjectOutputStream ; 24 import java.io.Serializable ; 25 import java.util.Locale ; 26 import java.util.StringTokenizer ; 27 28 33 public final class Version implements Serializable , Comparable { 34 private static final long serialVersionUID = -3054349171116917643L; 35 36 39 public static final char SEPARATOR = '.'; 40 41 48 public static Version parse(final String str) { 49 Version result = new Version(); 50 result.parseString(str); 51 return result; 52 } 53 54 private transient int major; 55 private transient int minor; 56 private transient int build; 57 private transient String name; 58 private transient String asString; 59 60 private Version() { 61 } 63 64 private void parseString(final String str) { 65 major = 0; 66 minor = 0; 67 build = 0; 68 name = ""; StringTokenizer st = new StringTokenizer (str, "" + SEPARATOR, false); if (!st.hasMoreTokens()) { 72 return; 73 } 74 String token = st.nextToken(); 75 try { 76 major = Integer.parseInt(token, 10); 77 } catch (NumberFormatException nfe) { 78 name = token; 79 while (st.hasMoreTokens()) { 80 name += st.nextToken(); 81 } 82 return; 83 } 84 if (!st.hasMoreTokens()) { 86 return; 87 } 88 token = st.nextToken(); 89 try { 90 minor = Integer.parseInt(token, 10); 91 } catch (NumberFormatException nfe) { 92 name = token; 93 while (st.hasMoreTokens()) { 94 name += st.nextToken(); 95 } 96 return; 97 } 98 if (!st.hasMoreTokens()) { 100 return; 101 } 102 token = st.nextToken(); 103 try { 104 build = Integer.parseInt(token, 10); 105 } catch (NumberFormatException nfe) { 106 name = token; 107 while (st.hasMoreTokens()) { 108 name += st.nextToken(); 109 } 110 return; 111 } 112 if (st.hasMoreTokens()) { 114 name = st.nextToken(); 115 while (st.hasMoreTokens()) { 116 name += st.nextToken(); 117 } 118 } 119 } 120 121 130 public Version(final int aMajor, final int aMinor, final int aBuild, 131 final String aName) { 132 major = aMajor; 133 minor = aMinor; 134 build = aBuild; 135 name = (aName == null) ? "" : aName; } 137 138 141 public int getBuild() { 142 return build; 143 } 144 145 148 public int getMajor() { 149 return major; 150 } 151 152 155 public int getMinor() { 156 return minor; 157 } 158 159 162 public String getName() { 163 return name; 164 } 165 166 183 public boolean isGreaterOrEqualTo(final Version other) { 184 if (other == null) { 185 return false; 186 } 187 if (major > other.major) { 188 return true; 189 } 190 if ((major == other.major) && (minor > other.minor)) { 191 return true; 192 } 193 if ((major == other.major) && (minor == other.minor) 194 && (build > other.build)) { 195 return true; 196 } 197 if ((major == other.major) && (minor == other.minor) 198 && (build == other.build) 199 && name.equalsIgnoreCase(other.name)) { 200 return true; 201 } 202 return false; 203 } 204 205 221 public boolean isCompatibleWith(final Version other) { 222 if (other == null) { 223 return false; 224 } 225 if (major != other.major) { 226 return false; 227 } 228 if (minor > other.minor) { 229 return true; 230 } 231 if (minor < other.minor) { 232 return false; 233 } 234 if (build >= other.build) { 235 return true; 236 } 237 return false; 238 } 239 240 253 public boolean isEquivalentTo(final Version other) { 254 if (other == null) { 255 return false; 256 } 257 if (major != other.major) { 258 return false; 259 } 260 if (minor != other.minor) { 261 return false; 262 } 263 if (build >= other.build) { 264 return true; 265 } 266 return false; 267 } 268 269 278 public boolean isGreaterThan(final Version other) { 279 if (other == null) { 280 return false; 281 } 282 if (major > other.major) { 283 return true; 284 } 285 if (major < other.major) { 286 return false; 287 } 288 if (minor > other.minor) { 289 return true; 290 } 291 if (minor < other.minor) { 292 return false; 293 } 294 if (build > other.build) { 295 return true; 296 } 297 return false; 298 299 } 300 301 304 public int hashCode() { 305 return toString().hashCode(); 306 } 307 308 311 public boolean equals(final Object obj) { 312 if (this == obj) { 313 return true; 314 } 315 if (!(obj instanceof Version)) { 316 return false; 317 } 318 Version other = (Version) obj; 319 if ((major != other.major) || (minor != other.minor) 320 || (build != other.build) 321 || !name.equalsIgnoreCase(other.name)) { 322 return false; 323 } 324 return true; 325 } 326 327 333 public String toString() { 334 if (asString == null) { 335 asString = "" + major + SEPARATOR + minor + SEPARATOR + build + (name.length() == 0 ? "" : SEPARATOR + name); } 338 return asString; 339 } 340 341 344 public int compareTo(final Object obj) { 345 if (equals(obj)) { 346 return 0; 347 } 348 if (!(obj instanceof Version)) { 349 throw new ClassCastException (); 350 } 351 Version other = (Version) obj; 352 if (major != other.major) { 353 return major - other.major; 354 } 355 if (minor != other.minor) { 356 return minor - other.minor; 357 } 358 if (build != other.build) { 359 return build - other.build; 360 } 361 return name.toLowerCase(Locale.ENGLISH).compareTo( 362 other.name.toLowerCase(Locale.ENGLISH)); 363 } 364 365 367 private void writeObject(final ObjectOutputStream out) throws IOException { 368 out.writeUTF(toString()); 369 } 370 371 private void readObject(final ObjectInputStream in) throws IOException { 372 parseString(in.readUTF()); 373 } 374 } 375 | Popular Tags |