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 org.jdiameter.api.Avp; import org.jdiameter.api.AvpSet; import org.jdiameter.api.InternalException; import org.jdiameter.api.URI; import org.jdiameter.client.api.parser.DecodeException; import java.net.InetAddress; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.Iterator; import java.util.concurrent.CopyOnWriteArrayList; class AvpSetImpl implements AvpSet { MessageParser parser; CopyOnWriteArrayList<Avp> avps = new CopyOnWriteArrayList<Avp>(); AvpSetImpl(MessageParser parser) { this.parser = parser; } public Avp getAvp(int avpCode) { for (Avp avp : this.avps) { if (avp.getCode() == avpCode) { return avp; } } return null; } public Avp getAvpByIndex(int avpCode) { return this.avps.get(avpCode); } public Avp getAvp(int avpCode, long vendorId) { for (Avp avp : this.avps) { if (avp.getCode() == avpCode) { if (avp.getVendorId() == vendorId) return avp; } } return null; } public AvpSet getAvps(int avpCode) { AvpSet result = new AvpSetImpl(parser); for (Avp avp : this.avps) { if (avp.getCode() == avpCode) { result.addAvp(avp); } } return result; } public AvpSet getAvps(int avpCode, long vendorId) { AvpSet result = new AvpSetImpl(parser); for (Avp avp : this.avps) { if (avp.getCode() == avpCode) { if (avp.getVendorId() == vendorId) result.addAvp(avp); } } return result; } public AvpSet removeAvp(int avpCode) { AvpSet result = new AvpSetImpl(parser); for (Avp avp : this.avps) { if (avp.getCode() == avpCode) { result.addAvp(avp); this.avps.remove(avp); } } return result; } public Avp removeAvpByIndex(int i) { if (i >= this.avps.size()) return null; return this.avps.remove(i); } public Avp[] asArray() { return this.avps.toArray(new Avp[avps.size()]); } public Avp addAvp(int avpCode, long value, boolean asUsigned) { Avp res = new AvpImpl(parser, avpCode, 0, 0, asUsigned ? parser.intU32ToBytes(value):parser.int64ToBytes(value)); this.avps.add(res); return res; } public Avp addAvp(int avpCode, long value, boolean mFlag, boolean pFlag, boolean asUsigned) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags , 0, asUsigned ? parser.intU32ToBytes(value):parser.int64ToBytes(value) ); this.avps.add(res); return res; } public Avp addAvp(int avpCode, long value, long vndId, boolean mFlag, boolean pFlag, boolean asUsigned) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, vndId, asUsigned ? parser.intU32ToBytes(value) : parser.int64ToBytes(value) ); this.avps.add(res); return res; } public void insertAvp(int index, Avp... avps) { this.avps.addAll(index, Arrays.asList(avps)); } public void insertAvp(int index, AvpSet avpSet) { this.avps.addAll(index, Arrays.asList(avpSet.asArray())); } public Avp insertAvp(int index, int avpCode, long value, boolean asUsigned) { Avp res = new AvpImpl(parser, avpCode, 0, 0, asUsigned ? parser.intU32ToBytes(value):parser.int64ToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, long value, boolean mFlag, boolean pFlag, boolean asUsigned) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags , 0, asUsigned ? parser.intU32ToBytes(value):parser.int64ToBytes(value) ); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, long value, long vndId, boolean mFlag, boolean pFlag, boolean asUsigned) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, vndId, asUsigned ? parser.intU32ToBytes(value) : parser.int64ToBytes(value) ); this.avps.add(res); return res; } public AvpSet insertGroupedAvp(int index, int avpCode) { AvpImpl res = new AvpImpl(parser, avpCode, 0, 0, new byte[0] ); res.groupedData = new AvpSetImpl(parser); this.avps.add(index, res); return res.groupedData; } public int size() { return this.avps.size(); } public void addAvp(AvpSet avpSet) { for (Avp a:avpSet) avps.add(a); } public void addAvp(Avp... avps) { for (Avp a : avps) { Avp res = new AvpImpl(parser, a); this.avps.add(res); } } public Avp addAvp(int avpCode, byte[] rawData) { Avp res = new AvpImpl(parser, avpCode, 0, 0, rawData); this.avps.add(res); return res; } public Avp addAvp(int avpCode, byte[] rawData, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags , 0, rawData); this.avps.add(res); return res; } public Avp addAvp(int avpCode, byte[] rawData, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, vndId, rawData); this.avps.add(res); return res; } public Avp addAvp(int avpCode, int value) { Avp res = new AvpImpl(parser, avpCode, 0, 0, parser.int32ToBytes(value)); this.avps.add(res); return res; } public Avp addAvp(int avpCode, int value, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, 0, parser.int32ToBytes(value)); this.avps.add(res); return res; } public Avp addAvp(int avpCode, int value, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, vndId, parser.int32ToBytes(value)); this.avps.add(res); return res; } public Avp addAvp(int avpCode, long value) { Avp res = new AvpImpl(parser, avpCode, 0, 0, parser.int64ToBytes(value) ); this.avps.add(res); return res; } public Avp addAvp(int avpCode, long value, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, 0, parser.int64ToBytes(value) ); this.avps.add(res); return res; } public Avp addAvp(int avpCode, long value, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, vndId, parser.int64ToBytes(value) ); this.avps.add(res); return res; } public Avp addAvp(int avpCode, float value) { Avp res = new AvpImpl(parser, avpCode, 0, 0, parser.float32ToBytes(value)); this.avps.add(res); return res; } public Avp addAvp(int avpCode, float value, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, 0, parser.float32ToBytes(value)); this.avps.add(res); return res; } public Avp addAvp(int avpCode, float value, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, vndId, parser.float32ToBytes(value)); this.avps.add(res); return res; } public Avp addAvp(int avpCode, double value) { Avp res = new AvpImpl(parser, avpCode, 0, 0, parser.float64ToBytes(value)); this.avps.add(res); return res; } public Avp addAvp(int avpCode, double value, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, 0, parser.float64ToBytes(value)); this.avps.add(res); return res; } public Avp addAvp(int avpCode, double value, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, vndId, parser.float64ToBytes(value)); this.avps.add(res); return res; } public Avp addAvp(int avpCode, String value, boolean asOctetString) { try { Avp res = new AvpImpl( parser, avpCode, 0, 0, asOctetString ? parser.octetStringToBytes(value) : parser.utf8StringToBytes(value) ); this.avps.add(res); return res; } catch(Exception e) { throw new IllegalArgumentException(e); } } public Avp addAvp(int avpCode, String value, boolean mFlag, boolean pFlag, boolean asOctetString) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); try { Avp res = new AvpImpl( parser, avpCode, flags, 0, asOctetString ? parser.octetStringToBytes(value) : parser.utf8StringToBytes(value) ); this.avps.add(res); return res; } catch(Exception e) { throw new IllegalArgumentException(e); } } public Avp addAvp(int avpCode, String value, long vndId, boolean mFlag, boolean pFlag, boolean asOctetString) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); try { Avp res = new AvpImpl( parser, avpCode, flags, vndId, asOctetString ? parser.octetStringToBytes(value) : parser.utf8StringToBytes(value) ); this.avps.add(res); return res; } catch(Exception e) { throw new IllegalArgumentException(e); } } public Avp addAvp(int avpCode, URI value) { try { Avp res = new AvpImpl(parser, avpCode, 0, 0, parser.octetStringToBytes(value.toString())); this.avps.add(res); return res; } catch (DecodeException e) { throw new IllegalArgumentException(e); } } public Avp addAvp(int avpCode, URI value, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); try { Avp res = new AvpImpl(parser, avpCode, flags, 0, parser.octetStringToBytes(value.toString())); this.avps.add(res); return res; } catch (DecodeException e) { throw new IllegalArgumentException(e); } } public Avp addAvp(int avpCode, URI value, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); try { Avp res = new AvpImpl(parser, avpCode, flags, vndId, parser.octetStringToBytes(value.toString())); this.avps.add(res); return res; } catch (DecodeException e) { throw new IllegalArgumentException(e); } } public Avp addAvp(int avpCode, InetAddress value) { Avp res = new AvpImpl(parser, avpCode, 0, 0, parser.addressToBytes(value)); this.avps.add(res); return res; } public Avp addAvp(int avpCode, InetAddress value, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, 0, parser.addressToBytes(value)); this.avps.add(res); return res; } public Avp addAvp(int avpCode, InetAddress value, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, vndId, parser.addressToBytes(value)); this.avps.add(res); return res; } public Avp addAvp(int avpCode, Date value) { Avp res = new AvpImpl(parser, avpCode, 0, 0, parser.dateToBytes(value)); this.avps.add(res); return res; } public Avp addAvp(int avpCode, Date value, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, 0, parser.dateToBytes(value)); this.avps.add(res); return res; } public Avp addAvp(int avpCode, Date value, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, vndId, parser.dateToBytes(value)); this.avps.add(res); return res; } public AvpSet addGroupedAvp(int avpCode) { AvpImpl res = new AvpImpl(parser, avpCode, 0, 0, new byte[0] ); res.groupedData = new AvpSetImpl(parser); this.avps.add(res); return res.groupedData; } public AvpSet addGroupedAvp(int avpCode, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); AvpImpl res = new AvpImpl(parser, avpCode, flags, 0, new byte[0] ); res.groupedData = new AvpSetImpl(parser); this.avps.add(res); return res.groupedData; } public AvpSet addGroupedAvp(int avpCode, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); AvpImpl res = new AvpImpl(parser, avpCode, flags, vndId, new byte[0] ); res.groupedData = new AvpSetImpl(parser); this.avps.add(res); return res.groupedData; } public Avp insertAvp(int index, int avpCode, byte[] value) { Avp res = new AvpImpl(parser, avpCode, 0, 0, value); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, byte[] value, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, 0, value); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, byte[] value, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, vndId, value); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, int value) { Avp res = new AvpImpl(parser, avpCode, 0, 0, parser.int32ToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, int value, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, 0, parser.int32ToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, int value, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, vndId, parser.int32ToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, long value) { Avp res = new AvpImpl(parser, avpCode, 0, 0, parser.int64ToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, long value, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, 0, parser.int64ToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, long value, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, vndId, parser.int64ToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, float value) { Avp res = new AvpImpl(parser, avpCode, 0, 0, parser.float32ToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, float value, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, 0, parser.float32ToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, float value, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, vndId, parser.float32ToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, double value) { Avp res = new AvpImpl(parser, avpCode, 0, 0, parser.float64ToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, double value, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, 0, parser.float64ToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, double value, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, vndId, parser.float64ToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, String value, boolean asOctetString) { try { Avp res = new AvpImpl(parser, avpCode, 0, 0, asOctetString ? parser.octetStringToBytes(value) : parser.utf8StringToBytes(value)); this.avps.add(index, res); return res; } catch(Exception e) { throw new IllegalArgumentException(e); } } public Avp insertAvp(int index, int avpCode, String value, boolean mFlag, boolean pFlag, boolean asOctetString) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); try { Avp res = new AvpImpl(parser, avpCode, flags, 0, asOctetString ? parser.octetStringToBytes(value) : parser.utf8StringToBytes(value)); this.avps.add(index, res); return res; } catch(Exception e) { throw new IllegalArgumentException(e); } } public Avp insertAvp(int index, int avpCode, String value, long vndId, boolean mFlag, boolean pFlag, boolean asOctetString) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); try { Avp res = new AvpImpl(parser, avpCode, flags, vndId, asOctetString ? parser.octetStringToBytes(value) : parser.utf8StringToBytes(value)); this.avps.add(index, res); return res; } catch(Exception e) { throw new IllegalArgumentException(e); } } public Avp insertAvp(int index, int avpCode, URI value) { try { Avp res = new AvpImpl(parser, avpCode, 0, 0, parser.octetStringToBytes(value.toString())); this.avps.add(index, res); return res; } catch(Exception e) { throw new IllegalArgumentException(e); } } public Avp insertAvp(int index, int avpCode, URI value, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); try { Avp res = new AvpImpl(parser, avpCode, flags, 0, parser.octetStringToBytes(value.toString())); this.avps.add(index, res); return res; } catch(Exception e) { throw new IllegalArgumentException(e); } } public Avp insertAvp(int index, int avpCode, URI value, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); try { Avp res = new AvpImpl(parser, avpCode, flags, vndId, parser.octetStringToBytes(value.toString())); this.avps.add(index, res); return res; } catch(Exception e) { throw new IllegalArgumentException(e); } } public Avp insertAvp(int index, int avpCode, InetAddress value) { Avp res = new AvpImpl(parser, avpCode, 0, 0, parser.addressToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, InetAddress value, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, 0, parser.addressToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, InetAddress value, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, vndId, parser.addressToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, Date value) { Avp res = new AvpImpl(parser, avpCode, 0, 0, parser.dateToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, Date value, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, 0, parser.dateToBytes(value)); this.avps.add(index, res); return res; } public Avp insertAvp(int index, int avpCode, Date value, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); Avp res = new AvpImpl(parser, avpCode, flags, vndId, parser.dateToBytes(value)); this.avps.add(index, res); return res; } public AvpSet insertGroupedAvp(int index, int avpCode, boolean mFlag, boolean pFlag) { int flags = ((mFlag ? 0x40:0) | (pFlag ? 0x20:0)); AvpImpl res = new AvpImpl(parser, avpCode, flags, 0, new byte[0] ); res.groupedData = new AvpSetImpl(parser); this.avps.add(index, res); return res.groupedData; } public AvpSet insertGroupedAvp(int index, int avpCode, long vndId, boolean mFlag, boolean pFlag) { int flags = ((vndId !=0 ? 0x80:0) | (mFlag ? 0x40:0) | (pFlag ? 0x20:0)); AvpImpl res = new AvpImpl(parser, avpCode, flags, vndId, new byte[0] ); res.groupedData = new AvpSetImpl(parser); this.avps.add(index, res); return res.groupedData; } public boolean isWrapperFor(Class<?> aClass) throws InternalException { return false; } public <T> T unwrap(Class<T> aClass) throws InternalException { return null; } public Iterator<Avp> iterator() { return Collections.unmodifiableList(this.avps).iterator(); } }