All Downloads are FREE. Search and download functionalities are using the official Maven repository.

src.main.java.com.mgnt.utils.textutils.VersionRange Maven / Gradle / Ivy

package com.mgnt.utils.textutils;

import java.io.Serializable;
import java.text.MessageFormat;

/**
 * This class represents a Version Range. It has the lower and upper limits and allows to check if a version is within range or not and if two ranges
 * overlap or not
 *
 * @author Michael Gantman
 */
public class VersionRange implements Serializable {

    private static final long serialVersionUID = 236297683414697942L;

    private static final String VERSION_DELIMITER = "-";

    private Version _fromVersion;
    private Version _toVersion;

    /**
     * This constructor constructs the Range with its lower and upper limits
     *
     * @param fromVersion Version that contains lower limit of the range
     * @param toVersion   Version that contains upper limit of the range
     * @throws InvalidVersionRangeException if lower limit of the range is greater than upper limit
     */
    public VersionRange(Version fromVersion, Version toVersion) throws InvalidVersionRangeException {
        _fromVersion = fromVersion;
        _toVersion = toVersion;
        validateData();
    }

    /**
     * This constructor constructs the Range with its lower and upper limits. It first converts String parameters into Version values
     *
     * @param fromVersion String that contains lower limit of the range
     * @param toVersion   String that contains upper limit of the range
     * @throws InvalidVersionRangeException  if lower limit of the range is greater than upper limit
     * @throws InvalidVersionFormatException if one of the Strings is not a valid version
     */
    public VersionRange(String fromVersion, String toVersion)
            throws InvalidVersionRangeException, InvalidVersionFormatException {
        this(new Version(fromVersion.trim()), new Version(toVersion.trim()));
    }

    /**
     * This constructor constructs the Range with its lower and upper limits. It first converts String parameter into Version value
     *
     * @param fromVersion String that contains lower limit of the range
     * @param toVersion   String that contains upper limit of the range
     * @throws InvalidVersionRangeException  if lower limit of the range is greater than upper limit
     * @throws InvalidVersionFormatException if String parameter is not a valid version
     */
    public VersionRange(Version fromVersion, String toVersion)
            throws InvalidVersionRangeException, InvalidVersionFormatException {
        this(fromVersion, new Version(toVersion.trim()));
    }

    /**
     * This constructor constructs the Range with its lower and upper limits. It first converts String parameter into Version value
     *
     * @param fromVersion String that contains lower limit of the range
     * @param toVersion   String that contains upper limit of the range
     * @throws InvalidVersionRangeException  if lower limit of the range is greater than upper limit
     * @throws InvalidVersionFormatException if String parameter is not a valid version
     */
    public VersionRange(String fromVersion, Version toVersion)
            throws InvalidVersionRangeException, InvalidVersionFormatException {
        this(new Version(fromVersion.trim()), toVersion);
    }

    /**
     * This constructor creates the Range with the same lower and upper limits
     *
     * @param ver String that holds a single version
     * @throws InvalidVersionRangeException if parameter is null
     */
    public VersionRange(Version ver) throws InvalidVersionRangeException {
        this(ver, ver);
    }

    /**
     * This constructor assumes that the string is a version range in format "[Version String] - [Version String]" It splits the string by the "-"
     * delimiter and attempts to create the range the same way as constructor {@link #VersionRange(String, String)} would. If the original String
     * contains only one version without a delimiter (i.e. "[Version String]") the attempt is made to convert this String into single Version object
     * and than to create VersionRange with the same lower and upper limits
     *
     * @param versionRange String in format "[Version String] - [Version String]" or "[Version String]"
     * @throws InvalidVersionRangeException  if lower limit of the range is greater than upper limit
     * @throws InvalidVersionFormatException if String parameter is not a valid version
     */
    public VersionRange(String versionRange) throws InvalidVersionRangeException, InvalidVersionFormatException {
        if (versionRange == null || "".equals(versionRange)) {
            throw new InvalidVersionRangeException("NUll or blank argument");
        }
        String[] versions = versionRange.split(VERSION_DELIMITER, 2);
        if (versions.length == 1) {
            _fromVersion = _toVersion = new Version(versions[0].trim());
        } else {
            _fromVersion = new Version(versions[0].trim());
            _toVersion = new Version(versions[1].trim());
        }
        validateData();
    }

    /**
     * @return Version which is lower range limit
     */
    public Version getFromVersion() {
        return _fromVersion;
    }

    /**
     * @return Version which is upper range limit
     */
    public Version getToVersion() {
        return _toVersion;
    }

    /**
     * This method checks if the version falls within range. Null version is always out of range and the comparison is all inclusive
     *
     * @param ver Version to be checked
     * @return true if Version falls within range and false otherwise
     */
    public boolean isInRange(Version ver) {
        boolean result = false;
        if (ver != null) {
            if (_fromVersion.compareTo(ver) <= 0 && _toVersion.compareTo(ver) >= 0) {
                result = true;
            }
        }
        return result;
    }

    /**
     * This method first converts String parameter into Version and checks if the version falls within range. Null version is always out of range and
     * the comparison is all inclusive
     *
     * @param ver String that contains Version value to be checked
     * @return true if Version falls within range and false otherwise
     * @throws InvalidVersionFormatException if String is not a valid version value
     */
    public boolean isInRange(String ver) throws InvalidVersionFormatException {
        return isInRange(new Version(ver));
    }

    /**
     * Checks if the ver is above the range
     *
     * @param ver Version to be checked
     * @return true if version is above range false otherwise
     */
    public boolean isAboveRange(Version ver) {
        boolean result = false;
        if (ver.compareTo(getToVersion()) > 0) {
            result = true;
        }
        return result;
    }

    /**
     * Converts the String into Version and than checks if the ver is above the range
     *
     * @param ver String to be checked
     * @return true if version is above range false otherwise
     * @throws InvalidVersionFormatException
     */
    public boolean isAboveRange(String ver) throws InvalidVersionFormatException {
        return isAboveRange(new Version(ver));
    }

    /**
     * Checks if the ver is below the range
     *
     * @param ver Version to be checked
     * @return true if version is below range false otherwise
     */
    public boolean isBellowRange(Version ver) {
        boolean result = false;
        if (ver.compareTo(getFromVersion()) < 0) {
            result = true;
        }
        return result;
    }

    /**
     * Converts the String into Version and than checks if the ver is below the range
     *
     * @param ver String to be checked
     * @return true if version is bellow range false otherwise
     * @throws InvalidVersionFormatException
     */
    public boolean isBelowRange(String ver) throws InvalidVersionFormatException {
        return isBellowRange(new Version(ver));
    }

    public boolean isOverlap(VersionRange otherRange) {
        boolean result = false;
        if (otherRange != null) {
            if (isInRange(otherRange.getFromVersion()) || isInRange(otherRange.getToVersion())) {
                result = true;
            }
        }
        return result;
    }

    @Override
    public String toString() {
        return MessageFormat.format("{0} {2} {1}", _fromVersion.toString(), _toVersion.toString(), VERSION_DELIMITER);
    }

    private void validateData()
            throws InvalidVersionRangeException {
        if (_fromVersion == null || _toVersion == null) {
            throw new InvalidVersionRangeException("One of the range limits is null");
        }
        if (_fromVersion.compareTo(_toVersion) > 0) {
            throw new InvalidVersionRangeException("Lower range limit is greater then upper range limit");
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy