package org.batfish.datamodel;
import java.math.BigInteger;
import org.batfish.common.BatfishException;
import org.batfish.common.Pair;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
public class Prefix6Range extends Pair<Prefix6, SubRange> {
/**
*
*/
private static final long serialVersionUID = 1L;
public static Prefix6Range fromPrefix6(Prefix6 prefix6) {
int prefix6Length = prefix6.getPrefixLength();
return new Prefix6Range(prefix6,
new SubRange(prefix6Length, prefix6Length));
}
private static SubRange lengthRangeFromStr(String str) {
Prefix6 prefix6;
String[] mainParts = str.split(";");
int numMainParts = mainParts.length;
if (numMainParts < 1 || numMainParts > 2) {
throw new BatfishException(
"Invalid Prefix6Range string: '" + str + "'");
}
else {
prefix6 = new Prefix6(mainParts[0]);
if (mainParts.length == 1) {
int prefix6Length = prefix6.getPrefixLength();
return new SubRange(prefix6Length, prefix6Length);
}
else {
return new SubRange(mainParts[1]);
}
}
}
private static Prefix6 prefix6FromStr(String str) {
Prefix6 prefix6;
String[] mainParts = str.split(";");
int numMainParts = mainParts.length;
if (numMainParts < 1 || numMainParts > 2) {
throw new BatfishException(
"Invalid Prefix6Range string: '" + str + "'");
}
else {
prefix6 = new Prefix6(mainParts[0]);
return prefix6;
}
}
public Prefix6Range(Prefix6 prefix6, SubRange lengthRange) {
super(prefix6, lengthRange);
}
@JsonCreator
public Prefix6Range(String str) {
super(prefix6FromStr(str), lengthRangeFromStr(str));
}
public SubRange getLengthRange() {
return _second;
}
public Prefix6 getPrefix6() {
return _first;
}
public boolean includesPrefix6(Prefix6 argPrefix6) {
Prefix6 prefix6 = getPrefix6();
SubRange lengthRange = getLengthRange();
int prefixLength = prefix6.getPrefixLength();
int minPrefixLength = lengthRange.getStart();
int maxPrefixLength = lengthRange.getEnd();
int argPrefixLength = argPrefix6.getPrefixLength();
if (minPrefixLength > argPrefixLength
|| maxPrefixLength < argPrefixLength) {
return false;
}
BigInteger maskedPrefixAsBigInteger = prefix6.getAddress()
.getNetworkAddress(prefixLength).asBigInteger();
BigInteger argMaskedPrefixAsBigInteger = argPrefix6.getAddress()
.getNetworkAddress(prefixLength).asBigInteger();
return maskedPrefixAsBigInteger.equals(argMaskedPrefixAsBigInteger);
}
public boolean includesPrefix6Range(Prefix6Range argPrefixRange) {
Prefix6 prefix6 = getPrefix6();
SubRange lengthRange = getLengthRange();
int prefixLength = prefix6.getPrefixLength();
BigInteger maskedPrefixAsBigInteger = prefix6.getAddress()
.getNetworkAddress(prefixLength).asBigInteger();
Prefix6 argPrefix = argPrefixRange.getPrefix6();
SubRange argLengthRange = argPrefixRange.getLengthRange();
BigInteger argMaskedPrefixAsBigInteger = argPrefix.getAddress()
.getNetworkAddress(prefixLength).asBigInteger();
return maskedPrefixAsBigInteger.equals(argMaskedPrefixAsBigInteger)
&& 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;
}
}
}