package org.batfish.datamodel; import java.io.Serializable; import java.math.BigInteger; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; public final class IsoAddress implements Serializable { /** * */ private static final long serialVersionUID = 1L; private final byte _afi; private final BigInteger _areaId; private final byte _nSel; private final String _str; private final long _systemId; @JsonCreator public IsoAddress(String isoAddressStr) { _str = isoAddressStr; String[] parts = isoAddressStr.split("\\."); int areaEndOffset = parts.length - 5; BigInteger areaId = BigInteger.ZERO; for (int i = areaEndOffset, shift = 0; i >= 1; i--) { int currentIntVal = Integer.parseInt(parts[i], 16); int currentNumBits = parts[i].length() * 4; areaId = areaId .add(BigInteger.valueOf(currentIntVal).shiftLeft(shift)); shift += currentNumBits; } long systemId = 0l; for (int i = parts.length - 2, shift = 0; i >= parts.length - 4; i--) { long currentLongVal = Long.parseLong(parts[i], 16); int currentNumBits = parts[i].length() * 4; systemId += (currentLongVal << shift); shift += currentNumBits; } _systemId = systemId; _afi = Byte.parseByte(parts[0], 16); _areaId = areaId; _nSel = Byte.parseByte(parts[parts.length - 1], 16); } @Override public boolean equals(Object obj) { if (this == obj) { return true; } IsoAddress other = (IsoAddress) obj; if (_afi != other._afi) { return false; } if (!_areaId.equals(other._areaId)) { return false; } if (_nSel != other._nSel) { return false; } if (_systemId != other._systemId) { return false; } return true; } public byte getAfi() { return _afi; } public BigInteger getAreaId() { return _areaId; } public String getAreaIdStr() { String areaIdStr = _areaId.toString(16); int leadingZeros = (4 - (areaIdStr.length() % 4) % 4); for (int i = 0; i < leadingZeros; i++) { areaIdStr = "0" + areaIdStr; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < areaIdStr.length(); i += 4) { String currentPart = areaIdStr.substring(i, i + 4); sb.append(currentPart + "."); } String ret = sb.substring(0, sb.length() - 1); return ret; } public byte getNSelector() { return _nSel; } public long getSystemId() { return _systemId; } public String getSystemIdStr() { String systemIdStr = Long.toHexString(_systemId); int leadingZeros = 12 - systemIdStr.length(); for (int i = 0; i < leadingZeros; i++) { systemIdStr = "0" + systemIdStr; } String[] parts = new String[3]; parts[0] = systemIdStr.substring(0, 4); parts[1] = systemIdStr.substring(4, 8); parts[2] = systemIdStr.substring(8, 12); return parts[0] + "." + parts[1] + "." + parts[2]; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + _afi; result = prime * result + _areaId.hashCode(); result = prime * result + _nSel; result = prime * result + (int) (_systemId ^ (_systemId >>> 32)); return result; } @Override @JsonValue public String toString() { return _str; } }