package org.jdiameter.client.impl.parser;
/*
* Copyright (c) 2006 jDiameter.
* https://jdiameter.dev.java.net/
*
* License: GPL v3
*
* e-mail: erick.svenson@yahoo.com
*
*/
import java.net.InetAddress;
import java.net.URISyntaxException;
import java.net.UnknownServiceException;
import java.util.Date;
import org.jdiameter.api.Avp;
import org.jdiameter.api.AvpDataException;
import org.jdiameter.api.AvpSet;
import org.jdiameter.api.InternalException;
import org.jdiameter.api.URI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
class AvpImpl implements Avp {
private static final long serialVersionUID = 1L;
final MessageParser parser;
int avpCode;
long vendorID;
boolean isMandatory = false;
boolean isEncrypted = false;
boolean isVendorSpecific = false;
byte [] rawData = new byte[0];
AvpSet groupedData;
protected Logger logger = LoggerFactory.getLogger(AvpImpl.class);
AvpImpl(MessageParser messageParser, int code, int flags, long vnd, byte[] data) {
parser = messageParser;
avpCode = code;
//
isMandatory = (flags & 0x40) != 0;
isEncrypted = (flags & 0x20) != 0;
isVendorSpecific = (flags & 0x80) != 0;
//
vendorID = vnd;
rawData = data;
}
AvpImpl(MessageParser messageParser, Avp avp) {
parser = messageParser;
avpCode = avp.getCode();
vendorID = avp.getVendorId();
isMandatory = avp.isMandatory();
isEncrypted = avp.isEncrypted();
isVendorSpecific = avp.isVendorId();
try {
rawData = avp.getRaw();
if (rawData == null || rawData.length == 0) {
groupedData = avp.getGrouped();
}
}
catch (AvpDataException e) {
logger.debug("Can not create Avp", e);
}
}
public AvpImpl(MessageParser messageParser, int newCode, Avp avp) {
this(messageParser, avp);
avpCode = newCode;
}
public int getCode() {
return avpCode;
}
public boolean isVendorId() {
return isVendorSpecific;
}
public boolean isMandatory() {
return isMandatory;
}
public boolean isEncrypted() {
return isEncrypted;
}
public long getVendorId() {
return vendorID;
}
public byte[] getRaw() throws AvpDataException {
return rawData;
}
public String getOctetString() throws AvpDataException {
return parser.bytesToOctetString(rawData);
}
public String getUTF8String() throws AvpDataException {
return parser.bytesToUtf8String(rawData);
}
public int getInteger32() throws AvpDataException {
return parser.bytesToInt(rawData);
}
public long getInteger64() throws AvpDataException {
return parser.bytesToLong(rawData);
}
public long getUnsigned32() throws AvpDataException {
return parser.bytesToInt(rawData);
}
public long getUnsigned64() throws AvpDataException {
return parser.bytesToLong(rawData);
}
public float getFloat32() throws AvpDataException {
return parser.bytesToFloat(rawData);
}
public double getFloat64() throws AvpDataException {
return parser.bytesToDouble(rawData);
}
public InetAddress getAddress() throws AvpDataException {
return parser.bytesToAddress(rawData);
}
public Date getTime() throws AvpDataException {
return parser.bytesToDate(rawData);
}
public String getDiameterIdentity() throws AvpDataException {
return getOctetString();
}
public URI getDiameterURI() throws AvpDataException {
try {
return new URI(getOctetString());
}
catch (URISyntaxException e) {
throw new AvpDataException(e);
}
catch (UnknownServiceException e) {
throw new AvpDataException(e);
}
}
public AvpSet getGrouped() throws AvpDataException {
try {
if (groupedData == null) {
groupedData = parser.decodeAvpSet(rawData);
rawData = new byte[0];
}
return groupedData;
}
catch (Exception e) {
throw new AvpDataException(e);
}
}
public boolean isWrapperFor(Class<?> aClass) throws InternalException {
return false;
}
public <T> T unwrap(Class<T> aClass) throws InternalException {
return null;
}
public byte[] getRawData() {
return (rawData == null || rawData.length == 0) ? parser.encodeAvpSet(groupedData) : rawData;
}
}