blob: ea475143917df97f40a3bd127638d08739deb085 [file] [log] [blame]
/*
* 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.geode.internal.serialization;
/**
* {@link Version} is able to represent not only currently-known
* Geode versions but future versions as well. This is necessary
* because during rolling upgrades Geode manipulates member
* identifiers for members running newer versions of the software.
* In that case we receive the ordinal over the network
* (serialization) but we don't know other version details such as
* major/minor/patch version, which are known to the Version class.
*
* Implementations must define equals() and hashCode() based on
* ordinal() result. And since this interface extends Comparable,
* implementations must define compareTo() as well.
*
* Unlike {@link KnownVersion} (a subtype of which acts like an
* enumerated type), {@link Version} does not, in general, guarantee
* that if vo1.equals(vo2) then vo1 == vo2.
*
* Use the {@link Versioning} factory class to construct objects implementing
* this interface. All instances of known versions are defined as
* constants in the {@link KnownVersion} class, e.g. Version.GEODE_1_11_0
*/
public interface Version extends Comparable<Version> {
/**
* @return the short ordinal value for comparison implementations
*/
short ordinal();
/*
* What follows is a bunch of comparison methods phrased in terms of version age:
* older/newer.
*/
/**
* Test if this version is older than given version.
*
* @param version to compare to this version
* @return true if this is older than version, otherwise false.
*/
boolean isOlderThan(Version version);
/**
* Test if this version is not older than given version.
*
* @param version to compare to this version
* @return true if this is the same version or newer, otherwise false.
*/
boolean isNotOlderThan(Version version);
/**
* Test if this version is newer than or equal to the given version. Synonym for
* {@link #isNotOlderThan(Version)}.
*
* @param version to compare to this version
* @return true if this is the same version or newer, otherwise false.
*/
default boolean isNewerThanOrEqualTo(Version version) {
return isNotOlderThan(version);
}
/**
* Test if this version is newer than given version.
*
* @param version to compare to this version
* @return true if this is newer than version, otherwise false.
*/
boolean isNewerThan(Version version);
/**
* Test if this version is not newer than given version.
*
* @param version to compare to this version
* @return true if this is the same version or older, otherwise false.
*/
boolean isNotNewerThan(Version version);
}