package aQute.bnd.version;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MavenVersionRange {
static final Pattern RESTRICTION_P = Pattern.compile(""
+ "\\s*(" //
+ "(" //
+ "(?<li>\\[|\\()\\s*" //
+ "(?<low>[^,\\s\\]\\[()]*)\\s*" //
+ ",\\s*" //
+ "(?<high>[^,\\s\\[\\]()]*)\\s*" //
+ "(?<hi>\\]|\\))" //
+ ")" //
+ "|" //
+ "(?<single>[^,\\s\\]\\[()]+)" //
+ ")\\s*" //
+ "(?<comma>,)?\\s*", Pattern.COMMENTS);
final boolean li;
final boolean hi;
final MavenVersion low;
final MavenVersion high;
MavenVersionRange nextOr;
public MavenVersionRange(String range) {
this(RESTRICTION_P.matcher(range == null ? "0" : range));
}
private MavenVersionRange(Matcher m) {
if (!m.lookingAt())
throw new IllegalArgumentException("Invalid version range " + m);
String single = m.group("single");
if (single != null) {
li = true;
low = new MavenVersion(single);
high = MavenVersion.HIGHEST;
hi = true;
} else {
li = m.group("li").equals("[");
hi = m.group("hi").equals("]");
low = MavenVersion.parseMavenString(m.group("low"));
high = MavenVersion.parseMavenString(m.group("high"));
}
if (m.group("comma") != null) {
m.region(m.end(), m.regionEnd());
nextOr = new MavenVersionRange(m);
} else
nextOr = null;
}
public boolean includes(MavenVersion mvr) {
int l = mvr.compareTo(low);
int h = mvr.compareTo(high);
boolean lowOk = l > 0 || (li && l == 0);
boolean highOk = h < 0 || (hi && h == 0);
if (lowOk && highOk)
return true;
if (nextOr != null)
return nextOr.includes(mvr);
return false;
}
public String toString() {
StringBuilder sb = new StringBuilder();
toString(sb);
return sb.toString();
}
private void toString(StringBuilder sb) {
if (li)
sb.append("[");
else
sb.append("(");
sb.append(low);
sb.append(",");
sb.append(high);
if (hi)
sb.append("]");
else
sb.append(")");
if (nextOr != null) {
sb.append(",");
nextOr.toString(sb);
}
}
public static MavenVersionRange parseRange(String version) {
try {
return new MavenVersionRange(version);
} catch (Exception e) {
// ignore
}
return null;
}
public boolean wasSingle() {
return (li && !hi && high == MavenVersion.HIGHEST && nextOr == null);
}
public static boolean isRange(String version) {
if (version == null)
return false;
version = version.trim();
return version.startsWith("[") || version.startsWith("(");
}
}