/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with this * work for additional information regarding copyright ownership. The ASF * licenses this file to You 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.apache.sling.provisioning.model; /** * Version object supporting Maven and OSGi versions. * @since 1.4 */ public class Version implements Comparable<Version> { private final int majorVersion; private final int minorVersion; private final int microVersion; private final String qualifier; /** * Creates a version identifier from the specified string. * @throws IllegalArgumentException if the version string can't be parsed */ public Version(final String version) { String parts[] = version.split("\\."); if ( parts.length > 4 ) { throw new IllegalArgumentException("Invalid version " + version); } if ( parts.length < 4) { final int pos = parts[parts.length - 1].indexOf('-'); if ( pos != -1 ) { final String[] newParts = new String[4]; newParts[0] = parts.length > 1 ? parts[0] : parts[0].substring(0, pos); newParts[1] = parts.length > 2 ? parts[1] : (parts.length > 1 ? parts[1].substring(0, pos) : "0"); newParts[2] = parts.length > 3 ? parts[2] : (parts.length > 2 ? parts[2].substring(0, pos) : "0"); newParts[3] = parts[parts.length - 1].substring(pos + 1); parts = newParts; } } this.majorVersion = parseInt(parts[0], version); if ( parts.length > 1 ) { this.minorVersion = parseInt(parts[1], version); } else { this.minorVersion = 0; } if ( parts.length > 2 ) { this.microVersion = parseInt(parts[2], version); } else { this.microVersion = 0; } this.qualifier = (parts.length > 3 ? parts[3] : ""); } /** * Get the major version * @return The major version * @since 1.8.0 */ public int getMajorVersion() { return majorVersion; } /** * Get the major version * @return The major version * @since 1.8.0 */ public int getMinorVersion() { return minorVersion; } /** * Get the minor version * @return The minor version * @since 1.8.0 */ public int getMicroVersion() { return microVersion; } /** * Get the qualifier * @return The qualifier, the qualifier might be the empty string. * @since 1.8.0 */ public String getQualifier() { return qualifier; } /** * Parse an integer. */ private static int parseInt(final String value, final String version) { try { return Integer.parseInt(value); } catch (NumberFormatException e) { throw new IllegalArgumentException("Invalid version " + version); } } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + majorVersion; result = prime * result + microVersion; result = prime * result + minorVersion; result = prime * result + ((qualifier == null) ? 0 : qualifier.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Version other = (Version) obj; if (majorVersion != other.majorVersion) return false; if (microVersion != other.microVersion) return false; if (minorVersion != other.minorVersion) return false; if (qualifier == null) { if (other.qualifier != null) return false; } else if (!qualifier.equals(other.qualifier)) return false; return true; } /** * Compares this {@code Version} object to another {@code Version}. */ @Override public int compareTo(final Version other) { int result = 0; if (other != this) { result = majorVersion - other.majorVersion; if (result == 0) { result = minorVersion - other.minorVersion; if (result == 0) { result = microVersion - other.microVersion; if (result == 0) { result = qualifier.compareTo(other.qualifier); if ( result != 0 ) { if ( "SNAPSHOT".equals(qualifier) ) { result = -1; } else if ( "SNAPSHOT".equals(other.qualifier) ) { result = 1; } } } } } } return result; } @Override public String toString() { return String.valueOf(this.majorVersion) + "." + String.valueOf(this.minorVersion + "." + String.valueOf(this.microVersion) + (this.qualifier.length() == 0 ? "" : "." + this.qualifier)); } }