/*
* TeleStax, Open Source Cloud Communications
* Copyright 2011-2016, TeleStax Inc. and individual contributors
* by the @authors tag.
*
* This program is free software: you can redistribute it and/or modify
* under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation; either version 3 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
* This file incorporates work covered by the following copyright and
* permission notice:
*
* JBoss, Home of Professional Open Source
* Copyright 2007-2011, Red Hat, Inc. and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jdiameter.client.impl.parser;
/*
* https://jdiameter.dev.java.net/
*
* License: GPL v3
*
* e-mail: erick.svenson@yahoo.com
*
*/
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
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.ParseException;
/**
*
* @author erick.svenson@yahoo.com
* @author <a href="mailto:brainslog@gmail.com"> Alexandre Mendonca </a>
* @author <a href="mailto:baranowb@gmail.com"> Bartosz Baranowski </a>
* @author <a href="mailto:grzegorz.figiel@pro-ids.com"> Grzegorz Figiel [ProIDS] </a>
*/
class AvpSetImpl implements AvpSet {
// FIXME: by default 3588.4-1 says: 'M' should be set to true;
// FIXME: by default 3588.x says: if grouped has at least on AVP with 'M' set, it also has to have 'M' set! - TODO: add backmapping.
private static final long serialVersionUID = 1L;
private static final ElementParser parser = new ElementParser();
List<Avp> avps = new ArrayList<Avp>();
AvpSetImpl() {
}
@Override
public Avp getAvp(int avpCode) {
for (Avp avp : this.avps) {
if (avp.getCode() == avpCode) {
return avp;
}
}
return null;
}
@Override
public Avp getAvpByIndex(int avpIndex) {
return this.avps.get(avpIndex);
}
@Override
public Avp getAvp(int avpCode, long vendorId) {
for (Avp avp : this.avps) {
if (avp.getCode() == avpCode && avp.getVendorId() == vendorId) {
return avp;
}
}
return null;
}
@Override
public AvpSet getAvps(int avpCode) {
AvpSet result = new AvpSetImpl();
for (Avp avp : this.avps) {
if (avp.getCode() == avpCode) {
result.addAvp(avp);
}
}
return result;
}
@Override
public AvpSet getAvps(int avpCode, long vendorId) {
AvpSet result = new AvpSetImpl();
for (Avp avp : this.avps) {
if (avp.getCode() == avpCode && avp.getVendorId() == vendorId) {
result.addAvp(avp);
}
}
return result;
}
@Override
public int getAvpIndex(int avpCode) {
for (Avp avp : this.avps) {
if (avp.getCode() == avpCode) {
return this.avps.indexOf(avp);
}
}
return -1;
}
@Override
public int getAvpIndex(int avpCode, long vendorId) {
for (Avp avp : this.avps) {
if (avp.getCode() == avpCode && avp.getVendorId() == vendorId) {
return this.avps.indexOf(avp);
}
}
return -1;
}
@Override
public AvpSet removeAvp(int avpCode) {
return removeAvp(avpCode, 0);
}
@Override
public AvpSet removeAvp(int avpCode, long vendorId) {
AvpSet result = new AvpSetImpl();
// for (Avp avp : this.avps) {
// if (avp.getCode() == avpCode) {
// result.addAvp(avp);
// this.avps.remove(avp);
// }
// }
Iterator<Avp> it = this.avps.iterator();
while (it.hasNext()) {
Avp avp = it.next();
if (avp.getCode() == avpCode && avp.getVendorId() == vendorId) {
result.addAvp(avp);
it.remove();
}
}
return result;
}
@Override
public Avp removeAvpByIndex(int i) {
return (i >= this.avps.size()) ? null : this.avps.remove(i);
}
@Override
public Avp[] asArray() {
return this.avps.toArray(new Avp[avps.size()]);
}
@Override
public Avp addAvp(int avpCode, long value, boolean asUnsigned) {
Avp res = new AvpImpl(avpCode, 0, 0, asUnsigned ? parser.intU32ToBytes(value) : parser.int64ToBytes(value));
this.avps.add(res);
return res;
}
@Override
public Avp addAvp(int avpCode, long value, boolean mFlag, boolean pFlag, boolean asUnsigned) {
int flags = ((mFlag ? 0x40 : 0) | (pFlag ? 0x20 : 0));
Avp res = new AvpImpl(avpCode, flags , 0, asUnsigned ? parser.intU32ToBytes(value) : parser.int64ToBytes(value));
this.avps.add(res);
return res;
}
@Override
public Avp addAvp(int avpCode, long value, long vndId, boolean mFlag, boolean pFlag, boolean asUnsigned) {
int flags = ((vndId != 0 ? 0x80 : 0) | (mFlag ? 0x40 : 0) | (pFlag ? 0x20 : 0));
Avp res = new AvpImpl(avpCode, flags, vndId, asUnsigned ? parser.intU32ToBytes(value) : parser.int64ToBytes(value));
this.avps.add(res);
return res;
}
@Override
public void insertAvp(int index, Avp... avps) {
this.avps.addAll(index, Arrays.asList(avps));
}
@Override
public void insertAvp(int index, AvpSet avpSet) {
this.avps.addAll(index, Arrays.asList(avpSet.asArray()));
}
@Override
public Avp insertAvp(int index, int avpCode, long value, boolean asUnsigned) {
Avp res = new AvpImpl(avpCode, 0, 0, asUnsigned ? parser.intU32ToBytes(value) : parser.int64ToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
public Avp insertAvp(int index, int avpCode, long value, boolean mFlag, boolean pFlag, boolean asUnsigned) {
int flags = ((mFlag ? 0x40 : 0) | (pFlag ? 0x20 : 0));
Avp res = new AvpImpl(avpCode, flags , 0, asUnsigned ? parser.intU32ToBytes(value) : parser.int64ToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
public Avp insertAvp(int index, int avpCode, long value, long vndId, boolean mFlag, boolean pFlag, boolean asUnsigned) {
int flags = ((vndId != 0 ? 0x80 : 0) | (mFlag ? 0x40 : 0) | (pFlag ? 0x20 : 0));
Avp res = new AvpImpl(avpCode, flags, vndId, asUnsigned ? parser.intU32ToBytes(value) : parser.int64ToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
public AvpSet insertGroupedAvp(int index, int avpCode) {
AvpImpl res = new AvpImpl(avpCode, 0, 0, new byte[0]);
res.groupedData = new AvpSetImpl();
this.avps.add(index, res);
return res.groupedData;
}
@Override
public int size() {
return this.avps.size();
}
@Override
public void addAvp(AvpSet avpSet) {
for (Avp a:avpSet) {
avps.add(a);
}
}
@Override
public void addAvp(Avp... avps) {
for (Avp a : avps) {
// No need to clone AVP, right?
// Avp res = new AvpImpl(a);
if (a != null) {
this.avps.add(a);
}
}
}
@Override
public Avp addAvp(int avpCode, byte[] rawData) {
Avp res = new AvpImpl(avpCode, 0, 0, rawData);
this.avps.add(res);
return res;
}
@Override
public Avp addAvp(int avpCode, byte[] rawData, boolean mFlag, boolean pFlag) {
int flags = ((mFlag ? 0x40 : 0) | (pFlag ? 0x20 : 0));
Avp res = new AvpImpl(avpCode, flags , 0, rawData);
this.avps.add(res);
return res;
}
@Override
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(avpCode, flags, vndId, rawData);
this.avps.add(res);
return res;
}
@Override
public Avp addAvp(int avpCode, int value) {
Avp res = new AvpImpl(avpCode, 0, 0, parser.int32ToBytes(value));
this.avps.add(res);
return res;
}
@Override
public Avp addAvp(int avpCode, int value, boolean mFlag, boolean pFlag) {
int flags = ((mFlag ? 0x40 : 0) | (pFlag ? 0x20 : 0));
Avp res = new AvpImpl(avpCode, flags, 0, parser.int32ToBytes(value));
this.avps.add(res);
return res;
}
@Override
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(avpCode, flags, vndId, parser.int32ToBytes(value));
this.avps.add(res);
return res;
}
@Override
public Avp addAvp(int avpCode, long value) {
Avp res = new AvpImpl(avpCode, 0, 0, parser.int64ToBytes(value) );
this.avps.add(res);
return res;
}
@Override
public Avp addAvp(int avpCode, long value, boolean mFlag, boolean pFlag) {
int flags = ((mFlag ? 0x40 : 0) | (pFlag ? 0x20 : 0));
Avp res = new AvpImpl(avpCode, flags, 0, parser.int64ToBytes(value) );
this.avps.add(res);
return res;
}
@Override
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(avpCode, flags, vndId, parser.int64ToBytes(value) );
this.avps.add(res);
return res;
}
@Override
public Avp addAvp(int avpCode, float value) {
Avp res = new AvpImpl(avpCode, 0, 0, parser.float32ToBytes(value));
this.avps.add(res);
return res;
}
@Override
public Avp addAvp(int avpCode, float value, boolean mFlag, boolean pFlag) {
int flags = ((mFlag ? 0x40 : 0) | (pFlag ? 0x20 : 0));
Avp res = new AvpImpl(avpCode, flags, 0, parser.float32ToBytes(value));
this.avps.add(res);
return res;
}
@Override
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(avpCode, flags, vndId, parser.float32ToBytes(value));
this.avps.add(res);
return res;
}
@Override
public Avp addAvp(int avpCode, double value) {
Avp res = new AvpImpl(avpCode, 0, 0, parser.float64ToBytes(value));
this.avps.add(res);
return res;
}
@Override
public Avp addAvp(int avpCode, double value, boolean mFlag, boolean pFlag) {
int flags = ((mFlag ? 0x40 : 0) | (pFlag ? 0x20 : 0));
Avp res = new AvpImpl(avpCode, flags, 0, parser.float64ToBytes(value));
this.avps.add(res);
return res;
}
@Override
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(avpCode, flags, vndId, parser.float64ToBytes(value));
this.avps.add(res);
return res;
}
@Override
public Avp addAvp(int avpCode, String value, boolean asOctetString) {
try {
Avp res = new AvpImpl(avpCode, 0, 0, asOctetString ? parser.octetStringToBytes(value) : parser.utf8StringToBytes(value)
);
this.avps.add(res);
return res;
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
@Override
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(avpCode, flags, 0, asOctetString ? parser.octetStringToBytes(value) : parser.utf8StringToBytes(value)
);
this.avps.add(res);
return res;
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
@Override
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(avpCode, flags, vndId, asOctetString ? parser.octetStringToBytes(value) : parser.utf8StringToBytes(value)
);
this.avps.add(res);
return res;
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
@Override
public Avp addAvp(int avpCode, URI value) {
try {
Avp res = new AvpImpl(avpCode, 0, 0, parser.octetStringToBytes(value.toString()));
this.avps.add(res);
return res;
} catch (ParseException e) {
throw new IllegalArgumentException(e);
}
}
@Override
public Avp addAvp(int avpCode, URI value, boolean mFlag, boolean pFlag) {
int flags = ((mFlag ? 0x40 : 0) | (pFlag ? 0x20 : 0));
try {
Avp res = new AvpImpl(avpCode, flags, 0, parser.octetStringToBytes(value.toString()));
this.avps.add(res);
return res;
} catch (ParseException e) {
throw new IllegalArgumentException(e);
}
}
@Override
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(avpCode, flags, vndId, parser.octetStringToBytes(value.toString()));
this.avps.add(res);
return res;
} catch (ParseException e) {
throw new IllegalArgumentException(e);
}
}
@Override
public Avp addAvp(int avpCode, InetAddress value) {
Avp res = new AvpImpl(avpCode, 0, 0, parser.addressToBytes(value));
this.avps.add(res);
return res;
}
@Override
public Avp addAvp(int avpCode, InetAddress value, boolean mFlag, boolean pFlag) {
int flags = ((mFlag ? 0x40 : 0) | (pFlag ? 0x20 : 0));
Avp res = new AvpImpl(avpCode, flags, 0, parser.addressToBytes(value));
this.avps.add(res);
return res;
}
@Override
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(avpCode, flags, vndId, parser.addressToBytes(value));
this.avps.add(res);
return res;
}
@Override
public Avp addAvp(int avpCode, Date value) {
Avp res = new AvpImpl(avpCode, 0, 0, parser.dateToBytes(value));
this.avps.add(res);
return res;
}
@Override
public Avp addAvp(int avpCode, Date value, boolean mFlag, boolean pFlag) {
int flags = ((mFlag ? 0x40 : 0) | (pFlag ? 0x20 : 0));
Avp res = new AvpImpl(avpCode, flags, 0, parser.dateToBytes(value));
this.avps.add(res);
return res;
}
@Override
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(avpCode, flags, vndId, parser.dateToBytes(value));
this.avps.add(res);
return res;
}
@Override
public AvpSet addGroupedAvp(int avpCode) {
AvpImpl res = new AvpImpl(avpCode, 0, 0, new byte[0] );
res.groupedData = new AvpSetImpl();
this.avps.add(res);
return res.groupedData;
}
@Override
public AvpSet addGroupedAvp(int avpCode, boolean mFlag, boolean pFlag) {
int flags = ((mFlag ? 0x40 : 0) | (pFlag ? 0x20 : 0));
AvpImpl res = new AvpImpl(avpCode, flags, 0, new byte[0] );
res.groupedData = new AvpSetImpl();
this.avps.add(res);
return res.groupedData;
}
@Override
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(avpCode, flags, vndId, new byte[0] );
res.groupedData = new AvpSetImpl();
this.avps.add(res);
return res.groupedData;
}
@Override
public Avp insertAvp(int index, int avpCode, byte[] value) {
Avp res = new AvpImpl(avpCode, 0, 0, value);
this.avps.add(index, res);
return res;
}
@Override
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(avpCode, flags, 0, value);
this.avps.add(index, res);
return res;
}
@Override
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(avpCode, flags, vndId, value);
this.avps.add(index, res);
return res;
}
@Override
public Avp insertAvp(int index, int avpCode, int value) {
Avp res = new AvpImpl(avpCode, 0, 0, parser.int32ToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
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(avpCode, flags, 0, parser.int32ToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
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(avpCode, flags, vndId, parser.int32ToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
public Avp insertAvp(int index, int avpCode, long value) {
Avp res = new AvpImpl(avpCode, 0, 0, parser.int64ToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
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(avpCode, flags, 0, parser.int64ToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
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(avpCode, flags, vndId, parser.int64ToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
public Avp insertAvp(int index, int avpCode, float value) {
Avp res = new AvpImpl(avpCode, 0, 0, parser.float32ToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
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(avpCode, flags, 0, parser.float32ToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
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(avpCode, flags, vndId, parser.float32ToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
public Avp insertAvp(int index, int avpCode, double value) {
Avp res = new AvpImpl(avpCode, 0, 0, parser.float64ToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
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(avpCode, flags, 0, parser.float64ToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
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(avpCode, flags, vndId, parser.float64ToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
public Avp insertAvp(int index, int avpCode, String value, boolean asOctetString) {
try {
Avp res = new AvpImpl(avpCode, 0, 0, asOctetString ? parser.octetStringToBytes(value) :
parser.utf8StringToBytes(value));
this.avps.add(index, res);
return res;
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
@Override
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(avpCode, flags, 0, asOctetString ? parser.octetStringToBytes(value) :
parser.utf8StringToBytes(value));
this.avps.add(index, res);
return res;
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
@Override
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(avpCode, flags, vndId, asOctetString ? parser.octetStringToBytes(value) :
parser.utf8StringToBytes(value));
this.avps.add(index, res);
return res;
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
@Override
public Avp insertAvp(int index, int avpCode, URI value) {
try {
Avp res = new AvpImpl(avpCode, 0, 0, parser.octetStringToBytes(value.toString()));
this.avps.add(index, res);
return res;
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
@Override
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(avpCode, flags, 0, parser.octetStringToBytes(value.toString()));
this.avps.add(index, res);
return res;
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
@Override
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(avpCode, flags, vndId, parser.octetStringToBytes(value.toString()));
this.avps.add(index, res);
return res;
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
@Override
public Avp insertAvp(int index, int avpCode, InetAddress value) {
Avp res = new AvpImpl(avpCode, 0, 0, parser.addressToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
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(avpCode, flags, 0, parser.addressToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
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(avpCode, flags, vndId, parser.addressToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
public Avp insertAvp(int index, int avpCode, Date value) {
Avp res = new AvpImpl(avpCode, 0, 0, parser.dateToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
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(avpCode, flags, 0, parser.dateToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
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(avpCode, flags, vndId, parser.dateToBytes(value));
this.avps.add(index, res);
return res;
}
@Override
public AvpSet insertGroupedAvp(int index, int avpCode, boolean mFlag, boolean pFlag) {
int flags = ((mFlag ? 0x40 : 0) | (pFlag ? 0x20 : 0));
AvpImpl res = new AvpImpl(avpCode, flags, 0, new byte[0] );
res.groupedData = new AvpSetImpl();
this.avps.add(index, res);
return res.groupedData;
}
@Override
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(avpCode, flags, vndId, new byte[0] );
res.groupedData = new AvpSetImpl();
this.avps.add(index, res);
return res.groupedData;
}
@Override
public boolean isWrapperFor(Class<?> aClass) throws InternalException {
return false;
}
@Override
public <T> T unwrap(Class<T> aClass) throws InternalException {
return null;
}
@Override
public Iterator<Avp> iterator() {
// Iterator contract demands it to be able to remove items
// return Collections.unmodifiableList(this.avps).iterator();
return this.avps.iterator();
}
@Override
public String toString() {
return new StringBuffer("AvpSetImpl [avps=").append(avps).append("]@").append(super.hashCode()).toString();
}
}