package org.batfish.datamodel;
import org.batfish.common.BatfishException;
import org.batfish.common.Pair;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
public class PrefixRange extends Pair<Prefix, SubRange> {
/**
*
*/
private static final long serialVersionUID = 1L;
public static PrefixRange fromPrefix(Prefix prefix) {
int prefixLength = prefix.getPrefixLength();
return new PrefixRange(prefix, new SubRange(prefixLength, prefixLength));
}
private static SubRange lengthRangeFromStr(String str) {
Prefix prefix;
String[] mainParts = str.split(":");
int numMainParts = mainParts.length;
if (numMainParts < 1 || numMainParts > 2) {
throw new BatfishException(
"Invalid PrefixRange string: '" + str + "'");
}
else {
prefix = new Prefix(mainParts[0]);
if (mainParts.length == 1) {
int prefixLength = prefix.getPrefixLength();
return new SubRange(prefixLength, prefixLength);
}
else {
return new SubRange(mainParts[1]);
}
}
}
private static Prefix prefixFromStr(String str) {
Prefix prefix;
String[] mainParts = str.split(":");
int numMainParts = mainParts.length;
if (numMainParts < 1 || numMainParts > 2) {
throw new BatfishException(
"Invalid PrefixRange string: '" + str + "'");
}
else {
prefix = new Prefix(mainParts[0]);
return prefix;
}
}
public PrefixRange(Prefix prefix, SubRange lengthRange) {
super(prefix, lengthRange);
}
@JsonCreator
public PrefixRange(String str) {
super(prefixFromStr(str), lengthRangeFromStr(str));
}
public SubRange getLengthRange() {
return _second;
}
public Prefix getPrefix() {
return _first;
}
public boolean includesPrefix(Prefix argPrefix) {
Prefix prefix = getPrefix();
SubRange lengthRange = getLengthRange();
int prefixLength = prefix.getPrefixLength();
int minPrefixLength = lengthRange.getStart();
int maxPrefixLength = lengthRange.getEnd();
int argPrefixLength = argPrefix.getPrefixLength();
if (minPrefixLength > argPrefixLength
|| maxPrefixLength < argPrefixLength) {
return false;
}
long maskedPrefixAsLong = prefix.getAddress()
.getNetworkAddress(prefixLength).asLong();
long argMaskedPrefixAsLong = argPrefix.getAddress()
.getNetworkAddress(prefixLength).asLong();
return maskedPrefixAsLong == argMaskedPrefixAsLong;
}
public boolean includesPrefixRange(PrefixRange argPrefixRange) {
Prefix prefix = getPrefix();
SubRange lengthRange = getLengthRange();
int prefixLength = prefix.getPrefixLength();
long maskedPrefixAsLong = prefix.getAddress()
.getNetworkAddress(prefixLength).asLong();
Prefix argPrefix = argPrefixRange.getPrefix();
SubRange argLengthRange = argPrefixRange.getLengthRange();
long argMaskedPrefixAsLong = argPrefix.getAddress()
.getNetworkAddress(prefixLength).asLong();
return maskedPrefixAsLong == argMaskedPrefixAsLong
&& lengthRange.getStart() <= argLengthRange.getStart()
&& lengthRange.getEnd() >= argLengthRange.getEnd();
}
@Override
@JsonValue
public String toString() {
int prefixLength = _first.getPrefixLength();
int low = _second.getStart();
int high = _second.getEnd();
if (prefixLength == low && prefixLength == high) {
return _first.toString();
}
else {
return _first.toString() + ":" + low + "-" + high;
}
}
}