/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.core.util;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class VersionRange {
public static final String VERSION_RANGE = "([\\[(])([^,\\[\\]()]*),([^,\\[\\]()]*)([\\])])";
public static final String LOWER_BOUND_INCLUSIVE = "[";
public static final String LOWER_BOUND_EXCLUSIVE = "(";
public static final String UPPER_BOUND_INCLUSIVE = "]";
public static final String UPPER_BOUND_EXCLUSIVE = ")";
/**
* pattern for extracting a ranges of versions. example: [1.5.0_11,1.6),[1.6.0_15,1.7),[1.7.0,] G1: [1.5.0_11,1.6) G2: [ G3:
* 1.5.0_11 G4: 1.6 G5: ) G6: [1.6.0_15,1.7),[1.7.0,]
*/
public static final Pattern VERSION_RANGES = Pattern.compile("(" + VERSION_RANGE + "),?");
public static final Pattern VALID_VERSION_RANGES = Pattern.compile("^(?:" + VERSION_RANGE + ",?)+$");
public static List<VersionRange> createVersionRanges(String versionsString) {
if (!VALID_VERSION_RANGES.matcher(versionsString).matches()) {
throw new IllegalArgumentException("Version range doesn't match pattern: " + VALID_VERSION_RANGES.pattern());
}
List<VersionRange> versions = new ArrayList<VersionRange>();
Matcher m = VERSION_RANGES.matcher(versionsString);
while (m.find()) {
versions.add(new VersionRange(m.group(1)));
}
return versions;
}
private boolean isLowerBoundInclusive = false;
private boolean isUpperBoundInclusive = false;
private String lowerVersion;
private String upperVersion;
public VersionRange(String versionRange) {
Matcher m = VERSION_RANGES.matcher(versionRange);
if (!m.matches()) {
throw new IllegalArgumentException("Version range doesn't match pattern: " + VERSION_RANGES.pattern());
}
if (LOWER_BOUND_INCLUSIVE.equals(m.group(2))) {
isLowerBoundInclusive = true;
}
if (UPPER_BOUND_INCLUSIVE.equals(m.group(5))) {
isUpperBoundInclusive = true;
}
lowerVersion = m.group(3);
upperVersion = m.group(4);
}
public String getLowerVersion() {
return lowerVersion;
}
public String getUpperVersion() {
return upperVersion;
}
public boolean isLowerBoundInclusive() {
return isLowerBoundInclusive;
}
public boolean isUpperBoundInclusive() {
return isUpperBoundInclusive;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(isLowerBoundInclusive() ? LOWER_BOUND_INCLUSIVE : LOWER_BOUND_EXCLUSIVE);
sb.append(getLowerVersion());
sb.append(",");
sb.append(getUpperVersion());
sb.append(isUpperBoundInclusive() ? UPPER_BOUND_INCLUSIVE : UPPER_BOUND_EXCLUSIVE);
return sb.toString();
}
}