From 06049defe161c7cfcc20e6fc5e282820704e8447 Mon Sep 17 00:00:00 2001 From: Grzegorz Figiel Date: Fri, 31 Mar 2017 12:24:00 +0200 Subject: [PATCH] Fix for issue#78 - AVP index getters and fix for insert AVP with index (#79) * Fix for issue#78 - Get AVP index methods implemented and fix for insertAVP with index handling --- .gitignore | 1 + .../main/java/org/jdiameter/api/AvpSet.java | 17 ++++++++++++++ .../client/impl/parser/AvpSetImpl.java | 23 ++++++++++++++++++- 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index cdfed9175..c5a2c135e 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ # Maven # ######### target +\$\{env.JBOSS_HOME\} # OS generated files # ###################### diff --git a/core/jdiameter/api/src/main/java/org/jdiameter/api/AvpSet.java b/core/jdiameter/api/src/main/java/org/jdiameter/api/AvpSet.java index a2af490a8..44b5a3570 100644 --- a/core/jdiameter/api/src/main/java/org/jdiameter/api/AvpSet.java +++ b/core/jdiameter/api/src/main/java/org/jdiameter/api/AvpSet.java @@ -53,6 +53,8 @@ * Serializable interface allows use this class in SLEE Event objects * * @author erick.svenson@yahoo.com + * @author Grzegorz Figiel [ProIDS] + * * @version 1.5.1 Final */ public interface AvpSet extends Iterable, Serializable, Wrapper { @@ -94,6 +96,21 @@ public interface AvpSet extends Iterable, Serializable, Wrapper { */ AvpSet getAvps(int avpCode, long vendorId); + /** + * Get position of the first instance of the AVP + * @param avpCode code of the Avp + * @return index (position) of the first occurrence of the Avp. -1 in case Avp is not found + */ + int getAvpIndex(int avpCode); + + /** + * Get position of the first instance of the AVP + * @param avpCode code of the Avp + * @param vendorId vendorId of the Avp + * @return index (position) of the first occurrence of the Avp. -1 in case Avp is not found + */ + int getAvpIndex(int avpCode, long vendorId); + /** * Remove AVPs with avpCode * @param avpCode code of Avp diff --git a/core/jdiameter/impl/src/main/java/org/jdiameter/client/impl/parser/AvpSetImpl.java b/core/jdiameter/impl/src/main/java/org/jdiameter/client/impl/parser/AvpSetImpl.java index 800fe3f5c..767e71b7c 100644 --- a/core/jdiameter/impl/src/main/java/org/jdiameter/client/impl/parser/AvpSetImpl.java +++ b/core/jdiameter/impl/src/main/java/org/jdiameter/client/impl/parser/AvpSetImpl.java @@ -68,6 +68,7 @@ * @author erick.svenson@yahoo.com * @author Alexandre Mendonca * @author Bartosz Baranowski + * @author Grzegorz Figiel [ProIDS] */ class AvpSetImpl implements AvpSet { @@ -132,6 +133,26 @@ public AvpSet getAvps(int avpCode, long vendorId) { 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); @@ -219,7 +240,7 @@ public Avp insertAvp(int index, int avpCode, long value, boolean mFlag, boolean 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(res); + this.avps.add(index, res); return res; }