From 2128942b95031180c9fab063fb43b8a710d1cdfe Mon Sep 17 00:00:00 2001 From: liamfallon Date: Thu, 4 Apr 2019 13:26:58 +0000 Subject: Add semantic version comparable class Class written by Jim Hahn that implements Comparable for comparing semantic versions. Lifted from policy models pap. Issue-ID: POLICY-1095 Change-Id: Ie8c5f9066c06cb569085e1390b3de3e4aa580267 Signed-off-by: liamfallon --- .../policy/common/utils/validation/Version.java | 113 +++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 utils/src/main/java/org/onap/policy/common/utils/validation/Version.java (limited to 'utils/src/main/java/org/onap/policy/common/utils/validation/Version.java') diff --git a/utils/src/main/java/org/onap/policy/common/utils/validation/Version.java b/utils/src/main/java/org/onap/policy/common/utils/validation/Version.java new file mode 100644 index 00000000..b5769948 --- /dev/null +++ b/utils/src/main/java/org/onap/policy/common/utils/validation/Version.java @@ -0,0 +1,113 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP COMMON + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2019 Nordix Foundation. + * ================================================================================ + * Licensed 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.common.utils.validation; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Version of an object within the model. Versions are assumed to be of the form: major or + * major.minor.patch, where each component is numeric. + */ +@Data +@RequiredArgsConstructor +@NoArgsConstructor(force = true) +public class Version implements Comparable { + private static final Logger logger = LoggerFactory.getLogger(Version.class); + + /** + * Pattern to match a version of the form, major or major.minor.patch, where all + * components are numeric. + */ + private static final Pattern VERSION_PAT = Pattern.compile("(\\d+)([.](\\d+)[.](\\d+))?"); + + private final int major; + private final int minor; + private final int patch; + + + /** + * Creates a version object. + * + * @param type type of object with which the version is associated, used when logging + * @param name name with which the version is associated, used when logging + * @param versionText the version, in textual form + * @return a new version, or {@code null} if the version cannot be created from the + * key (e.g., the key has a version that does not match the major.minor.patch + * form) + */ + public static Version makeVersion(String type, String name, String versionText) { + Matcher matcher = VERSION_PAT.matcher(versionText); + if (!matcher.matches()) { + logger.info("invalid version for {} {}: {}", type, name, versionText); + return null; + } + + try { + if (matcher.group(2) == null) { + // form: major + return new Version(Integer.parseInt(matcher.group(1)), 0, 0); + + } else { + // form: major.minor.patch + return new Version(Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(3)), + Integer.parseInt(matcher.group(4))); + } + + } catch (NumberFormatException e) { + logger.info("invalid version for {} {}: {}", type, name, versionText, e); + return null; + } + } + + /** + * Generates a new version from the current version. + * + * @return a new version, of the form major.0.0, where "major" is one more than "this" + * version's major number + */ + public Version newVersion() { + return new Version(major + 1, 0, 0); + } + + @Override + public int compareTo(Version other) { + int result = Integer.compare(major, other.major); + if (result != 0) { + return result; + } + if ((result = Integer.compare(minor, other.minor)) != 0) { + return result; + } + return Integer.compare(patch, other.patch); + } + + @Override + public String toString() { + return major + "." + minor + "." + patch; + } +} \ No newline at end of file -- cgit 1.2.3-korg