blob: 015ac73d6ae1d308ee832cb9585d9e3d80a93f05 [file] [log] [blame]
/*
* Copyright 2019-present Open Networking 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.
*/
package org.onosproject.ofoverlay.impl.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Class for OVS Version.
*/
public final class OvsVersion {
protected static final Logger log = LoggerFactory.getLogger(OvsVersion.class);
private int[] versionElements = new int[] {0, 0, 0, Integer.MAX_VALUE};
private int depth = 0;
/**
* Constructor for OvsVersion.
* @param ovsVerStr OVS version string
*/
private OvsVersion(String ovsVerStr) {
// Supporting
// 1.2.3 (depth = 3, public release)
// 1.2.3.4 (depth = 4, beta release)
Matcher m = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)(\\.(\\d+))?").matcher(ovsVerStr);
if (!m.matches()) {
throw new IllegalArgumentException("Malformed OVS version");
}
versionElements[0] = Integer.parseInt(m.group(1));
versionElements[1] = Integer.parseInt(m.group(2));
versionElements[2] = Integer.parseInt(m.group(3));
if (m.group(4) == null) {
depth = 3;
return;
}
versionElements[3] = Integer.parseInt(m.group(5));
depth = 4;
}
/**
* Builder for OvsVersion.
* @param ovsVersionStr OVS version string
* @return ovs version
*/
public static OvsVersion build(String ovsVersionStr) {
try {
return new OvsVersion(ovsVersionStr);
} catch (IllegalArgumentException e) {
log.error("Exception Occurred {}", e);
return null;
}
}
private int get(int level) {
return versionElements[level];
}
private int compare(OvsVersion tgt) {
//Comparison example
// 2.7.0 < 2.7.2
// 2.7.0 > 2.6.9.12
// 2.7.0 > 2.7.0.0 (because 2.7.0 is public release)
for (int i = 0; i < versionElements.length; i++) {
if (versionElements[i] == tgt.get(i)) {
continue;
} else if (versionElements[i] < tgt.get(i)) {
return (i + 1) * -1;
} else {
return (i + 1);
}
}
return 0;
}
/**
* Returns whether this OVS version is equal to the target OVS version.
* @param tgt taret OVS version
* @return whether this OVS version is equal to the target OVS version
*/
public boolean isEqOf(OvsVersion tgt) {
return (compare(tgt) == 0);
}
/**
* Returns whether this OVS version is prior to the target OVS version.
* @param tgt taret OVS version
* @return whether this OVS version is prior to the target OVS version
*/
public boolean isPriorOf(OvsVersion tgt) {
return (compare(tgt) < 0);
}
/**
* Returns whether this OVS version is prior or equal to the target OVS version.
* @param tgt taret OVS version
* @return whether this OVS version is prior or equal to the target OVS version
*/
public boolean isPriorOrEqOf(OvsVersion tgt) {
return (compare(tgt) <= 0);
}
/**
* Returns whether this OVS version is later to the target OVS version.
* @param tgt taret OVS version
* @return whether this OVS version is later to the target OVS version
*/
public boolean isLaterOf(OvsVersion tgt) {
return (compare(tgt) > 0);
}
/**
* Returns whether this OVS version is later or equal to the target OVS version.
* @param tgt taret OVS version
* @return whether this OVS version is later or equal to the target OVS version
*/
public boolean isLaterOrEqOf(OvsVersion tgt) {
return (compare(tgt) >= 0);
}
@Override
public String toString() {
StringBuilder strbuild = new StringBuilder();
strbuild.append(versionElements[0]);
for (int i = 1; i < depth; i++) {
strbuild.append(".");
strbuild.append(versionElements[i]);
}
return strbuild.toString();
}
}