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

org.opendaylight.yangtools.concepts.SemVer Maven / Gradle / Ivy

/*
 * Copyright (c) 2016 Pantheon Technologies s.r.o. and others.  All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 */
package org.opendaylight.yangtools.concepts;

import static com.google.common.base.Preconditions.checkArgument;

import java.io.Serializable;
import org.checkerframework.checker.index.qual.NonNegative;
import org.eclipse.jdt.annotation.NonNull;

/**
 * A single version according to Semantic Versioning.
 *
 * @param major Major version number
 * @param minor Minor version number
 * @param patch Patch version number
 */
public record SemVer(@NonNegative int major, @NonNegative int minor, @NonNegative int patch)
        implements Comparable, Serializable {
    @java.io.Serial
    private static final long serialVersionUID = 1L;

    public SemVer {
        checkArgument(major >= 0, "Major version has to be non-negative");
        checkArgument(minor >= 0, "Minor version has to be non-negative");
        checkArgument(patch >= 0, "Patch version has to be non-negative");
    }

    public SemVer(final @NonNegative int major) {
        this(major, 0);
    }

    public SemVer(final @NonNegative int major, final @NonNegative int minor) {
        this(major, minor, 0);
    }

    public static @NonNull SemVer valueOf(final @NonNull String str) {
        final int minorIdx = str.indexOf('.');
        if (minorIdx == -1) {
            return new SemVer(Integer.parseInt(str));
        }

        final String minorStr;
        final int patchIdx = str.indexOf('.', minorIdx + 1);
        if (patchIdx == -1) {
            minorStr = str.substring(minorIdx + 1);
            return new SemVer(Integer.parseInt(str.substring(0, minorIdx), 10), Integer.parseInt(minorStr, 10));
        }

        minorStr = str.substring(minorIdx + 1, patchIdx);
        return new SemVer(Integer.parseInt(str.substring(0, minorIdx), 10), Integer.parseInt(minorStr, 10),
            Integer.parseInt(str.substring(patchIdx + 1), 10));
    }

    @Override
    public int compareTo(final SemVer other) {
        int cmp = Integer.compare(major, other.major);
        if (cmp == 0) {
            cmp = Integer.compare(minor, other.minor);
            if (cmp == 0) {
                cmp = Integer.compare(patch, other.patch);
            }
        }
        return cmp;
    }

    @Override
    public String toString() {
        return major + "." + minor + "." + patch;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy