diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/GppModel.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/GppModel.java index 8c8bb223..c21c4a9c 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/GppModel.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/GppModel.java @@ -1,18 +1,16 @@ package com.iab.gpp.encoder; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.PrimitiveIterator; +import java.util.function.Supplier; import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.error.EncodingException; import com.iab.gpp.encoder.error.InvalidFieldException; -import com.iab.gpp.encoder.field.HeaderV1Field; +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.section.AbstractEncodable; import com.iab.gpp.encoder.section.EncodableSection; import com.iab.gpp.encoder.section.HeaderV1; -import com.iab.gpp.encoder.section.Sections; import com.iab.gpp.encoder.section.SlicedCharSequence; import com.iab.gpp.encoder.section.TcfCaV1; import com.iab.gpp.encoder.section.TcfEuV2; @@ -34,121 +32,89 @@ import com.iab.gpp.encoder.section.UsVa; import com.iab.gpp.encoder.section.UspV1; -public class GppModel { - private Map sections = new HashMap<>(); - - private String encodedString; +public class GppModel extends AbstractEncodable { + + // NOTE: we genrally use concrete types to avoid the cost of interface calls + private static final HashMap>> SECTION_ID_TO_CONSTRUCTOR = new HashMap<>(); + private static final HashMap SECTION_NAME_TO_ID = new HashMap<>(); + + static { + List>> constructors = new ArrayList<>(); + + // register section constructors here + constructors.add(TcfEuV2::new); + constructors.add(TcfCaV1::new); + constructors.add(UspV1::new); + constructors.add(UsNat::new); + constructors.add(UsCa::new); + constructors.add(UsVa::new); + constructors.add(UsCo::new); + constructors.add(UsUt::new); + constructors.add(UsCt::new); + constructors.add(UsFl::new); + constructors.add(UsMt::new); + constructors.add(UsOr::new); + constructors.add(UsTx::new); + constructors.add(UsDe::new); + constructors.add(UsIa::new); + constructors.add(UsNe::new); + constructors.add(UsNh::new); + constructors.add(UsNj::new); + constructors.add(UsTn::new); + + for (Supplier> constructor : constructors) { + EncodableSection prototype = constructor.get(); + Integer id = prototype.getId(); + SECTION_ID_TO_CONSTRUCTOR.put(id, constructor); + SECTION_NAME_TO_ID.put(prototype.getName(), id); + } + } - private boolean dirty = false; - private boolean decoded = true; + private final HashMap> sections = new HashMap<>(); + private final HeaderV1 header; public GppModel() { - + this.header = new HeaderV1(); } public GppModel(String encodedString) { + this(); decode(encodedString); } - public void setFieldValue(int sectionId, String fieldName, Object value) { - setFieldValue(Sections.SECTION_ID_NAME_MAP.get(sectionId), fieldName, value); + public void setFieldValue(String sectionName, FieldKey fieldName, Object value) { + setFieldValue(SECTION_NAME_TO_ID.get(sectionName), fieldName, value); } - private EncodableSection getOrCreateSection(String sectionName) { - EncodableSection section = this.sections.get(sectionName); + private EncodableSection getOrCreateSection(Integer sectionId) { + EncodableSection section = this.sections.get(sectionId); if (section == null) { - switch(sectionName) { - case TcfEuV2.NAME: - section = new TcfEuV2(); - break; - case TcfCaV1.NAME: - section = new TcfCaV1(); - break; - case UspV1.NAME: - section = new UspV1(); - break; - case UsNat.NAME: - section = new UsNat(); - break; - case UsCa.NAME: - section = new UsCa(); - break; - case UsVa.NAME: - section = new UsVa(); - break; - case UsCo.NAME: - section = new UsCo(); - break; - case UsUt.NAME: - section = new UsUt(); - break; - case UsCt.NAME: - section = new UsCt(); - break; - case UsFl.NAME: - section = new UsFl(); - break; - case UsMt.NAME: - section = new UsMt(); - break; - case UsOr.NAME: - section = new UsOr(); - break; - case UsTx.NAME: - section = new UsTx(); - break; - case UsDe.NAME: - section = new UsDe(); - break; - case UsIa.NAME: - section = new UsIa(); - break; - case UsNe.NAME: - section = new UsNe(); - break; - case UsNh.NAME: - section = new UsNh(); - break; - case UsNj.NAME: - section = new UsNj(); - break; - case UsTn.NAME: - section = new UsTn(); - break; - } - if (section != null) { - this.sections.put(sectionName, section); + Supplier> constructor = SECTION_ID_TO_CONSTRUCTOR.get(sectionId); + if (constructor != null) { + section = constructor.get(); + this.sections.put(sectionId, section); + this.header.getSectionsIds().addInt(section.getId()); } } return section; } - public void setFieldValue(String sectionName, String fieldName, Object value) { - if (!this.decoded) { - this.sections = this.decodeModel(this.encodedString); - this.dirty = false; - this.decoded = true; - } - EncodableSection section = getOrCreateSection(sectionName); + public void setFieldValue(int sectionId, FieldKey fieldName, Object value) { + ensureDecode(); + EncodableSection section = getOrCreateSection(sectionId); if (section != null) { section.setFieldValue(fieldName, value); - this.dirty = true; } else { - throw new InvalidFieldException(sectionName + "." + fieldName + " not found"); + throw new InvalidFieldException(sectionId + "." + fieldName + " not found"); } } - public Object getFieldValue(int sectionId, String fieldName) { - return getFieldValue(Sections.SECTION_ID_NAME_MAP.get(sectionId), fieldName); + public Object getFieldValue(String sectionName, FieldKey fieldName) { + return getFieldValue(SECTION_NAME_TO_ID.get(sectionName), fieldName); } - public Object getFieldValue(String sectionName, String fieldName) { - if (!this.decoded) { - this.sections = this.decodeModel(this.encodedString); - this.dirty = false; - this.decoded = true; - } - EncodableSection field = this.sections.get(sectionName); + public Object getFieldValue(int sectionId, FieldKey fieldName) { + EncodableSection field = getSection(sectionId); if (field != null) { return field.getFieldValue(fieldName); } else { @@ -156,17 +122,12 @@ public Object getFieldValue(String sectionName, String fieldName) { } } - public boolean hasField(int sectionId, String fieldName) { - return hasField(Sections.SECTION_ID_NAME_MAP.get(sectionId), fieldName); + public boolean hasField(String sectionName, FieldKey fieldName) { + return hasField(SECTION_NAME_TO_ID.get(sectionName), fieldName); } - public boolean hasField(String sectionName, String fieldName) { - if (!this.decoded) { - this.sections = this.decodeModel(this.encodedString); - this.dirty = false; - this.decoded = true; - } - EncodableSection field = this.sections.get(sectionName); + public boolean hasField(int sectionId, FieldKey fieldName) { + EncodableSection field = getSection(sectionId); if (field != null) { return field.hasField(fieldName); } else { @@ -174,69 +135,47 @@ public boolean hasField(String sectionName, String fieldName) { } } - public boolean hasSection(int sectionId) { - return hasSection(Sections.SECTION_ID_NAME_MAP.get(sectionId)); - } - public boolean hasSection(String sectionName) { - if (!this.decoded) { - this.sections = this.decodeModel(this.encodedString); - this.dirty = false; - this.decoded = true; - } + return hasSection(SECTION_NAME_TO_ID.get(sectionName)); + } - return this.sections.containsKey(sectionName); + public boolean hasSection(int sectionId) { + ensureDecode(); + return this.sections.containsKey(sectionId); } public HeaderV1 getHeader() { - if (!this.decoded) { - this.sections = this.decodeModel(this.encodedString); - this.dirty = false; - this.decoded = true; - } - - HeaderV1 header = new HeaderV1(); - try { - header.setFieldValue("SectionIds", this.getSectionIds()); - } catch (InvalidFieldException e) { - - } + ensureDecode(); return header; } - public EncodableSection getSection(int sectionId) { - return getSection(Sections.SECTION_ID_NAME_MAP.get(sectionId)); + public EncodableSection getSection(int sectionId) { + ensureDecode(); + return this.sections.get(sectionId); } - public EncodableSection getSection(String sectionName) { - if (!this.decoded) { - this.sections = this.decodeModel(this.encodedString); - this.dirty = false; - this.decoded = true; - } - return this.sections.get(sectionName); + public EncodableSection getSection(String sectionName) { + return getSection(SECTION_NAME_TO_ID.get(sectionName)); } - public void deleteSection(int sectionId) { - deleteSection(Sections.SECTION_ID_NAME_MAP.get(sectionId)); + public void deleteSection(String sectionName) { + deleteSection(SECTION_NAME_TO_ID.get(sectionName)); } - public void deleteSection(String sectionName) { - if (!this.decoded) { - this.sections = this.decodeModel(this.encodedString); - this.dirty = false; - this.decoded = true; - } - if (this.sections.remove(sectionName) != null) { - this.dirty = true; + public void deleteSection(int sectionId) { + ensureDecode(); + EncodableSection removed = this.sections.remove(sectionId); + if (removed != null) { + this.header.getSectionsIds().removeInt(removed.getId()); } } public void clear() { - this.sections.clear(); - this.encodedString = null; - this.dirty = false; - this.decoded = true; + ensureDecode(); + if (!this.sections.isEmpty()) { + this.sections.clear(); + this.header.getSectionsIds().clear(); + } } public TcfCaV1 getTcfCaV1Section() { @@ -316,150 +255,62 @@ public UsTn getUsTnSection() { } public List getSectionIds() { - if (!this.decoded) { - this.sections = this.decodeModel(this.encodedString); - this.dirty = false; - this.decoded = true; - } - int length = Sections.SECTION_ORDER.size(); - List sectionIds = new ArrayList<>(length); - for (int i = 0; i < length; i++) { - String sectionName = Sections.SECTION_ORDER.get(i); - EncodableSection section = this.sections.get(sectionName); - if (section != null) { - sectionIds.add(section.getId()); - } - } - return sectionIds; + ensureDecode(); + return new ArrayList<>(header.getSectionsIds()); } - protected String encodeModel(Map sections) { - int length = Sections.SECTION_ORDER.size(); - List encodedSections = new ArrayList<>(length); - List sectionIds = new ArrayList<>(length); - for (int i = 0; i < length; i++) { - String sectionName = Sections.SECTION_ORDER.get(i); - EncodableSection section = sections.get(sectionName); - if (section != null) { - encodedSections.add(section.encodeCharSequence()); - sectionIds.add(section.getId()); - } - } - - HeaderV1 header = new HeaderV1(); - try { - header.setFieldValue("SectionIds", getSectionIds()); - } catch (InvalidFieldException e) { - throw new EncodingException(e); + @Override + protected CharSequence doEncode() { + List encodedSections = new ArrayList<>(); + encodedSections.add(header.encodeCharSequence()); + for (Integer sectionId: header.getSectionsIds()) { + EncodableSection section = sections.get(sectionId); + encodedSections.add(section.encodeCharSequence()); } - encodedSections.add(0, header.encodeCharSequence()); - return SlicedCharSequence.join('~', encodedSections).toString(); + return SlicedCharSequence.join('~', encodedSections); } - protected Map decodeModel(String str) { - if (str == null || str.isEmpty() || str.startsWith("DB")) { - Map sections = new HashMap<>(); + @Override + protected void doDecode(CharSequence str) { + if (str == null || str.isEmpty() || (str.charAt(0) == 'D' && str.charAt(1) == 'B')) { + if (!sections.isEmpty()) { + sections.clear(); + header.getSectionsIds().clear(); + } if(str != null && !str.isEmpty()) { List encodedSections = SlicedCharSequence.split(str, '~'); - HeaderV1 header = new HeaderV1(encodedSections.get(0)); - sections.put(HeaderV1.NAME, header); + header.decode(encodedSections.get(0)); PrimitiveIterator.OfInt it = header.getSectionsIds().iterator(); int i = 1; while (it.hasNext()) { - CharSequence section = encodedSections.get(i++); - switch (it.nextInt()) { - case TcfEuV2.ID: - sections.put(TcfEuV2.NAME, new TcfEuV2(section)); - break; - case TcfCaV1.ID: - sections.put(TcfCaV1.NAME, new TcfCaV1(section)); - break; - case UspV1.ID: - sections.put(UspV1.NAME, new UspV1(section)); - break; - case UsCa.ID: - sections.put(UsCa.NAME, new UsCa(section)); - break; - case UsNat.ID: - sections.put(UsNat.NAME, new UsNat(section)); - break; - case UsVa.ID: - sections.put(UsVa.NAME, new UsVa(section)); - break; - case UsCo.ID: - sections.put(UsCo.NAME, new UsCo(section)); - break; - case UsUt.ID: - sections.put(UsUt.NAME, new UsUt(section)); - break; - case UsCt.ID: - sections.put(UsCt.NAME, new UsCt(section)); - break; - case UsFl.ID: - sections.put(UsFl.NAME, new UsFl(section)); - break; - case UsMt.ID: - sections.put(UsMt.NAME, new UsMt(section)); - break; - case UsOr.ID: - sections.put(UsOr.NAME, new UsOr(section)); - break; - case UsTx.ID: - sections.put(UsTx.NAME, new UsTx(section)); - break; - case UsDe.ID: - sections.put(UsDe.NAME, new UsDe(section)); - break; - case UsIa.ID: - sections.put(UsIa.NAME, new UsIa(section)); - break; - case UsNe.ID: - sections.put(UsNe.NAME, new UsNe(section)); - break; - case UsNh.ID: - sections.put(UsNh.NAME, new UsNh(section)); - break; - case UsNj.ID: - sections.put(UsNj.NAME, new UsNj(section)); - break; - case UsTn.ID: - sections.put(UsTn.NAME, new UsTn(section)); - break; + CharSequence encodedSection = encodedSections.get(i++); + int sectionId = it.nextInt(); + EncodableSection section = getOrCreateSection(sectionId); + if (section != null) { + section.decode(encodedSection); + } else { + // we do not support re-encoding this section + header.getSectionsIds().removeInt(sectionId); } } } - - return sections; - } else if (str.startsWith("C")) { + } else if (str.charAt(0) == 'C') { // old tcfeu only string - Map sections = new HashMap<>(); - - TcfEuV2 section = new TcfEuV2(str); - sections.put(TcfEuV2.NAME, section); - - HeaderV1 header = new HeaderV1(); - header.setFieldValue(HeaderV1Field.SECTION_IDS, Arrays.asList(2)); - sections.put(HeaderV1.NAME, section); - - return sections; + EncodableSection section = getOrCreateSection(TcfEuV2.ID); + section.decode(str); } else { throw new DecodingException("Unable to decode '" + str + "'"); } } - public String encodeSection(int sectionId) { - return encodeSection(Sections.SECTION_ID_NAME_MAP.get(sectionId)); + public String encodeSection(String sectionName) { + return encodeSection(SECTION_NAME_TO_ID.get(sectionName)); } - public String encodeSection(String sectionName) { - if (!this.decoded) { - this.sections = this.decodeModel(this.encodedString); - this.dirty = false; - this.decoded = true; - } - EncodableSection section = this.sections.get(sectionName); + public String encodeSection(int sectionId) { + EncodableSection section = getSection(sectionId); if (section != null) { return section.encode(); } else { @@ -467,48 +318,53 @@ public String encodeSection(String sectionName) { } } - public void decodeSection(int sectionId, String encodedString) { - decodeSection(Sections.SECTION_ID_NAME_MAP.get(sectionId), encodedString); - } - public void decodeSection(String sectionName, String encodedString) { - if (!this.decoded) { - this.sections = this.decodeModel(this.encodedString); - this.dirty = false; - this.decoded = true; - } + decodeSection(SECTION_NAME_TO_ID.get(sectionName), encodedString); + } - EncodableSection section = getOrCreateSection(sectionName); + public void decodeSection(int sectionId, String encodedString) { + ensureDecode(); + EncodableSection section = getOrCreateSection(sectionId); if (section != null) { section.decode(encodedString); - this.dirty = true; } } - public String encode() { - if (this.encodedString == null || this.encodedString.isEmpty() || this.dirty) { - this.encodedString = encodeModel(this.sections); - this.dirty = false; - this.decoded = true; + public String toString() { + ensureDecode(); + StringBuilder sb = new StringBuilder(); + sb.append('[').append(header); + for (Integer sectionId: header.getSectionsIds()) { + EncodableSection section = sections.get(sectionId); + sb.append(", ").append(section); } - - return this.encodedString; + sb.append(']'); + return sb.toString(); } - public void decode(String encodedString) { - this.encodedString = encodedString; - this.dirty = false; - this.decoded = false; + @Override + public boolean isDirty() { + if (header.isDirty()) { + return true; + } + for (Integer sectionId: header.getSectionsIds()) { + EncodableSection section = sections.get(sectionId); + if (section != null && section.isDirty()) { + return true; + } + } + return false; } - public String toString() { - List sectionIds = getSectionIds(); - List pieces = new ArrayList<>(sectionIds.size()); - for (Integer sectionId : sectionIds) { - pieces.add(getSection(sectionId).toString()); + @Override + public void setDirty(boolean dirty) { + header.setDirty(dirty); + for (Integer sectionId: header.getSectionsIds()) { + EncodableSection section = sections.get(sectionId); + if (section != null) { + section.setDirty(true); + } } - return pieces.toString(); } - } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/base64/AbstractBase64UrlEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/base64/AbstractBase64UrlEncoder.java index eacd934d..39a29ac0 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/base64/AbstractBase64UrlEncoder.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/base64/AbstractBase64UrlEncoder.java @@ -1,5 +1,7 @@ package com.iab.gpp.encoder.base64; +import java.util.Arrays; +import com.iab.gpp.encoder.bitstring.BitSet; import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; import com.iab.gpp.encoder.datatype.encoder.FixedIntegerEncoder; @@ -11,18 +13,22 @@ public abstract class AbstractBase64UrlEncoder { protected abstract void pad(BitStringBuilder bitString); private static final int BASE64_BITS = 6; + private static final int NO_SYMBOL = -1; /** * Base 64 URL character set. Different from standard Base64 char set in that '+' and '/' are * replaced with '-' and '_'. */ private static final String DICT = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; private static final int REVERSE_DICT_SIZE = 128; - private static final BitString[] REVERSE_DICT = new BitString[REVERSE_DICT_SIZE]; + private static final int[] REVERSE_DICT = new int[REVERSE_DICT_SIZE]; static { + Arrays.fill(REVERSE_DICT, NO_SYMBOL); for (int i = 0; i < DICT.length(); i++) { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerEncoder.encode(builder, i, 6); - REVERSE_DICT[DICT.charAt(i)] = builder.build(); + // NOTE: the bit string is stored in a long[] and read from LSB to MSB + // but each base64 digit is read from MSB to LSB + // so they need to be reversed. + int value = Integer.reverse(i) >>> -BASE64_BITS; + REVERSE_DICT[DICT.charAt(i)] = value; } } @@ -35,9 +41,10 @@ public StringBuilder encode(BitStringBuilder bitStringBuilder) { int index = 0; while (index <= length - BASE64_BITS) { try { - int n = FixedIntegerEncoder.decode(bitString, index, BASE64_BITS); + int nextIndex = index + BASE64_BITS; + int n = FixedIntegerEncoder.decode(bitString, index, nextIndex); str.append(DICT.charAt(n)); - index += BASE64_BITS; + index = nextIndex; } catch (DecodingException e) { throw new EncodingException("Unencodable Base64Url '" + bitString + "'"); } @@ -47,20 +54,51 @@ public StringBuilder encode(BitStringBuilder bitStringBuilder) { } public BitString decode(CharSequence str) { - int length = str.length(); - BitStringBuilder sb = new BitStringBuilder(length * BASE64_BITS); - for (int i = 0; i < length; i++) { - char c = str.charAt(i); - BitString n = null; - if (c < REVERSE_DICT_SIZE) { - n = REVERSE_DICT[c]; + try { + int length = str.length(); + int bitLength = length * BASE64_BITS; + int numBlocks = length >> 2; + byte[] words = new byte[(numBlocks + 1) * 3]; + int limit = numBlocks << 2; + int dst = 0; + int src = 0; + while (src < limit) { + int b1 = REVERSE_DICT[str.charAt(src++)]; + int b2 = REVERSE_DICT[str.charAt(src++)]; + int b3 = REVERSE_DICT[str.charAt(src++)]; + int b4 = REVERSE_DICT[str.charAt(src++)]; + if ((b1 | b2 | b3 | b4) < 0) { + throw new DecodingException("Undecodable Base64URL string"); + } + int bits0 = b4 << 18 | b3 << 12 | b2 << 6 | b1; + words[dst++] = (byte)(bits0); + words[dst++] = (byte)(bits0 >> 8); + words[dst++] = (byte)(bits0 >> 16); } - if (n == null) { - throw new DecodingException("Undecodable Base64URL string"); + if (length > limit) { + remainder(str, words, length, src, dst); } - sb.append(n); + return new BitString(new BitSet(words), bitLength); + } catch (ArrayIndexOutOfBoundsException e) { + throw new DecodingException("Undecodable Base64URL string"); + } + } + private static final void remainder(CharSequence str, byte[] words, int length, int src, int dst) { + int b1 = src < length ? REVERSE_DICT[str.charAt(src)] : 0; + src++; + int b2 = src < length ? REVERSE_DICT[str.charAt(src)] : 0; + src++; + int b3 = src < length ? REVERSE_DICT[str.charAt(src)] : 0; + src++; + int b4 = src < length ? REVERSE_DICT[str.charAt(src)] : 0; + src++; + if ((b1 | b2 | b3 | b4) < 0) { + throw new DecodingException("Undecodable Base64URL string"); } - return sb.build(); + int bits0 = b4 << 18 | b3 << 12 | b2 << 6 | b1; + words[dst++] = (byte)(bits0); + words[dst++] = (byte)(bits0 >> 8); + words[dst++] = (byte)(bits0 >> 16); } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitSet.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitSet.java new file mode 100644 index 00000000..cdc65ccd --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitSet.java @@ -0,0 +1,107 @@ +package com.iab.gpp.encoder.bitstring; + +import java.util.Arrays; +import java.util.Base64; +import com.iab.gpp.encoder.base64.TraditionalBase64UrlEncoder; +import com.iab.gpp.encoder.datatype.encoder.IntegerSet; +import com.iab.gpp.encoder.error.DecodingException; + +// a thin version of java.util.BitSet +public final class BitSet { + + private static final int ADDRESS_BITS_PER_WORD = 3; + public static final int BITS_PER_WORD = 1 << ADDRESS_BITS_PER_WORD; + + /* Used to shift left or right for a partial word mask */ + private static final int WORD_MASK = 0xffffffff; + + private byte[] words; + + public BitSet(byte[] words) { + this.words = words; + } + + public BitSet(int initialCapacity) { + this(new byte[wordIndex(initialCapacity) + 1]); + } + + public BitSet() { + this(new byte[0]); + } + + public static int wordIndex(int index) { + if (index < 0) { + throw new DecodingException("got negative word index"); + } + return index >> ADDRESS_BITS_PER_WORD; + } + + private byte[] ensureIndex(int wordIndex) { + byte[] words = this.words; + int wordsUsed = words.length; + if (wordIndex >= wordsUsed) { + int request = Math.max(2 * wordsUsed, wordIndex + 1); + words = Arrays.copyOf(words, request); + this.words = words; + } + return words; + } + + public boolean get(int bitIndex) { + int wordIndex = wordIndex(bitIndex); + byte[] words = this.words; + int bit = bitIndex % BITS_PER_WORD; + return (wordIndex < words.length) + && ((words[wordIndex] >>> bit) & 1) == 1; + } + + public void clear(int from, int to) { + for (int i = from; i < to; i++) { + clear(i); + } + } + + public void clear(int bitIndex) { + int wordIndex = wordIndex(bitIndex); + byte[] words = this.words; + if (wordIndex < words.length) { + int bit = bitIndex % BITS_PER_WORD; + words[wordIndex] &= ~(1 << bit); + } + } + + public int nextSetBit(int fromIndex) { + byte[] words = this.words; + int wordsInUse = words.length; + int u = wordIndex(fromIndex); + if (u >= wordsInUse) { + return -1; + } + + int bit = fromIndex % BITS_PER_WORD; + int word = words[u] & (WORD_MASK << bit); + + while (true) { + if (word != 0) { + return (u * BITS_PER_WORD) + Integer.numberOfTrailingZeros(word); + } + if (++u == wordsInUse) { + return -1; + } + word = words[u]; + } + } + + public void set(int from, int to) { + for (int i = from; i < to; i++) { + set(i); + } + } + + public void set(int bitIndex) { + int wordIndex = wordIndex(bitIndex); + byte[] words = ensureIndex(wordIndex); + int bit = bitIndex % BITS_PER_WORD; + words[wordIndex] |= (1 << bit); + } +} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitString.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitString.java index 8026d69c..f5cbe555 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitString.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitString.java @@ -1,7 +1,5 @@ package com.iab.gpp.encoder.bitstring; -import java.util.BitSet; -import com.iab.gpp.encoder.datatype.encoder.IntegerBitSet; import com.iab.gpp.encoder.datatype.encoder.IntegerSet; import com.iab.gpp.encoder.error.DecodingException; @@ -10,23 +8,13 @@ public final class BitString { public static final char FALSE = '0'; public static final String TRUE_STRING = new String(new char[] {TRUE}); public static final String FALSE_STRING = new String(new char[] {FALSE}); - private static final BitString EMPTY = new BitString(new BitSet(), 0, 0); private final BitSet bitSet; - private final int from; - private final int to; + private final int length; - BitString(BitSet bitSet, int from, int to) { + public BitString(BitSet bitSet, int length) { this.bitSet = bitSet; - this.from = from; - this.to = to; - } - - public static final BitString empty(int size) { - if (size == 0) { - return EMPTY; - } - return new BitString(new BitSet(size), 0, size); + this.length = length; } public static final BitString of(String str) { @@ -45,54 +33,28 @@ public static final BitString of(String str) { return builder.build(); } - public IntegerSet toIntegerSet() { - return new IntegerBitSet(bitSet, from, to, 1); + public IntegerSet toIntegerSet(int from, int to) { + return new IntegerSet(bitSet, from, to, 1); } @Override public String toString() { StringBuilder sb = new StringBuilder(length()); - for (int i = from; i < to; i++) { + for (int i = 0; i < length; i++) { sb.append(bitSet.get(i) ? TRUE : FALSE); } return sb.toString(); } public boolean getValue(int i) { - return bitSet.get(from + i); - } - - public int length() { - return to - from; - } - - public BitString substring(int i) { - return substring(i, length()); - } - - public BitString substring(int newFrom, int newTo) { - int length = length(); - if (newFrom > newTo || newFrom < 0 || newFrom > length || newTo > length) { - throw new IllegalArgumentException("Invalid substring"); + if (i >= length) { + throw new DecodingException("Bit string access out of range"); } - int oldFrom = this.from; - return new BitString(bitSet, oldFrom + newFrom, oldFrom + newTo); + return bitSet.get(i); } - public BitString expandTo(int target) { - int needed = target - length(); - if (needed == 0) { - return this; - } - if (needed < 0) { - return substring(0, target); - } - BitStringBuilder sb = new BitStringBuilder(target); - sb.append(this); - for (int i = 0; i < needed; i++) { - sb.append(false); - } - return sb.build(); + public int length() { + return length; } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitStringBuilder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitStringBuilder.java index 88d0ffaa..dc42e85b 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitStringBuilder.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitStringBuilder.java @@ -1,6 +1,5 @@ package com.iab.gpp.encoder.bitstring; -import java.util.BitSet; public final class BitStringBuilder { private final BitSet bitSet; @@ -15,7 +14,12 @@ public BitStringBuilder() { } public BitString build() { - return new BitString(bitSet, 0, length); + return new BitString(bitSet, length); + } + + public BitStringBuilder extend(int length) { + this.length += length; + return this; } public BitStringBuilder append(boolean value) { @@ -26,9 +30,8 @@ public BitStringBuilder append(boolean value) { return this; } - public BitStringBuilder append(BitString other) { - int otherLength = other.length(); - for (int i = 0; i < otherLength; i++) { + public BitStringBuilder append(BitString other, int from, int to) { + for (int i = from; i < to; i++) { append(other.getValue(i)); } return this; diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitStringEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitStringEncoder.java deleted file mode 100644 index 79ce4ef6..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitStringEncoder.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.iab.gpp.encoder.bitstring; - -import java.util.List; -import com.iab.gpp.encoder.datatype.AbstractEncodableBitStringDataType; -import com.iab.gpp.encoder.datatype.SubstringException; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.error.EncodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; - -public final class BitStringEncoder { - - private static final BitStringEncoder instance = new BitStringEncoder(); - - private BitStringEncoder() { - - } - - public static BitStringEncoder getInstance() { - return instance; - } - - public BitStringBuilder encode(EncodableBitStringFields fields) { - BitStringBuilder bitString = new BitStringBuilder(); - List fieldNames = fields.getNames(); - for (int i = 0; i < fieldNames.size(); i++) { - AbstractEncodableBitStringDataType field = fields.get(i); - if (field != null) { - field.encode(bitString); - } else { - throw new EncodingException("Field not found: '" + fieldNames.get(i) + "'"); - } - } - - return bitString; - } - - public void decode(BitString bitString, EncodableBitStringFields fields) { - int index = 0; - List fieldNames = fields.getNames(); - for (int i = 0; i < fieldNames.size(); i++) { - AbstractEncodableBitStringDataType field = fields.get(i); - if (field != null) { - try { - BitString substring = field.substring(bitString, index); - field.decode(substring); - index += substring.length(); - } catch (SubstringException e) { - if(field.getHardFailIfMissing()) { - throw new DecodingException("Unable to decode " + fieldNames.get(i), e); - } else { - return; - } - } catch (Exception e) { - throw new DecodingException("Unable to decode " + fieldNames.get(i), e); - } - } else { - throw new DecodingException("Field not found: '" + fieldNames.get(i) + "'"); - } - } - } -} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitStringReader.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitStringReader.java new file mode 100644 index 00000000..634941ed --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitStringReader.java @@ -0,0 +1,62 @@ +package com.iab.gpp.encoder.bitstring; + +import com.iab.gpp.encoder.datatype.encoder.FibonacciIntegerEncoder; +import com.iab.gpp.encoder.datatype.encoder.FixedIntegerEncoder; +import com.iab.gpp.encoder.datatype.encoder.FixedLongEncoder; +import com.iab.gpp.encoder.datatype.encoder.IntegerSet; +import com.iab.gpp.encoder.error.DecodingException; + +public final class BitStringReader { + + private int offset = 0; + private final BitString bitString; + + public BitStringReader(BitString bitString) { + this.bitString = bitString; + } + + public int readInt(int length) { + int newOffset = offset + length; + int out = FixedIntegerEncoder.decode(bitString, offset, newOffset); + offset = newOffset; + return out; + } + + public long readLong(int length) { + int newOffset = offset + length; + long out = FixedLongEncoder.decode(bitString, offset, newOffset); + offset = newOffset; + return out; + } + + public boolean readBool() { + return bitString.getValue(offset++); + } + + public int readFibonacci() { + int value = 0; + int offset = this.offset; + for (int i = 0; i < FibonacciIntegerEncoder.FIBONACCI_LIMIT; i++) { + if (bitString.getValue(offset + i)) { + // 1X + value += FibonacciIntegerEncoder.FIBONACCI_NUMBERS[i]; + i++; + int next = offset + i; + if (bitString.getValue(next)) { + // 11 + this.offset = next + 1; + return value; + } + } + } + throw new DecodingException("Invalid FibonacciInteger"); + } + + public IntegerSet readIntegerSet(int length) { + int newOffset = offset + length; + IntegerSet out = bitString.toIntegerSet(offset, newOffset); + offset = newOffset; + return out; + } + +} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/AbstractDirtyableBitStringDataType.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/AbstractDirtyableBitStringDataType.java new file mode 100644 index 00000000..cf2abaa6 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/AbstractDirtyableBitStringDataType.java @@ -0,0 +1,24 @@ +package com.iab.gpp.encoder.datatype; + +import com.iab.gpp.encoder.datatype.encoder.Dirtyable; + +// This class is used to handle collection types. +// It is important that we monitor the collections we return for changes. +public abstract class AbstractDirtyableBitStringDataType + extends AbstractEncodableBitStringDataType { + + protected AbstractDirtyableBitStringDataType(boolean hardFailIfMissing) { + super(hardFailIfMissing); + } + + @Override + public boolean isDirty() { + return super.isDirty() || value.isDirty(); + } + + @Override + public void setDirty(boolean dirty) { + super.setDirty(dirty); + value.setDirty(dirty); + } +} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/AbstractEncodableBitStringDataType.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/AbstractEncodableBitStringDataType.java index 8cb8cdb6..fe7f9842 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/AbstractEncodableBitStringDataType.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/AbstractEncodableBitStringDataType.java @@ -4,14 +4,13 @@ import java.util.function.Predicate; import java.util.stream.Collectors; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.error.ValidationException; -public abstract class AbstractEncodableBitStringDataType implements EncodableDataType { +public abstract class AbstractEncodableBitStringDataType extends EncodableDataType { //this if for backwards compatibility with the newer fields protected boolean hardFailIfMissing = true; - protected boolean dirty = false; - protected Predicate validator = null; + private boolean dirty = false; + private Predicate validator = null; protected T value; protected AbstractEncodableBitStringDataType(boolean hardFailIfMissing) { @@ -23,20 +22,24 @@ public AbstractEncodableBitStringDataType withValidator(Predicate validato return this; } - public boolean hasValue() { + public final boolean hasValue() { return this.value != null; } - public T getValue() { + public final T getValue() { return this.value; } - @SuppressWarnings("unchecked") public void setValue(Object value) { + setValue(value, true); + } + + @SuppressWarnings("unchecked") + protected final void setValue(Object value, boolean dirty) { T v = (T) value; if (validator == null || validator.test(v)) { this.value = v; - this.dirty = true; + this.dirty = dirty; } else { if (v instanceof Collection) { throw new ValidationException("Invalid value '" @@ -48,12 +51,10 @@ public void setValue(Object value) { } - public boolean getHardFailIfMissing() { + public final boolean getHardFailIfMissing() { return this.hardFailIfMissing; } - public abstract BitString substring(BitString bitString, int fromIndex) throws SubstringException; - public boolean isDirty() { return dirty; } @@ -61,4 +62,8 @@ public boolean isDirty() { public void setDirty(boolean dirty) { this.dirty = dirty; } + + public String toString() { + return String.valueOf(value); + } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/DataType.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/DataType.java index 58d70730..158ef48b 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/DataType.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/DataType.java @@ -1,9 +1,9 @@ package com.iab.gpp.encoder.datatype; -public interface DataType { - boolean hasValue(); - T getValue(); - void setValue(Object value); - boolean isDirty(); - void setDirty(boolean dirty); +import com.iab.gpp.encoder.datatype.encoder.Dirtyable; + +public abstract class DataType implements Dirtyable { + public abstract boolean hasValue(); + public abstract T getValue(); + public abstract void setValue(Object value); } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/DirtyableList.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/DirtyableList.java new file mode 100644 index 00000000..dffbb74d --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/DirtyableList.java @@ -0,0 +1,103 @@ +package com.iab.gpp.encoder.datatype; + +import java.util.AbstractList; +import java.util.ArrayList; +import java.util.Collection; +import com.iab.gpp.encoder.datatype.encoder.Dirtyable; + +// This class tracks whether a list has been modified. +final class DirtyableList extends AbstractList implements Dirtyable { + + private boolean dirty; + private final ArrayList delegate; + + DirtyableList() { + this.delegate = new ArrayList<>(); + } + + @Override + public int size() { + return delegate.size(); + } + + @Override + public boolean add(T value) { + boolean result = delegate.add(value); + dirty = true; + return result; + } + + @Override + public T get(int index) { + return delegate.get(index); + } + + @Override + public T set(int index, T value) { + T prior = delegate.set(index, value); + dirty = true; + return prior; + } + + @Override + public void add(int index, T element) { + delegate.add(index, element); + dirty = true; + } + + @Override + public T remove(int index) { + T old = delegate.remove(index); + dirty = true; + return old; + } + + @Override + public int indexOf(Object o) { + return delegate.indexOf(o); + } + + @Override + public int lastIndexOf(Object o) { + return delegate.lastIndexOf(o); + } + + @Override + public void clear() { + delegate.clear(); + dirty = true; + } + + @Override + public boolean addAll(Collection c) { + boolean result = delegate.addAll(c); + dirty = true; + return result; + } + + @Override + public String toString() { + return delegate.toString(); + } + + @Override + public boolean isDirty() { + int size = delegate.size(); + for (int i = 0; i < size; i++) { + T value = delegate.get(i); + if (value.isDirty()) { + return true; + } + } + return dirty; + } + + @Override + public void setDirty(boolean dirty) { + int size = delegate.size(); + for (int i = 0; i < size; i++) { + delegate.get(i).setDirty(dirty); + } + this.dirty = dirty; + } +} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableArrayOfFixedIntegerRanges.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableArrayOfFixedIntegerRanges.java index bcc9ff98..e004db1c 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableArrayOfFixedIntegerRanges.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableArrayOfFixedIntegerRanges.java @@ -1,18 +1,16 @@ package com.iab.gpp.encoder.datatype; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.datatype.encoder.FixedIntegerEncoder; import com.iab.gpp.encoder.datatype.encoder.FixedIntegerRangeEncoder; import com.iab.gpp.encoder.datatype.encoder.IntegerSet; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; -public final class EncodableArrayOfFixedIntegerRanges extends AbstractEncodableBitStringDataType> { +public final class EncodableArrayOfFixedIntegerRanges extends AbstractDirtyableBitStringDataType> { private int keyBitStringLength; private int typeBitStringLength; @@ -21,7 +19,7 @@ public EncodableArrayOfFixedIntegerRanges(int keyBitStringLength, int typeBitStr super(hardFailIfMissing); this.keyBitStringLength = keyBitStringLength; this.typeBitStringLength = typeBitStringLength; - this.value = Collections.emptyList(); + this.value = new DirtyableList<>(); } @Override @@ -42,60 +40,26 @@ public void encode(BitStringBuilder sb) { } @Override - public void decode(BitString bitString) { + public void decode(BitStringReader reader) { try { - int size = FixedIntegerEncoder.decode(bitString, 0, 12); - List entries = new ArrayList<>(size); - int index = 12; + int size = reader.readInt(12); + value.clear(); for (int i = 0; i < size; i++) { - int key = FixedIntegerEncoder.decode(bitString, index, keyBitStringLength); - index += keyBitStringLength; - - int type = FixedIntegerEncoder.decode(bitString, index, typeBitStringLength); - index += typeBitStringLength; - - BitString substring = new EncodableFixedIntegerRange().substring(bitString, index); - IntegerSet ids = FixedIntegerRangeEncoder.decode(substring); - index += substring.length(); - - entries.add(new RangeEntry(key, type, ids)); + int key = reader.readInt(keyBitStringLength); + int type = reader.readInt(typeBitStringLength); + IntegerSet ids = FixedIntegerRangeEncoder.decode(reader); + RangeEntry entry = new RangeEntry(key, type, ids); + value.add(entry); } - - // NOTE: this requires that updates to structure be done using the setter - this.value = Collections.unmodifiableList(entries); } catch (Exception e) { throw new DecodingException(e); } } + @SuppressWarnings("unchecked") @Override - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - try { - BitStringBuilder sb = new BitStringBuilder(); - BitString lengthString = bitString.substring(fromIndex, fromIndex + 12); - sb.append(lengthString); - - int size = FixedIntegerEncoder.decode(lengthString); - - int index = fromIndex + lengthString.length(); - for (int i = 0; i < size; i++) { - BitString keySubstring = bitString.substring(index, index + keyBitStringLength); - index += keySubstring.length(); - sb.append(keySubstring); - - BitString typeSubstring = bitString.substring(index, index + typeBitStringLength); - index += typeSubstring.length(); - sb.append(typeSubstring); - - BitString rangeSubstring = new EncodableFixedIntegerRange().substring(bitString, index); - index += rangeSubstring.length(); - sb.append(rangeSubstring); - } - - return sb.build(); - } catch (Exception e) { - throw new SubstringException(e); - } + public void setValue(Object value) { + this.value.clear(); + this.value.addAll((List) value); } - } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableBoolean.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableBoolean.java index 3c418fd8..d04af67c 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableBoolean.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableBoolean.java @@ -1,7 +1,7 @@ package com.iab.gpp.encoder.datatype; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.datatype.encoder.BooleanEncoder; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; @@ -10,7 +10,7 @@ public final class EncodableBoolean extends AbstractEncodableBitStringDataType extends DataType { - void encode(BitStringBuilder builder); +public abstract class EncodableDataType extends DataType { + public abstract void encode(BitStringBuilder builder); - void decode(BitString str); + public abstract void decode(BitStringReader reader); } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableDatetime.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableDatetime.java index 9a158820..a5589e48 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableDatetime.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableDatetime.java @@ -2,8 +2,8 @@ import java.time.Instant; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.datatype.encoder.DatetimeEncoder; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; @@ -16,7 +16,7 @@ protected EncodableDatetime() { public EncodableDatetime(Instant value) { super(true); - setValue(value); + setValue(value, false); } public void encode(BitStringBuilder builder) { @@ -27,19 +27,11 @@ public void encode(BitStringBuilder builder) { } } - public void decode(BitString bitString) { + public void decode(BitStringReader reader) { try { - this.value = DatetimeEncoder.decode(bitString); + this.value = DatetimeEncoder.decode(reader); } catch (Exception e) { throw new DecodingException(e); } } - - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - try { - return bitString.substring(fromIndex, fromIndex + 36); - } catch (Exception e) { - throw new SubstringException(e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFibonacciInteger.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFibonacciInteger.java index c0106dc9..39a9825d 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFibonacciInteger.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFibonacciInteger.java @@ -1,7 +1,7 @@ package com.iab.gpp.encoder.datatype; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.datatype.encoder.FibonacciIntegerEncoder; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; @@ -14,12 +14,12 @@ protected EncodableFibonacciInteger() { public EncodableFibonacciInteger(Integer value) { super(true); - setValue(value); + setValue(value, false); } public EncodableFibonacciInteger(Integer value, boolean hardFailIfMissing) { super(hardFailIfMissing); - setValue(value); + setValue(value, false); } public void encode(BitStringBuilder builder) { @@ -30,24 +30,11 @@ public void encode(BitStringBuilder builder) { } } - public void decode(BitString bitString) { + public void decode(BitStringReader reader) { try { - this.value = FibonacciIntegerEncoder.decode(bitString); + this.value = reader.readFibonacci(); } catch (Exception e) { throw new DecodingException(e); } } - - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - try { - int index = FibonacciIntegerEncoder.indexOfEndTag(bitString, fromIndex); - if (index > 0) { - return bitString.substring(fromIndex, index + 2); - } else { - return bitString; - } - } catch (Exception e) { - throw new SubstringException(e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFibonacciIntegerRange.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFibonacciIntegerRange.java index 19963a55..1251b8b4 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFibonacciIntegerRange.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFibonacciIntegerRange.java @@ -1,21 +1,18 @@ package com.iab.gpp.encoder.datatype; import java.util.Collection; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.datatype.encoder.IntegerBitSet; -import com.iab.gpp.encoder.datatype.encoder.FibonacciIntegerEncoder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.datatype.encoder.FibonacciIntegerRangeEncoder; -import com.iab.gpp.encoder.datatype.encoder.FixedIntegerEncoder; import com.iab.gpp.encoder.datatype.encoder.IntegerSet; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; -public final class EncodableFibonacciIntegerRange extends AbstractEncodableBitStringDataType { +public final class EncodableFibonacciIntegerRange extends AbstractDirtyableBitStringDataType { public EncodableFibonacciIntegerRange() { super(true); - this.value = new IntegerBitSet(); + this.value = new IntegerSet(); } public void encode(BitStringBuilder builder) { @@ -26,40 +23,18 @@ public void encode(BitStringBuilder builder) { } } - public void decode(BitString bitString) { + public void decode(BitStringReader reader) { try { - this.value = FibonacciIntegerRangeEncoder.decode(bitString); + this.value = FibonacciIntegerRangeEncoder.decode(reader); } catch (Exception e) { throw new DecodingException(e); } } - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - try { - int count = FixedIntegerEncoder.decode(bitString, fromIndex, 12); - int index = fromIndex + 12; - for (int i = 0; i < count; i++) { - if (bitString.getValue(index)) { - index = FibonacciIntegerEncoder.indexOfEndTag(bitString, FibonacciIntegerEncoder.indexOfEndTag(bitString, index + 1) + 2) + 2; - } else { - index = FibonacciIntegerEncoder.indexOfEndTag(bitString, index + 1) + 2; - } - } - return bitString.substring(fromIndex, index); - } catch (Exception e) { - throw new SubstringException(e); - } - } - @SuppressWarnings("unchecked") @Override public void setValue(Object value) { this.value.clear(); this.value.addAll((Collection) value); } - - @Override - public IntegerSet getValue() { - return new ManagedIntegerSet(this, super.getValue()); - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedBitfield.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedBitfield.java index e7404069..af670eb5 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedBitfield.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedBitfield.java @@ -1,22 +1,21 @@ package com.iab.gpp.encoder.datatype; import java.util.Collection; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.datatype.encoder.IntegerBitSet; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.datatype.encoder.FixedBitfieldEncoder; import com.iab.gpp.encoder.datatype.encoder.IntegerSet; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; -public final class EncodableFixedBitfield extends AbstractEncodableBitStringDataType { +public final class EncodableFixedBitfield extends AbstractDirtyableBitStringDataType { private final int numElements; public EncodableFixedBitfield(int numElements) { super(true); this.numElements = numElements; - this.value = new IntegerBitSet(numElements); + this.value = new IntegerSet(numElements); } public void encode(BitStringBuilder builder) { @@ -27,31 +26,18 @@ public void encode(BitStringBuilder builder) { } } - public void decode(BitString bitString) { + public void decode(BitStringReader reader) { try { - this.value = FixedBitfieldEncoder.decode(bitString); + this.value = reader.readIntegerSet(this.numElements); } catch (Exception e) { throw new DecodingException(e); } } - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - try { - return bitString.substring(fromIndex, fromIndex + this.numElements); - } catch (Exception e) { - throw new SubstringException(e); - } - } - @SuppressWarnings("unchecked") @Override public void setValue(Object value) { this.value.clear(); this.value.addAll((Collection) value); } - - @Override - public IntegerSet getValue() { - return new ManagedIntegerSet(this, super.getValue()); - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedInteger.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedInteger.java index d6dc9775..12a1800a 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedInteger.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedInteger.java @@ -1,7 +1,7 @@ package com.iab.gpp.encoder.datatype; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.datatype.encoder.FixedIntegerEncoder; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; @@ -18,7 +18,7 @@ protected EncodableFixedInteger(int bitStringLength) { public EncodableFixedInteger(int bitStringLength, Integer value) { super(true); this.bitStringLength = bitStringLength; - setValue(value); + setValue(value, false); } public void encode(BitStringBuilder builder) { @@ -29,19 +29,11 @@ public void encode(BitStringBuilder builder) { } } - public void decode(BitString bitString) { + public void decode(BitStringReader reader) { try { - this.value = FixedIntegerEncoder.decode(bitString); + this.value = reader.readInt(bitStringLength); } catch (Exception e) { throw new DecodingException(e); } } - - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - try { - return bitString.substring(fromIndex, fromIndex + this.bitStringLength); - } catch (Exception e) { - throw new SubstringException(e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerList.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerList.java index 3a4db509..9f8947ac 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerList.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerList.java @@ -1,30 +1,23 @@ package com.iab.gpp.encoder.datatype; -import java.util.ArrayList; import java.util.List; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.datatype.encoder.FixedIntegerListEncoder; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; -public final class EncodableFixedIntegerList extends AbstractEncodableBitStringDataType> { +public final class EncodableFixedIntegerList extends AbstractDirtyableBitStringDataType { private int elementBitStringLength; private int numElements; - protected EncodableFixedIntegerList(int elementBitStringLength, int numElements) { + public EncodableFixedIntegerList(int elementBitStringLength, int numElements) { super(true); this.elementBitStringLength = elementBitStringLength; this.numElements = numElements; - } - - public EncodableFixedIntegerList(int elementBitStringLength, List value) { - super(true); - this.elementBitStringLength = elementBitStringLength; - this.numElements = value.size(); - setValue(value); + super.setValue(new FixedIntegerList(numElements), false); } public void encode(BitStringBuilder builder) { @@ -35,37 +28,23 @@ public void encode(BitStringBuilder builder) { } } - public void decode(BitString bitString) { + public void decode(BitStringReader reader) { try { - this.value = FixedIntegerListEncoder.decode(bitString, this.elementBitStringLength, this.numElements); + FixedIntegerListEncoder.decode(this.value, reader, this.elementBitStringLength); } catch (Exception e) { throw new DecodingException(e); } } - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - try { - return bitString.substring(fromIndex, fromIndex + (this.elementBitStringLength * numElements)); - } catch (Exception e) { - throw new SubstringException(e); - } - } - @SuppressWarnings("unchecked") @Override public void setValue(Object value) { - List v = new ArrayList<>((List) value); - for (int i = v.size(); i < numElements; i++) { - v.add(0); - } - if (v.size() > numElements) { - v = v.subList(0, numElements); + List list = (List) value; + int size = list.size(); + for (int i = 0; i < numElements; i++) { + this.value.set(i, i < size ? list.get(i) : 0); } - super.setValue(v); - } - - @Override - public List getValue() { - return new ManagedFixedList<>(this, super.getValue()); + // call validator + super.setValue(this.value); } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerRange.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerRange.java index 7bbbc4a6..01411792 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerRange.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerRange.java @@ -1,20 +1,18 @@ package com.iab.gpp.encoder.datatype; import java.util.Collection; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.datatype.encoder.IntegerBitSet; -import com.iab.gpp.encoder.datatype.encoder.FixedIntegerEncoder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.datatype.encoder.FixedIntegerRangeEncoder; import com.iab.gpp.encoder.datatype.encoder.IntegerSet; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; -public final class EncodableFixedIntegerRange extends AbstractEncodableBitStringDataType { +public final class EncodableFixedIntegerRange extends AbstractDirtyableBitStringDataType { protected EncodableFixedIntegerRange() { super(true); - this.value = new IntegerBitSet(); + this.value = new IntegerSet(); } public void encode(BitStringBuilder builder) { @@ -25,40 +23,18 @@ public void encode(BitStringBuilder builder) { } } - public void decode(BitString bitString) { + public void decode(BitStringReader reader) { try { - this.value = FixedIntegerRangeEncoder.decode(bitString); + this.value = FixedIntegerRangeEncoder.decode(reader); } catch (Exception e) { throw new DecodingException(e); } } - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - try { - int count = FixedIntegerEncoder.decode(bitString, fromIndex, 12); - int index = fromIndex + 12; - for (int i = 0; i < count; i++) { - if (bitString.getValue(index)) { - index += 33; - } else { - index += 17; - } - } - return bitString.substring(fromIndex, index); - } catch (Exception e) { - throw new SubstringException(e); - } - } - @SuppressWarnings("unchecked") @Override public void setValue(Object value) { this.value.clear(); this.value.addAll((Collection) value); } - - @Override - public IntegerSet getValue() { - return new ManagedIntegerSet(this, super.getValue()); - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedString.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedString.java index 7221078c..f9606b32 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedString.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFixedString.java @@ -1,7 +1,7 @@ package com.iab.gpp.encoder.datatype; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.datatype.encoder.FixedStringEncoder; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; @@ -18,7 +18,7 @@ protected EncodableFixedString(int stringLength) { public EncodableFixedString(int stringLength, String value) { super(true); this.stringLength = stringLength; - setValue(value); + setValue(value, false); } public void encode(BitStringBuilder builder) { @@ -29,19 +29,11 @@ public void encode(BitStringBuilder builder) { } } - public void decode(BitString bitString) { + public void decode(BitStringReader reader) { try { - this.value = FixedStringEncoder.decode(bitString); + this.value = FixedStringEncoder.decode(reader, this.stringLength); } catch (Exception e) { throw new DecodingException(e); } } - - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - try { - return bitString.substring(fromIndex, fromIndex + this.stringLength * 6); - } catch (Exception e) { - throw new SubstringException(e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFlexibleBitfield.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFlexibleBitfield.java index 46337183..7b983090 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFlexibleBitfield.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableFlexibleBitfield.java @@ -3,22 +3,21 @@ import java.util.Collection; import java.util.function.IntSupplier; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.datatype.encoder.IntegerBitSet; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.datatype.encoder.FixedBitfieldEncoder; import com.iab.gpp.encoder.datatype.encoder.IntegerSet; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; -public final class EncodableFlexibleBitfield extends AbstractEncodableBitStringDataType { +public final class EncodableFlexibleBitfield extends AbstractDirtyableBitStringDataType { private IntSupplier getLengthSupplier; public EncodableFlexibleBitfield(IntSupplier getLengthSupplier) { super(true); this.getLengthSupplier = getLengthSupplier; - this.value = new IntegerBitSet(); + this.value = new IntegerSet(); } public void encode(BitStringBuilder builder) { @@ -29,21 +28,14 @@ public void encode(BitStringBuilder builder) { } } - public void decode(BitString bitString) { + public void decode(BitStringReader reader) { try { - this.value = FixedBitfieldEncoder.decode(bitString); + this.value = reader.readIntegerSet(getLengthSupplier.getAsInt()); } catch (Exception e) { throw new DecodingException(e); } } - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - try { - return bitString.substring(fromIndex, fromIndex + this.getLengthSupplier.getAsInt()); - } catch (Exception e) { - throw new SubstringException(e); - } - } @SuppressWarnings("unchecked") @Override @@ -51,9 +43,4 @@ public void setValue(Object value) { this.value.clear(); this.value.addAll((Collection) value); } - - @Override - public IntegerSet getValue() { - return new ManagedIntegerSet(this, super.getValue()); - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableOptimizedFibonacciRange.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableOptimizedFibonacciRange.java deleted file mode 100644 index 1aba7d88..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableOptimizedFibonacciRange.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -import java.util.Collection; -import java.util.List; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.datatype.encoder.FixedIntegerEncoder; -import com.iab.gpp.encoder.datatype.encoder.IntegerSet; -import com.iab.gpp.encoder.datatype.encoder.OptimizedFibonacciRangeEncoder; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.error.EncodingException; - -public final class EncodableOptimizedFibonacciRange extends AbstractEncodableBitStringDataType { - - protected EncodableOptimizedFibonacciRange() { - super(true); - } - - public EncodableOptimizedFibonacciRange(List value) { - super(true); - setValue(value); - } - - public EncodableOptimizedFibonacciRange(List value, boolean hardFailIfMissing) { - super(hardFailIfMissing); - setValue(value); - } - - public void encode(BitStringBuilder builder) { - try { - OptimizedFibonacciRangeEncoder.encode(builder, this.value); - } catch (Exception e) { - throw new EncodingException(e); - } - } - - public void decode(BitString bitString) { - try { - this.value = OptimizedFibonacciRangeEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } - } - - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - try { - int max = FixedIntegerEncoder.decode(bitString, fromIndex, 16); - if (bitString.getValue(fromIndex + 16)) { - BitStringBuilder out = new BitStringBuilder(); - out.append(bitString.substring(fromIndex, fromIndex + 17)); - out.append(new EncodableFibonacciIntegerRange().substring(bitString, fromIndex + 17)); - return out.build(); - } else { - return bitString.substring(fromIndex, fromIndex + 17 + max); - } - } catch (Exception e) { - throw new SubstringException(e); - } - } - - @SuppressWarnings("unchecked") - @Override - public void setValue(Object value) { - this.value.clear(); - this.value.addAll((Collection) value); - } - - @Override - public IntegerSet getValue() { - return new ManagedIntegerSet(this, super.getValue()); - } -} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableOptimizedFixedRange.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableOptimizedFixedRange.java index a0669607..12858d8f 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableOptimizedFixedRange.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableOptimizedFixedRange.java @@ -1,21 +1,19 @@ package com.iab.gpp.encoder.datatype; import java.util.Collection; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.datatype.encoder.IntegerBitSet; -import com.iab.gpp.encoder.datatype.encoder.FixedIntegerEncoder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.datatype.encoder.IntegerSet; import com.iab.gpp.encoder.datatype.encoder.OptimizedFixedRangeEncoder; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; -public final class EncodableOptimizedFixedRange extends AbstractEncodableBitStringDataType { +public final class EncodableOptimizedFixedRange extends AbstractDirtyableBitStringDataType { public EncodableOptimizedFixedRange() { super(true); - this.value = new IntegerBitSet(); + this.value = new IntegerSet(); } public void encode(BitStringBuilder builder) { @@ -26,39 +24,18 @@ public void encode(BitStringBuilder builder) { } } - public void decode(BitString bitString) { + public void decode(BitStringReader reader) { try { - this.value = OptimizedFixedRangeEncoder.decode(bitString); + this.value = OptimizedFixedRangeEncoder.decode(reader); } catch (Exception e) { throw new DecodingException(e); } } - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - try { - int max = FixedIntegerEncoder.decode(bitString, fromIndex, 16); - if (bitString.getValue(fromIndex + 16)) { - BitStringBuilder out = new BitStringBuilder(); - out.append(bitString.substring(fromIndex, fromIndex + 17)); - out.append(new EncodableFixedIntegerRange().substring(bitString, fromIndex + 17)); - return out.build(); - } else { - return bitString.substring(fromIndex, fromIndex + 17 + max); - } - } catch (Exception e) { - throw new SubstringException(e); - } - } - @SuppressWarnings("unchecked") @Override public void setValue(Object value) { this.value.clear(); this.value.addAll((Collection) value); } - - @Override - public IntegerSet getValue() { - return new ManagedIntegerSet(this, super.getValue()); - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/FixedIntegerList.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/FixedIntegerList.java new file mode 100644 index 00000000..9e6176e4 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/FixedIntegerList.java @@ -0,0 +1,64 @@ +package com.iab.gpp.encoder.datatype; + +import java.util.AbstractList; +import java.util.Arrays; +import com.iab.gpp.encoder.datatype.encoder.Dirtyable; + +/** + * An optimized implementation of {@literal List} of fixed size. + * Use {@link #getInt(int)} and {@link #setInt(int, int)} for efficient access. + */ +public final class FixedIntegerList extends AbstractList implements Dirtyable { + + private boolean dirty; + private final byte[] array; + + public FixedIntegerList(int size) { + this.array = new byte[size]; + } + + @Override + public int size() { + return array.length; + } + + @Override + public Integer get(int index) { + return getInt(index); + } + + public int getInt(int index) { + return array[index]; + } + + @Override + public Integer set(int index, Integer value) { + return setInt(index, value); + } + + public int setInt(int index, int value) { + // NOTE: int 128 is prevented since it would get turned into byte -128 + if(value < 0 || value >= 128) { + throw new IllegalArgumentException("FixedIntegerList only supports positive integers less than 128."); + } + int prior = array[index]; + array[index] = (byte) value; + dirty = true; + return prior; + } + + @Override + public String toString() { + return Arrays.toString(array); + } + + @Override + public boolean isDirty() { + return dirty; + } + + @Override + public void setDirty(boolean dirty) { + this.dirty = dirty; + } +} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/ManagedFixedList.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/ManagedFixedList.java deleted file mode 100644 index df38f67f..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/ManagedFixedList.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -import java.util.AbstractList; -import java.util.List; - -final class ManagedFixedList extends AbstractList { - - private final DataType parent; - private final List delegate; - - ManagedFixedList(DataType parent, List delegate) { - this.parent = parent; - this.delegate = delegate; - } - - @Override - public int size() { - return delegate.size(); - } - - @Override - public T get(int index) { - return delegate.get(index); - } - - @Override - public T set(int index, T value) { - T prior = delegate.set(index, value); - if (prior != null) { - parent.setDirty(true); - } - return prior; - } - - @Override - public String toString() { - return delegate.toString(); - } -} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/ManagedIntegerSet.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/ManagedIntegerSet.java deleted file mode 100644 index daccfdb9..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/ManagedIntegerSet.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -import java.util.PrimitiveIterator; -import java.util.stream.IntStream; -import java.util.stream.Stream; -import com.iab.gpp.encoder.datatype.encoder.BaseIntegerSet; -import com.iab.gpp.encoder.datatype.encoder.IntegerSet; - -final class ManagedIntegerSet extends BaseIntegerSet { - - private final DataType parent; - private final IntegerSet delegate; - - ManagedIntegerSet(DataType parent, IntegerSet delegate) { - this.parent = parent; - this.delegate = delegate; - } - - @Override - public void clear() { - delegate.clear(); - parent.setDirty(true); - } - - @Override - public boolean isEmpty() { - return delegate.isEmpty(); - } - - @Override - public int size() { - return delegate.size(); - } - - @Override - public PrimitiveIterator.OfInt iterator() { - return delegate.iterator(); - } - - @Override - public Stream stream(){ - return delegate.stream(); - } - - @Override - public IntStream intStream() { - return delegate.intStream(); - } - - @Override - public boolean containsInt(int value) { - return delegate.containsInt(value); - } - - @Override - public boolean addInt(int value) { - boolean modified = delegate.addInt(value); - if (modified) { - parent.setDirty(true); - } - return modified; - } - - @Override - public boolean removeInt(int value) { - boolean modified = delegate.removeInt(value); - if (modified) { - parent.setDirty(true); - } - return modified; - } - - @Override - public String toString() { - return delegate.toString(); - } -} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/RangeEntry.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/RangeEntry.java index 5ea4bd7f..027934f8 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/RangeEntry.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/RangeEntry.java @@ -1,29 +1,37 @@ package com.iab.gpp.encoder.datatype; import java.util.Collection; -import java.util.Set; -import com.iab.gpp.encoder.datatype.encoder.IntegerBitSet; +import com.iab.gpp.encoder.datatype.encoder.Dirtyable; import com.iab.gpp.encoder.datatype.encoder.IntegerSet; -public class RangeEntry { +public final class RangeEntry implements Dirtyable { + private boolean dirty; private int key; private int type; private final IntegerSet ids; - public RangeEntry(int key, int type, Set ids) { + public RangeEntry(int key, int type, Collection ids) { super(); this.key = key; this.type = type; - this.ids = new IntegerBitSet(); + this.ids = new IntegerSet(); this.ids.addAll(ids); } + RangeEntry(int key, int type, IntegerSet ids) { + super(); + this.key = key; + this.type = type; + this.ids = ids; + } + public int getKey() { return key; } public void setKey(int key) { + this.dirty = true; this.key = key; } @@ -32,6 +40,7 @@ public int getType() { } public void setType(int type) { + this.dirty = true; this.type = type; } @@ -40,8 +49,20 @@ public IntegerSet getIds() { } public void setIds(Collection ids) { + this.dirty = true; this.ids.clear(); this.ids.addAll(ids); } + @Override + public boolean isDirty() { + return dirty || ids.isDirty(); + } + + @Override + public void setDirty(boolean dirty) { + this.dirty = dirty; + ids.setDirty(dirty); + } + } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/SubstringException.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/SubstringException.java deleted file mode 100644 index e9df8ca6..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/SubstringException.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -public class SubstringException extends Exception { - - private static final long serialVersionUID = 1825100490468259890L; - - public SubstringException(String msg) { - super(msg); - } - - public SubstringException(Exception e) { - super(e); - } - - public SubstringException(String msg, Exception e) { - super(msg, e); - } -} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/UnencodableBoolean.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/UnencodableBoolean.java index 3284a23b..4068bf7c 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/UnencodableBoolean.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/UnencodableBoolean.java @@ -1,7 +1,7 @@ package com.iab.gpp.encoder.datatype; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; public final class UnencodableBoolean extends AbstractEncodableBitStringDataType { @@ -11,18 +11,15 @@ protected UnencodableBoolean() { public UnencodableBoolean(Boolean value) { super(true); - setValue(value); + setValue(value, false); } public void encode(BitStringBuilder builder){ // pass } - public void decode(BitString bitString) { + public void decode(BitStringReader reader) { // pass } - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - return BitString.empty(0); - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/UnencodableCharacter.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/UnencodableCharacter.java index 4b1f84ee..8b0739fe 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/UnencodableCharacter.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/UnencodableCharacter.java @@ -3,7 +3,7 @@ import java.util.function.Predicate; import com.iab.gpp.encoder.error.ValidationException; -public final class UnencodableCharacter implements DataType { +public final class UnencodableCharacter extends DataType { private boolean dirty = false; private Predicate validator; diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/UnencodableInteger.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/UnencodableInteger.java index 1b40a247..8ffc7e02 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/UnencodableInteger.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/UnencodableInteger.java @@ -3,7 +3,7 @@ import java.util.function.Predicate; import com.iab.gpp.encoder.error.ValidationException; -public final class UnencodableInteger implements DataType { +public final class UnencodableInteger extends DataType { private boolean dirty; private Predicate validator; diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/BaseIntegerSet.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/BaseIntegerSet.java deleted file mode 100644 index bb872855..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/BaseIntegerSet.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.iab.gpp.encoder.datatype.encoder; - -import java.util.AbstractSet; -import java.util.Collection; - -public abstract class BaseIntegerSet extends AbstractSet implements IntegerSet { - - @Override - public final boolean contains(Object value) { - if (value instanceof Integer) { - return containsInt((Integer) value); - } - return false; - } - - @Override - public final boolean add(Integer value) { - if (value == null) { - return false; - } - return addInt(value); - } - - @Override - public final boolean remove(Object value) { - if (value instanceof Integer) { - return removeInt((Integer) value); - } - return false; - } - - @Override - public boolean removeAll(Collection c) { - boolean modified = false; - for (Integer i : this) { - if (c.contains(i)) { - remove(i); - modified = true; - } - } - return modified; - } - - @Override - public boolean retainAll(Collection c) { - boolean modified = false; - for (Integer i : this) { - if (!c.contains(i)) { - remove(i); - modified = true; - } - } - return modified; - } - -} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/DatetimeEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/DatetimeEncoder.java index ebc2462d..ed83bb99 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/DatetimeEncoder.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/DatetimeEncoder.java @@ -2,8 +2,8 @@ import java.time.Instant; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.error.DecodingException; public class DatetimeEncoder { @@ -18,11 +18,7 @@ public static void encode(BitStringBuilder builder, Instant value) { } } - public static Instant decode(BitString bitString) throws DecodingException { - if (bitString.length() != 36) { - throw new DecodingException("Undecodable Datetime '" + bitString + "'"); - } - - return Instant.ofEpochMilli(FixedLongEncoder.decode(bitString) * 100L); + public static Instant decode(BitStringReader reader) throws DecodingException { + return Instant.ofEpochMilli(reader.readLong(36) * 100L); } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/Dirtyable.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/Dirtyable.java new file mode 100644 index 00000000..2353de1d --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/Dirtyable.java @@ -0,0 +1,6 @@ +package com.iab.gpp.encoder.datatype.encoder; + +public interface Dirtyable { + boolean isDirty(); + void setDirty(boolean dirty); +} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FibonacciIntegerEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FibonacciIntegerEncoder.java index d0f7948a..869d287d 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FibonacciIntegerEncoder.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FibonacciIntegerEncoder.java @@ -1,8 +1,6 @@ package com.iab.gpp.encoder.datatype.encoder; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; public class FibonacciIntegerEncoder { @@ -10,8 +8,8 @@ private FibonacciIntegerEncoder() {} // this is the length of the longest fibonacci encoded string of all 1's // which does not overflow a 32-bit integer - private static final int FIBONACCI_LIMIT = 42; - private static final int[] FIBONACCI_NUMBERS = new int[FIBONACCI_LIMIT]; + public static final int FIBONACCI_LIMIT = 42; + public static final int[] FIBONACCI_NUMBERS = new int[FIBONACCI_LIMIT]; static { for (int i = 0; i < FIBONACCI_LIMIT; i++) { if (i == 0) { @@ -49,46 +47,4 @@ public static void encode(BitStringBuilder builder, int value) { } FixedIntegerEncoder.encode(builder, out, largestIndex + 1); } - - public static int decode(BitString bitString) throws DecodingException { - return decode(bitString, 0, bitString.length()); - } - - public static int decode(BitString bitString, int fromIndex, int length) throws DecodingException { - int limit = length - 1; - int end = fromIndex + length; - // must not overflow and must end with "11" - if (length < 2 || limit > FIBONACCI_LIMIT || !bitString.getValue(end - 2) || !bitString.getValue(end - 1)) { - throw new DecodingException("Undecodable FibonacciInteger '" + bitString + "'"); - } - - int value = 0; - for (int i = 0; i < limit; i++) { - if (bitString.getValue(fromIndex + i)) { - value += FIBONACCI_NUMBERS[i]; - } - } - return value; - } - - public static int indexOfEndTag(BitString bitString, int fromIndex) { - int limit = bitString.length() - 1; - int i = fromIndex; - while (i < limit) { - if (bitString.getValue(i)) { - // 1X - if (bitString.getValue(i + 1)) { - // 11 - return i; - } else { - // 10, the next can be skipped - i += 2; - } - } else { - // 0, next - i++; - } - } - return -1; - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FibonacciIntegerRangeEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FibonacciIntegerRangeEncoder.java index 67958875..beef3289 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FibonacciIntegerRangeEncoder.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FibonacciIntegerRangeEncoder.java @@ -1,8 +1,8 @@ package com.iab.gpp.encoder.datatype.encoder; import java.util.Collection; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.error.DecodingException; public class FibonacciIntegerRangeEncoder { @@ -47,41 +47,24 @@ private static void writeGroup(BitStringBuilder builder, int groupStart, int las } } - public static IntegerSet decode(BitString bitString) throws DecodingException { - if (bitString.length() < 12) { - throw new DecodingException("Undecodable FibonacciIntegerRange '" + bitString + "'"); - } - - int count = FixedIntegerEncoder.decode(bitString, 0, 12); - IntegerBitSet value = new IntegerBitSet(); - + public static IntegerSet decode(BitStringReader reader) throws DecodingException { + int count = reader.readInt(12); + IntegerSet value = new IntegerSet(); int offset = 0; - int startIndex = 12; for (int i = 0; i < count; i++) { - boolean group = BooleanEncoder.decode(bitString, startIndex, 1); - startIndex++; - + boolean group = reader.readBool(); if (group) { - int index = FibonacciIntegerEncoder.indexOfEndTag(bitString, startIndex); - int start = FibonacciIntegerEncoder.decode(bitString, startIndex, index + 2 - startIndex) + offset; + int start = reader.readFibonacci() + offset; offset = start; - startIndex = index + 2; - - index = FibonacciIntegerEncoder.indexOfEndTag(bitString, startIndex); - int end = FibonacciIntegerEncoder.decode(bitString, startIndex, index + 2 - startIndex) + offset; + int end = reader.readFibonacci() + offset; offset = end; - startIndex = index + 2; - value.addRange(start, end + 1); } else { - int index = FibonacciIntegerEncoder.indexOfEndTag(bitString, startIndex); - int val = FibonacciIntegerEncoder.decode(bitString, startIndex, index + 2 - startIndex) + offset; + int val = reader.readFibonacci() + offset; offset = val; value.addInt(val); - startIndex = index + 2; } } - return value; } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedBitfieldEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedBitfieldEncoder.java index 5a59decd..5b5b0b3d 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedBitfieldEncoder.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedBitfieldEncoder.java @@ -1,6 +1,5 @@ package com.iab.gpp.encoder.datatype.encoder; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; public class FixedBitfieldEncoder { @@ -11,8 +10,4 @@ public static void encode(BitStringBuilder builder, IntegerSet value, int bitStr BooleanEncoder.encode(builder, value.containsInt(i)); } } - - public static IntegerSet decode(BitString bitString) { - return bitString.toIntegerSet(); - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerEncoder.java index 6b7105ed..f130e6e3 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerEncoder.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerEncoder.java @@ -24,12 +24,12 @@ public static int decode(BitString bitString) throws DecodingException { return decode(bitString, 0, bitString.length()); } - public static int decode(BitString bitString, int fromIndex, int length) throws DecodingException { + public static int decode(BitString bitString, int from, int to) throws DecodingException { int value = 0; - int base = fromIndex + length - 1; + int length = to - from; for (int i = 0; i < length; i++) { - if (bitString.getValue(base - i)) { + if (bitString.getValue(to - (i + 1))) { value += 1 << i; } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerListEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerListEncoder.java index 7140af9c..d21dfc71 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerListEncoder.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerListEncoder.java @@ -1,10 +1,10 @@ package com.iab.gpp.encoder.datatype.encoder; -import java.util.ArrayList; import java.util.List; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; @@ -28,29 +28,11 @@ public static void encode(BitStringBuilder builder, List value, int ele } } - public static List decode(BitString bitString, int elementBitStringLength, int numElements) + public static void decode(FixedIntegerList out, BitStringReader reader, int elementBitStringLength) throws DecodingException { - int length = bitString.length(); - if (length > elementBitStringLength * numElements) { - throw new DecodingException("Undecodable FixedIntegerList '" + bitString + "'"); + int size = out.size(); + for (int i = 0; i < size; i++) { + out.setInt(i, reader.readInt(elementBitStringLength)); } - - if (length % elementBitStringLength != 0) { - throw new DecodingException("Undecodable FixedIntegerList '" + bitString + "'"); - } - - bitString = bitString.expandTo(elementBitStringLength * numElements); - - List value = new ArrayList<>(numElements); - length = bitString.length(); - for (int i = 0; i < length; i += elementBitStringLength) { - value.add(IntegerCache.valueOf(FixedIntegerEncoder.decode(bitString, i, elementBitStringLength))); - } - - while (value.size() < numElements) { - value.add(0); - } - - return value; } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerRangeEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerRangeEncoder.java index a92e2b09..0b12b0ea 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerRangeEncoder.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerRangeEncoder.java @@ -1,8 +1,8 @@ package com.iab.gpp.encoder.datatype.encoder; import java.util.Collection; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.error.DecodingException; public class FixedIntegerRangeEncoder { @@ -43,33 +43,19 @@ private static void writeGroup(BitStringBuilder builder, int groupStart, int las } } - public static IntegerSet decode(BitString bitString) throws DecodingException { - if (bitString.length() < 12) { - throw new DecodingException("Undecodable FixedIntegerRange '" + bitString + "'"); - } - - int count = FixedIntegerEncoder.decode(bitString, 0, 12); - IntegerBitSet value = new IntegerBitSet(); - int startIndex = 12; + public static IntegerSet decode(BitStringReader reader) throws DecodingException { + int count = reader.readInt(12); + IntegerSet value = new IntegerSet(); for (int i = 0; i < count; i++) { - boolean group = BooleanEncoder.decode(bitString, startIndex, 1); - startIndex++; - + boolean group = reader.readBool(); if (group) { - int start = FixedIntegerEncoder.decode(bitString, startIndex, 16); - startIndex += 16; - - int end = FixedIntegerEncoder.decode(bitString, startIndex, 16); - startIndex += 16; - + int start = reader.readInt(16); + int end = reader.readInt(16); value.addRange(start, end + 1); } else { - int val = FixedIntegerEncoder.decode(bitString, startIndex, 16); - value.addInt(val); - startIndex += 16; + value.addInt(reader.readInt(16)); } } - return value; } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedLongEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedLongEncoder.java index 9f0dba27..9f0c6ef5 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedLongEncoder.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedLongEncoder.java @@ -20,12 +20,12 @@ public static void encode(BitStringBuilder builder, long value, int bitStringLen } } - public static long decode(BitString bitString) throws DecodingException { + public static long decode(BitString bitString, int from, int to) throws DecodingException { long value = 0; - int length = bitString.length(); + int length = to - from; for (int i = 0; i < length; i++) { - if (bitString.getValue(length - (i + 1))) { + if (bitString.getValue(to - (i + 1))) { value += 1L << i; } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedStringEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedStringEncoder.java index 8c7784d0..2b6f3cee 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedStringEncoder.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedStringEncoder.java @@ -1,8 +1,7 @@ package com.iab.gpp.encoder.datatype.encoder; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.error.DecodingException; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.error.EncodingException; public class FixedStringEncoder { @@ -26,16 +25,10 @@ public static void encode(BitStringBuilder builder, String value, int stringLeng } } - public static String decode(BitString bitString) { - int length = bitString.length(); - if (length % 6 != 0) { - throw new DecodingException("Undecodable FixedString '" + bitString + "'"); - } - + public static String decode(BitStringReader reader, int length) { StringBuilder value = new StringBuilder(length); - - for (int i = 0; i < length; i += 6) { - int code = FixedIntegerEncoder.decode(bitString, i, 6); + for (int i = 0; i < length; i++) { + int code = reader.readInt(6); if (code == 63) { value.append(SPACE); } else { diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/IntegerBitSet.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/IntegerBitSet.java deleted file mode 100644 index 7ff3483d..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/IntegerBitSet.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.iab.gpp.encoder.datatype.encoder; - -import java.util.BitSet; -import java.util.NoSuchElementException; -import java.util.Spliterator; -import java.util.Spliterators; -import java.util.logging.Logger; -import java.util.PrimitiveIterator.OfInt; -import java.util.stream.IntStream; -import java.util.stream.StreamSupport; - -public final class IntegerBitSet extends BaseIntegerSet { - private static final Logger LOGGER = Logger.getLogger(IntegerBitSet.class.getName()); - - static final int MAX_COLLECTION_SIZE = 8192; - - protected final BitSet bitSet; - protected final int from; - protected final int to; - private final int adjustment; - - public IntegerBitSet(BitSet bitSet, int from, int to, int adjustment) { - this.bitSet = bitSet; - this.from = from; - this.to = to; - this.adjustment = adjustment; - } - - public IntegerBitSet(int limit) { - this(new BitSet(0), 0, limit, 0); - } - - public IntegerBitSet() { - this(MAX_COLLECTION_SIZE); - } - - @Override - public int size() { - OfInt it = iterator(); - int count = 0; - while (it.hasNext()) { - it.next(); - count++; - } - return count; - } - - private int getOffset(int value) { - int offset = from - adjustment + value; - if (offset < from) { - throw new IndexOutOfBoundsException("Negative index provided"); - } - return offset; - } - - @Override - public void clear() { - bitSet.clear(from, to); - } - - @Override - public boolean isEmpty() { - return bitSet.nextSetBit(from) == -1; - } - - @Override - public boolean containsInt(int value) { - int offset = getOffset(value); - return offset < to && bitSet.get(offset); - } - - @Override - public OfInt iterator() { - return new OfInt() { - int cursor = bitSet.nextSetBit(from); - - @Override - public boolean hasNext() { - return cursor < to && cursor != -1; - } - - @Override - public Integer next() { - return IntegerCache.valueOf(nextInt()); - } - - @Override - public int nextInt() { - if (!this.hasNext()) { - throw new NoSuchElementException(); - } - int next = cursor; - cursor = bitSet.nextSetBit(cursor + 1); - return next - from + adjustment; - } - }; - } - - @Override - public Spliterator.OfInt spliterator(){ - return Spliterators.spliteratorUnknownSize( - iterator(), - Spliterator.ORDERED | Spliterator.DISTINCT | Spliterator.IMMUTABLE | Spliterator.NONNULL); - } - - @Override - public IntStream intStream() { - return StreamSupport.intStream(spliterator(), false); - } - - private static final void logOutOfRange(int value) { - LOGGER.warning("Exceeding IntegerBitSet.MAX_COLLECTION_SIZE: "+ value); - } - - public void addRange(int start, int end) { - if (end < start) { - throw new IllegalArgumentException("Negative length range"); - } - int realStart = getOffset(start); - int realEnd = getOffset(end); - if (realStart >= to) { - logOutOfRange(start); - return; - } - if (realEnd > to) { - logOutOfRange(end); - realEnd = to; - } - bitSet.set(realStart, realEnd); - } - - public boolean addInt(int value) { - int offset = getOffset(value); - if (offset >= to) { - logOutOfRange(value); - return false; - } - boolean present = bitSet.get(offset); - if (present) { - return false; - } - bitSet.set(offset, true); - return true; - } - - public boolean removeInt(int value) { - int offset = getOffset(value); - if (offset >= to) { - logOutOfRange(value); - return false; - } - boolean present = bitSet.get(offset); - if (!present) { - return false; - } - bitSet.set(offset, false); - return true; - } -} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/IntegerCache.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/IntegerCache.java index d92823e5..07471ea2 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/IntegerCache.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/IntegerCache.java @@ -1,6 +1,6 @@ package com.iab.gpp.encoder.datatype.encoder; -import static com.iab.gpp.encoder.datatype.encoder.IntegerBitSet.MAX_COLLECTION_SIZE; +import static com.iab.gpp.encoder.datatype.encoder.IntegerSet.MAX_COLLECTION_SIZE; final class IntegerCache { private IntegerCache() {} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/IntegerSet.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/IntegerSet.java index bc9aa3f7..04757d67 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/IntegerSet.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/IntegerSet.java @@ -1,28 +1,226 @@ package com.iab.gpp.encoder.datatype.encoder; +import java.util.AbstractSet; import java.util.Collection; -import java.util.PrimitiveIterator; -import java.util.Set; +import java.util.NoSuchElementException; +import java.util.Spliterator; +import java.util.Spliterators; +import java.util.PrimitiveIterator.OfInt; +import java.util.logging.Logger; import java.util.stream.IntStream; +import java.util.stream.StreamSupport; +import com.iab.gpp.encoder.bitstring.BitSet; -public interface IntegerSet extends Set { - boolean containsInt(int value); +/** + * An optimized implementation of {@literal Set} backed by a {@link java.util.BitSet}. + * Use {@link #containsInt(int)}, {@link #addInt(int)}, and {@link #removeInt(int)} for efficient access. + */ +public final class IntegerSet extends AbstractSet implements Dirtyable { + private static final Logger LOGGER = Logger.getLogger(IntegerSet.class.getName()); - default boolean containsAny(Collection c) { - for (Object e : c) { - if (!contains(e)) { - return false; + static final int MAX_COLLECTION_SIZE = 8192; + + private boolean dirty; + private final BitSet bitSet; + private final int from; + private final int to; + private final int adjustment; + + public IntegerSet(BitSet bitSet, int from, int to, int adjustment) { + this.bitSet = bitSet; + this.from = from; + this.to = to; + this.adjustment = adjustment; + } + + public IntegerSet(int limit) { + this(new BitSet(limit), 0, limit, 0); + } + + public IntegerSet() { + this(new BitSet(), 0, MAX_COLLECTION_SIZE, 0); + } + + @Override + public int size() { + OfInt it = iterator(); + int count = 0; + while (it.hasNext()) { + it.next(); + count++; + } + return count; + } + + private int getOffset(int value) { + int offset = from - adjustment + value; + if (offset < from) { + throw new IndexOutOfBoundsException("Negative index provided"); + } + return offset; + } + + @Override + public void clear() { + dirty = true; + bitSet.clear(from, to); + } + + @Override + public boolean isEmpty() { + return bitSet.nextSetBit(from) == -1; + } + + public boolean containsInt(int value) { + int offset = getOffset(value); + return offset < to && bitSet.get(offset); + } + + @Override + public OfInt iterator() { + return new OfInt() { + int cursor = bitSet.nextSetBit(from); + + @Override + public boolean hasNext() { + return cursor < to && cursor != -1; + } + + @Override + public Integer next() { + return IntegerCache.valueOf(nextInt()); } + + @Override + public int nextInt() { + if (!this.hasNext()) { + throw new NoSuchElementException(); + } + int next = cursor; + cursor = bitSet.nextSetBit(cursor + 1); + return next - from + adjustment; + } + }; + } + + @Override + public Spliterator.OfInt spliterator(){ + return Spliterators.spliteratorUnknownSize( + iterator(), + Spliterator.ORDERED | Spliterator.DISTINCT | Spliterator.IMMUTABLE | Spliterator.NONNULL); + } + + public IntStream intStream() { + return StreamSupport.intStream(spliterator(), false); + } + + private static final void logOutOfRange(int value) { + LOGGER.warning("Exceeding IntegerBitSet.MAX_COLLECTION_SIZE: "+ value); + } + + public void addRange(int start, int end) { + if (end < start) { + throw new IllegalArgumentException("Negative length range"); + } + int realStart = getOffset(start); + int realEnd = getOffset(end); + if (realStart >= to) { + logOutOfRange(start); + return; + } + if (realEnd > to) { + logOutOfRange(end); + realEnd = to; + } + dirty = true; + bitSet.set(realStart, realEnd); + } + + public boolean addInt(int value) { + int offset = getOffset(value); + if (offset >= to) { + logOutOfRange(value); + return false; + } + boolean present = bitSet.get(offset); + if (present) { + return false; + } + bitSet.set(offset); + dirty = true; + return true; + } + + public boolean removeInt(int value) { + int offset = getOffset(value); + if (offset >= to) { + logOutOfRange(value); + return false; } + boolean present = bitSet.get(offset); + if (!present) { + return false; + } + bitSet.clear(offset); + dirty = true; return true; } - boolean addInt(int value); + @Override + public final boolean contains(Object value) { + if (value instanceof Integer) { + return containsInt((Integer) value); + } + return false; + } + + @Override + public final boolean add(Integer value) { + if (value == null) { + return false; + } + return addInt(value); + } + + @Override + public final boolean remove(Object value) { + if (value instanceof Integer) { + return removeInt((Integer) value); + } + return false; + } + + @Override + public boolean removeAll(Collection c) { + boolean modified = false; + for (Integer i : this) { + if (c.contains(i)) { + remove(i); + modified = true; + } + } + return modified; + } - boolean removeInt(int value); + @Override + public boolean retainAll(Collection c) { + boolean modified = false; + for (Integer i : this) { + if (!c.contains(i)) { + remove(i); + modified = true; + } + } + return modified; + } - IntStream intStream(); + @Override + public boolean isDirty() { + return dirty; + } @Override - PrimitiveIterator.OfInt iterator(); -} + public void setDirty(boolean dirty) { + this.dirty = dirty; + } +} \ No newline at end of file diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/OptimizedFibonacciRangeEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/OptimizedFibonacciRangeEncoder.java deleted file mode 100644 index 66160efd..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/OptimizedFibonacciRangeEncoder.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.iab.gpp.encoder.datatype.encoder; - -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.error.EncodingException; - -public class OptimizedFibonacciRangeEncoder { - private OptimizedFibonacciRangeEncoder() {} - - public static void encode(BitStringBuilder builder, IntegerSet value) throws EncodingException { - // TODO: encoding the range before choosing the shortest is inefficient. There is probably a way - // to identify in advance which will be shorter based on the array length and values - BitStringBuilder rangeBitString = new BitStringBuilder(); - int max = FibonacciIntegerRangeEncoder.encode(rangeBitString, value); - int rangeLength = rangeBitString.length(); - int bitFieldLength = max; - - if (rangeLength <= bitFieldLength) { - FixedIntegerEncoder.encode(builder, max, 16); - builder.append(true).append(rangeBitString); - } else { - FixedIntegerEncoder.encode(builder, max, 16); - builder.append(false); - for (int i = 0; i < max; i++) { - builder.append(value.contains(i + 1)); - } - } - } - - public static IntegerSet decode(BitString bitString) throws DecodingException { - if (bitString.length() < 12) { - throw new DecodingException("Undecodable FibonacciIntegerRange '" + bitString + "'"); - } - - if (bitString.getValue(16)) { - return FibonacciIntegerRangeEncoder.decode(bitString.substring(17)); - } else { - BitString bits = bitString.substring(17); - int length = bits.length(); - IntegerBitSet value = new IntegerBitSet(); - for (int i = 0; i < length; i++) { - if (bits.getValue(i)) { - value.addInt(i + 1); - } - } - return value; - } - } -} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/OptimizedFixedRangeEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/OptimizedFixedRangeEncoder.java index 5a5660f8..c264e91a 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/OptimizedFixedRangeEncoder.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/OptimizedFixedRangeEncoder.java @@ -1,7 +1,7 @@ package com.iab.gpp.encoder.datatype.encoder; -import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; @@ -27,23 +27,12 @@ public static void encode(BitStringBuilder builder, IntegerSet value) throws Enc } } - public static IntegerSet decode(BitString bitString) throws DecodingException { - if (bitString.length() < 12) { - throw new DecodingException("Undecodable FixedIntegerRange '" + bitString + "'"); - } - - if (bitString.getValue(16)) { - return FixedIntegerRangeEncoder.decode(bitString.substring(17)); + public static IntegerSet decode(BitStringReader reader) throws DecodingException { + int size = reader.readInt(16); + if (reader.readBool()) { + return FixedIntegerRangeEncoder.decode(reader); } else { - BitString bits = bitString.substring(17); - int length = bits.length(); - IntegerBitSet value = new IntegerBitSet(); - for (int i = 0; i < length; i++) { - if (bits.getValue(i)) { - value.addInt(i + 1); - } - } - return value; + return reader.readIntegerSet(size); } } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/EncodableBitStringFields.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/EncodableBitStringFields.java deleted file mode 100644 index e90c6f2e..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/EncodableBitStringFields.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.iab.gpp.encoder.field; - -import com.iab.gpp.encoder.datatype.AbstractEncodableBitStringDataType; - -public final class EncodableBitStringFields extends Fields> { - - public EncodableBitStringFields(FieldNames fieldNames) { - super(fieldNames); - } - -} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/FieldKey.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/FieldKey.java new file mode 100644 index 00000000..c425bd6d --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/FieldKey.java @@ -0,0 +1,6 @@ +package com.iab.gpp.encoder.field; + +public interface FieldKey { + String getName(); + +} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/FieldNames.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/FieldNames.java index b62037e6..69822878 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/FieldNames.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/FieldNames.java @@ -1,36 +1,42 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.Collections; import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -public final class FieldNames { +public final class FieldNames & FieldKey> { - private final List list; - private final Map map; + private final E[] keys; + private final LinkedHashMap map; + private final Integer[] indices; - FieldNames(String... names) { - this.list = Collections.unmodifiableList(Arrays.asList(names)); + @SafeVarargs + FieldNames(E... keys) { + this.keys = keys; this.map = new LinkedHashMap<>(); - for (int i = 0; i < names.length; i++) { - this.map.put(names[i], i); + this.indices = new Integer[keys[0].getClass().getEnumConstants().length]; + for (int i = 0; i < keys.length; i++) { + E key = keys[i]; + this.map.put(key, key); + this.indices[key.ordinal()] = i; } } - - public boolean contains(String name) { - return map.containsKey(name); + + public int size() { + return keys.length; } - - static final FieldNames of(String... names) { - return new FieldNames(names); + + public E get(int i) { + return keys[i]; } - - public List getNames() { - return list; + + public Integer getIndex(E key) { + if (key == null) { + return null; + } + return indices[key.ordinal()]; } - public Integer convertKey(String key) { + + public E resolveKey(FieldKey key) { return map.get(key); } + } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/Fields.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/Fields.java deleted file mode 100644 index 107b5138..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/Fields.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.iab.gpp.encoder.field; - -import java.util.List; -import com.iab.gpp.encoder.datatype.DataType; - -public abstract class Fields> { - - private final FieldNames fieldNames; - private final Object[] values; - - protected Fields(FieldNames fieldNames) { - this.fieldNames = fieldNames; - this.values = new Object[fieldNames.getNames().size()]; - } - - public List getNames() { - return fieldNames.getNames(); - } - - public boolean containsKey(String key) { - Integer index = fieldNames.convertKey(key); - return index != null && values[index] != null; - } - - public void put(String key, T value) { - Integer index = fieldNames.convertKey(key); - if (index != null) { - values[index] = value; - } - } - - @SuppressWarnings("unchecked") - public T get(int index) { - return (T) values[index]; - } - - public T get(String key) { - Integer index = fieldNames.convertKey(key); - if (index != null) { - return get(index); - } - return null; - } - - public void reset(Fields fields) { - for (String name : fieldNames.getNames()) { - put(name, fields.get(name)); - } - } - - public boolean isDirty() { - int size = getNames().size(); - for (int i = 0; i < size; i++) { - T value = get(i); - if (value != null && value.isDirty()) { - return true; - } - } - return false; - } - - public void markClean() { - int size = getNames().size(); - for (int i = 0; i < size; i++) { - T value = get(i); - if (value != null) { - value.setDirty(false); - } - } - } -} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/GenericFields.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/GenericFields.java deleted file mode 100644 index c644f333..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/GenericFields.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.iab.gpp.encoder.field; - -import com.iab.gpp.encoder.datatype.DataType; - -public final class GenericFields extends Fields> { - - public GenericFields(FieldNames fieldNames) { - super(fieldNames); - } - -} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/HeaderV1Field.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/HeaderV1Field.java index 82c390aa..91066c76 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/HeaderV1Field.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/HeaderV1Field.java @@ -1,14 +1,23 @@ package com.iab.gpp.encoder.field; -public final class HeaderV1Field { - private HeaderV1Field() {} +public enum HeaderV1Field implements FieldKey { + ID("Id"), + VERSION("Version"), + SECTION_IDS("SectionIds"); - public static final String ID = "Id"; - public static final String VERSION = "Version"; - public static final String SECTION_IDS = "SectionIds"; + private String name; + + HeaderV1Field(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames HEADER_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames HEADER_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( HeaderV1Field.ID, HeaderV1Field.VERSION, HeaderV1Field.SECTION_IDS diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/TcfCaV1Field.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/TcfCaV1Field.java index 3f6026b9..6fbe5960 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/TcfCaV1Field.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/TcfCaV1Field.java @@ -1,37 +1,46 @@ package com.iab.gpp.encoder.field; -public final class TcfCaV1Field { - private TcfCaV1Field() {} +public enum TcfCaV1Field implements FieldKey { + VERSION("Version"), + CREATED("Created"), + LAST_UPDATED("LastUpdated"), + CMP_ID("CmpId"), + CMP_VERSION("CmpVersion"), + CONSENT_SCREEN("ConsentScreen"), + CONSENT_LANGUAGE("ConsentLanguage"), + VENDOR_LIST_VERSION("VendorListVersion"), + TCF_POLICY_VERSION("TcfPolicyVersion"), + USE_NON_STANDARD_STACKS("UseNonStandardStacks"), + SPECIAL_FEATURE_EXPRESS_CONSENT("SpecialFeatureExpressConsent"), + PURPOSES_EXPRESS_CONSENT("PurposesExpressConsent"), + PURPOSES_IMPLIED_CONSENT("PurposesImpliedConsent"), + VENDOR_EXPRESS_CONSENT("VendorExpressConsent"), + VENDOR_IMPLIED_CONSENT("VendorImpliedConsent"), + PUB_RESTRICTIONS("PubRestrictions"), - public static final String VERSION = "Version"; - public static final String CREATED = "Created"; - public static final String LAST_UPDATED = "LastUpdated"; - public static final String CMP_ID = "CmpId"; - public static final String CMP_VERSION = "CmpVersion"; - public static final String CONSENT_SCREEN = "ConsentScreen"; - public static final String CONSENT_LANGUAGE = "ConsentLanguage"; - public static final String VENDOR_LIST_VERSION = "VendorListVersion"; - public static final String TCF_POLICY_VERSION = "TcfPolicyVersion"; - public static final String USE_NON_STANDARD_STACKS = "UseNonStandardStacks"; - public static final String SPECIAL_FEATURE_EXPRESS_CONSENT = "SpecialFeatureExpressConsent"; - public static final String PURPOSES_EXPRESS_CONSENT = "PurposesExpressConsent"; - public static final String PURPOSES_IMPLIED_CONSENT = "PurposesImpliedConsent"; - public static final String VENDOR_EXPRESS_CONSENT = "VendorExpressConsent"; - public static final String VENDOR_IMPLIED_CONSENT = "VendorImpliedConsent"; - public static final String PUB_RESTRICTIONS = "PubRestrictions"; + PUB_PURPOSES_SEGMENT_TYPE("PubPurposesSegmentType"), + PUB_PURPOSES_EXPRESS_CONSENT("PubPurposesExpressConsent"), + PUB_PURPOSES_IMPLIED_CONSENT("PubPurposesImpliedConsent"), + NUM_CUSTOM_PURPOSES("NumCustomPurposes"), + CUSTOM_PURPOSES_EXPRESS_CONSENT("CustomPurposesExpressConsent"), + CUSTOM_PURPOSES_IMPLIED_CONSENT("CustomPurposesImpliedConsent"), - public static final String PUB_PURPOSES_SEGMENT_TYPE = "PubPurposesSegmentType"; - public static final String PUB_PURPOSES_EXPRESS_CONSENT = "PubPurposesExpressConsent"; - public static final String PUB_PURPOSES_IMPLIED_CONSENT = "PubPurposesImpliedConsent"; - public static final String NUM_CUSTOM_PURPOSES = "NumCustomPurposes"; - public static final String CUSTOM_PURPOSES_EXPRESS_CONSENT = "CustomPurposesExpressConsent"; - public static final String CUSTOM_PURPOSES_IMPLIED_CONSENT = "CustomPurposesImpliedConsent"; + DISCLOSED_VENDORS_SEGMENT_TYPE("DisclosedVendorsSegmentType"), + DISCLOSED_VENDORS("DisclosedVendors"); - public static final String DISCLOSED_VENDORS_SEGMENT_TYPE = "DisclosedVendorsSegmentType"; - public static final String DISCLOSED_VENDORS = "DisclosedVendors"; + private String name; + + TcfCaV1Field(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames TCFCAV1_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames TCFCAV1_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( TcfCaV1Field.VERSION, TcfCaV1Field.CREATED, TcfCaV1Field.LAST_UPDATED, @@ -52,7 +61,7 @@ private TcfCaV1Field() {} //@formatter:on //@formatter:off - public static final FieldNames TCFCAV1_PUBLISHER_PURPOSES_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames TCFCAV1_PUBLISHER_PURPOSES_SEGMENT_FIELD_NAMES = new FieldNames<>( TcfCaV1Field.PUB_PURPOSES_SEGMENT_TYPE, TcfCaV1Field.PUB_PURPOSES_EXPRESS_CONSENT, TcfCaV1Field.PUB_PURPOSES_IMPLIED_CONSENT, @@ -63,7 +72,7 @@ private TcfCaV1Field() {} //@formatter:on //@formatter:off - public static final FieldNames TCFCAV1_DISCLOSED_VENDORS_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames TCFCAV1_DISCLOSED_VENDORS_SEGMENT_FIELD_NAMES = new FieldNames<>( TcfCaV1Field.DISCLOSED_VENDORS_SEGMENT_TYPE, TcfCaV1Field.DISCLOSED_VENDORS ); diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/TcfEuV2Field.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/TcfEuV2Field.java index 3fa0df6d..5150a6db 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/TcfEuV2Field.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/TcfEuV2Field.java @@ -1,40 +1,49 @@ package com.iab.gpp.encoder.field; -public final class TcfEuV2Field { - private TcfEuV2Field() {} +public enum TcfEuV2Field implements FieldKey { + VERSION("Version"), + CREATED("Created"), + LAST_UPDATED("LastUpdated"), + CMP_ID("CmpId"), + CMP_VERSION("CmpVersion"), + CONSENT_SCREEN("ConsentScreen"), + CONSENT_LANGUAGE("ConsentLanguage"), + VENDOR_LIST_VERSION("VendorListVersion"), + POLICY_VERSION("PolicyVersion"), + IS_SERVICE_SPECIFIC("IsServiceSpecific"), + USE_NON_STANDARD_STACKS("UseNonStandardStacks"), + SPECIAL_FEATURE_OPTINS("SpecialFeatureOptins"), + PURPOSE_CONSENTS("PurposeConsents"), + PURPOSE_LEGITIMATE_INTERESTS("PurposeLegitimateInterests"), + PURPOSE_ONE_TREATMENT("PurposeOneTreatment"), + PUBLISHER_COUNTRY_CODE("PublisherCountryCode"), + VENDOR_CONSENTS("VendorConsents"), + VENDOR_LEGITIMATE_INTERESTS("VendorLegitimateInterests"), + PUBLISHER_RESTRICTIONS("PublisherRestrictions"), + PUBLISHER_PURPOSES_SEGMENT_TYPE("PublisherPurposesSegmentType"), + PUBLISHER_CONSENTS("PublisherConsents"), + PUBLISHER_LEGITIMATE_INTERESTS("PublisherLegitimateInterests"), + NUM_CUSTOM_PURPOSES("NumCustomPurposes"), + PUBLISHER_CUSTOM_CONSENTS("PublisherCustomConsents"), + PUBLISHER_CUSTOM_LEGITIMATE_INTERESTS("PublisherCustomLegitimateInterests"), + VENDORS_ALLOWED_SEGMENT_TYPE("VendorsAllowedSegmentType"), + VENDORS_ALLOWED("VendorsAllowed"), + VENDORS_DISCLOSED_SEGMENT_TYPE("VendorsDisclosedSegmentType"), + VENDORS_DISCLOSED("VendorsDisclosed"); - public static final String VERSION = "Version"; - public static final String CREATED = "Created"; - public static final String LAST_UPDATED = "LastUpdated"; - public static final String CMP_ID = "CmpId"; - public static final String CMP_VERSION = "CmpVersion"; - public static final String CONSENT_SCREEN = "ConsentScreen"; - public static final String CONSENT_LANGUAGE = "ConsentLanguage"; - public static final String VENDOR_LIST_VERSION = "VendorListVersion"; - public static final String POLICY_VERSION = "PolicyVersion"; - public static final String IS_SERVICE_SPECIFIC = "IsServiceSpecific"; - public static final String USE_NON_STANDARD_STACKS = "UseNonStandardStacks"; - public static final String SPECIAL_FEATURE_OPTINS = "SpecialFeatureOptins"; - public static final String PURPOSE_CONSENTS = "PurposeConsents"; - public static final String PURPOSE_LEGITIMATE_INTERESTS = "PurposeLegitimateInterests"; - public static final String PURPOSE_ONE_TREATMENT = "PurposeOneTreatment"; - public static final String PUBLISHER_COUNTRY_CODE = "PublisherCountryCode"; - public static final String VENDOR_CONSENTS = "VendorConsents"; - public static final String VENDOR_LEGITIMATE_INTERESTS = "VendorLegitimateInterests"; - public static final String PUBLISHER_RESTRICTIONS = "PublisherRestrictions"; - public static final String PUBLISHER_PURPOSES_SEGMENT_TYPE = "PublisherPurposesSegmentType"; - public static final String PUBLISHER_CONSENTS = "PublisherConsents"; - public static final String PUBLISHER_LEGITIMATE_INTERESTS = "PublisherLegitimateInterests"; - public static final String NUM_CUSTOM_PURPOSES = "NumCustomPurposes"; - public static final String PUBLISHER_CUSTOM_CONSENTS = "PublisherCustomConsents"; - public static final String PUBLISHER_CUSTOM_LEGITIMATE_INTERESTS = "PublisherCustomLegitimateInterests"; - public static final String VENDORS_ALLOWED_SEGMENT_TYPE = "VendorsAllowedSegmentType"; - public static final String VENDORS_ALLOWED = "VendorsAllowed"; - public static final String VENDORS_DISCLOSED_SEGMENT_TYPE = "VendorsDisclosedSegmentType"; - public static final String VENDORS_DISCLOSED = "VendorsDisclosed"; + private String name; + + TcfEuV2Field(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames TCFEUV2_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames TCFEUV2_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( TcfEuV2Field.VERSION, TcfEuV2Field.CREATED, TcfEuV2Field.LAST_UPDATED, @@ -58,7 +67,7 @@ private TcfEuV2Field() {} //@formatter:on //@formatter:off - public static final FieldNames TCFEUV2_PUBLISHER_PURPOSES_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames TCFEUV2_PUBLISHER_PURPOSES_SEGMENT_FIELD_NAMES = new FieldNames<>( TcfEuV2Field.PUBLISHER_PURPOSES_SEGMENT_TYPE, TcfEuV2Field.PUBLISHER_CONSENTS, TcfEuV2Field.PUBLISHER_LEGITIMATE_INTERESTS, @@ -69,14 +78,14 @@ private TcfEuV2Field() {} //@formatter:on //@formatter:off - public static final FieldNames TCFEUV2_VENDORS_ALLOWED_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames TCFEUV2_VENDORS_ALLOWED_SEGMENT_FIELD_NAMES = new FieldNames<>( TcfEuV2Field.VENDORS_ALLOWED_SEGMENT_TYPE, TcfEuV2Field.VENDORS_ALLOWED ); //@formatter:on //@formatter:off - public static final FieldNames TCFEUV2_VENDORS_DISCLOSED_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames TCFEUV2_VENDORS_DISCLOSED_SEGMENT_FIELD_NAMES = new FieldNames<>( TcfEuV2Field.VENDORS_DISCLOSED_SEGMENT_TYPE, TcfEuV2Field.VENDORS_DISCLOSED ); diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsCaField.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsCaField.java index 3b5ef779..2dd3a51c 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsCaField.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsCaField.java @@ -1,27 +1,36 @@ package com.iab.gpp.encoder.field; -public final class UsCaField { - private UsCaField() {} +public enum UsCaField implements FieldKey { + VERSION("Version"), + SALE_OPT_OUT_NOTICE("SaleOptOutNotice"), + SHARING_OPT_OUT_NOTICE("SharingOptOutNotice"), + SENSITIVE_DATA_LIMIT_USE_NOTICE("SensitiveDataLimitUseNotice"), + SALE_OPT_OUT("SaleOptOut"), + SHARING_OPT_OUT("SharingOptOut"), + SENSITIVE_DATA_PROCESSING("SensitiveDataProcessing"), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS("KnownChildSensitiveDataConsents"), + PERSONAL_DATA_CONSENTS("PersonalDataConsents"), + MSPA_COVERED_TRANSACTION("MspaCoveredTransaction"), + MSPA_OPT_OUT_OPTION_MODE("MspaOptOutOptionMode"), + MSPA_SERVICE_PROVIDER_MODE("MspaServiceProviderMode"), - public static final String VERSION = "Version"; - public static final String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static final String SHARING_OPT_OUT_NOTICE = "SharingOptOutNotice"; - public static final String SENSITIVE_DATA_LIMIT_USE_NOTICE = "SensitiveDataLimitUseNotice"; - public static final String SALE_OPT_OUT = "SaleOptOut"; - public static final String SHARING_OPT_OUT = "SharingOptOut"; - public static final String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; - public static final String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; - public static final String PERSONAL_DATA_CONSENTS = "PersonalDataConsents"; - public static final String MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static final String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static final String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + GPC_SEGMENT_TYPE("GpcSegmentType"), + GPC_SEGMENT_INCLUDED("GpcSegmentIncluded"), + GPC("Gpc"); - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; + private String name; + + UsCaField(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames USCA_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USCA_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( UsCaField.VERSION, UsCaField.SALE_OPT_OUT_NOTICE, UsCaField.SHARING_OPT_OUT_NOTICE, @@ -38,7 +47,7 @@ private UsCaField() {} //@formatter:on //@formatter:off - public static final FieldNames USCA_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USCA_GPC_SEGMENT_FIELD_NAMES = new FieldNames<>( UsCaField.GPC_SEGMENT_TYPE, UsCaField.GPC_SEGMENT_INCLUDED, UsCaField.GPC diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsCoField.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsCoField.java index 516c32a8..a2366deb 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsCoField.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsCoField.java @@ -1,26 +1,35 @@ package com.iab.gpp.encoder.field; -public final class UsCoField { - private UsCoField() {} +public enum UsCoField implements FieldKey { + VERSION("Version"), + SHARING_NOTICE("SharingNotice"), + SALE_OPT_OUT_NOTICE("SaleOptOutNotice"), + TARGETED_ADVERTISING_OPT_OUT_NOTICE("TargetedAdvertisingOptOutNotice"), + SALE_OPT_OUT("SaleOptOut"), + TARGETED_ADVERTISING_OPT_OUT("TargetedAdvertisingOptOut"), + SENSITIVE_DATA_PROCESSING("SensitiveDataProcessing"), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS("KnownChildSensitiveDataConsents"), + MSPA_COVERED_TRANSACTION("MspaCoveredTransaction"), + MSPA_OPT_OUT_OPTION_MODE("MspaOptOutOptionMode"), + MSPA_SERVICE_PROVIDER_MODE("MspaServiceProviderMode"), - public static final String VERSION = "Version"; - public static final String SHARING_NOTICE = "SharingNotice"; - public static final String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static final String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; - public static final String SALE_OPT_OUT = "SaleOptOut"; - public static final String TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut"; - public static final String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; - public static final String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; - public static final String MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static final String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static final String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + GPC_SEGMENT_TYPE("GpcSegmentType"), + GPC_SEGMENT_INCLUDED("GpcSegmentIncluded"), + GPC("Gpc"); - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; + private String name; + + UsCoField(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames USCO_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USCO_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( UsCoField.VERSION, UsCoField.SHARING_NOTICE, UsCoField.SALE_OPT_OUT_NOTICE, @@ -36,7 +45,7 @@ private UsCoField() {} //@formatter:on //@formatter:off - public static final FieldNames USCO_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USCO_GPC_SEGMENT_FIELD_NAMES = new FieldNames<>( UsCoField.GPC_SEGMENT_TYPE, UsCoField.GPC_SEGMENT_INCLUDED, UsCoField.GPC diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsCtField.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsCtField.java index 56700df9..dd605815 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsCtField.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsCtField.java @@ -1,26 +1,35 @@ package com.iab.gpp.encoder.field; -public final class UsCtField { - private UsCtField() {} +public enum UsCtField implements FieldKey { + VERSION("Version"), + SHARING_NOTICE("SharingNotice"), + SALE_OPT_OUT_NOTICE("SaleOptOutNotice"), + TARGETED_ADVERTISING_OPT_OUT_NOTICE("TargetedAdvertisingOptOutNotice"), + SALE_OPT_OUT("SaleOptOut"), + TARGETED_ADVERTISING_OPT_OUT("TargetedAdvertisingOptOut"), + SENSITIVE_DATA_PROCESSING("SensitiveDataProcessing"), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS("KnownChildSensitiveDataConsents"), + MSPA_COVERED_TRANSACTION("MspaCoveredTransaction"), + MSPA_OPT_OUT_OPTION_MODE("MspaOptOutOptionMode"), + MSPA_SERVICE_PROVIDER_MODE("MspaServiceProviderMode"), - public static final String VERSION = "Version"; - public static final String SHARING_NOTICE = "SharingNotice"; - public static final String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static final String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; - public static final String SALE_OPT_OUT = "SaleOptOut"; - public static final String TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut"; - public static final String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; - public static final String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; - public static final String MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static final String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static final String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + GPC_SEGMENT_TYPE("GpcSegmentType"), + GPC_SEGMENT_INCLUDED("GpcSegmentIncluded"), + GPC("Gpc"); - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; + private String name; + + UsCtField(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames USCT_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USCT_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( UsCtField.VERSION, UsCtField.SHARING_NOTICE, UsCtField.SALE_OPT_OUT_NOTICE, @@ -36,7 +45,7 @@ private UsCtField() {} //@formatter:on //@formatter:off - public static final FieldNames USCT_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USCT_GPC_SEGMENT_FIELD_NAMES = new FieldNames<>( UsCtField.GPC_SEGMENT_TYPE, UsCtField.GPC_SEGMENT_INCLUDED, UsCtField.GPC diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsDeField.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsDeField.java index 7e52bcaf..e8fe98b2 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsDeField.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsDeField.java @@ -1,27 +1,36 @@ package com.iab.gpp.encoder.field; -public final class UsDeField { - private UsDeField() {} +public enum UsDeField implements FieldKey { + VERSION("Version"), + PROCESSING_NOTICE("ProcessingNotice"), + SALE_OPT_OUT_NOTICE("SaleOptOutNotice"), + TARGETED_ADVERTISING_OPT_OUT_NOTICE("TargetedAdvertisingOptOutNotice"), + SALE_OPT_OUT("SaleOptOut"), + TARGETED_ADVERTISING_OPT_OUT("TargetedAdvertisingOptOut"), + SENSITIVE_DATA_PROCESSING("SensitiveDataProcessing"), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS("KnownChildSensitiveDataConsents"), + ADDITIONAL_DATA_PROCESSING_CONSENT("AdditionalDataProcessingConsent"), + MSPA_COVERED_TRANSACTION("MspaCoveredTransaction"), + MSPA_OPT_OUT_OPTION_MODE("MspaOptOutOptionMode"), + MSPA_SERVICE_PROVIDER_MODE("MspaServiceProviderMode"), - public static final String VERSION = "Version"; - public static final String PROCESSING_NOTICE = "ProcessingNotice"; - public static final String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static final String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; - public static final String SALE_OPT_OUT = "SaleOptOut"; - public static final String TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut"; - public static final String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; - public static final String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; - public static final String ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent"; - public static final String MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static final String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static final String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + GPC_SEGMENT_TYPE("GpcSegmentType"), + GPC_SEGMENT_INCLUDED("GpcSegmentIncluded"), + GPC("Gpc"); - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; + private String name; + + UsDeField(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames USDE_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USDE_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( UsDeField.VERSION, UsDeField.PROCESSING_NOTICE, UsDeField.SALE_OPT_OUT_NOTICE, @@ -38,7 +47,7 @@ private UsDeField() {} //@formatter:on //@formatter:off - public static final FieldNames USDE_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USDE_GPC_SEGMENT_FIELD_NAMES = new FieldNames<>( UsDeField.GPC_SEGMENT_TYPE, UsDeField.GPC_SEGMENT_INCLUDED, UsDeField.GPC diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsFlField.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsFlField.java index ae50962c..170e7ff9 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsFlField.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsFlField.java @@ -1,23 +1,32 @@ package com.iab.gpp.encoder.field; -public final class UsFlField { - private UsFlField() {} +public enum UsFlField implements FieldKey { + VERSION("Version"), + PROCESSING_NOTICE("ProcessingNotice"), + SALE_OPT_OUT_NOTICE("SaleOptOutNotice"), + TARGETED_ADVERTISING_OPT_OUT_NOTICE("TargetedAdvertisingOptOutNotice"), + SALE_OPT_OUT("SaleOptOut"), + TARGETED_ADVERTISING_OPT_OUT("TargetedAdvertisingOptOut"), + SENSITIVE_DATA_PROCESSING("SensitiveDataProcessing"), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS("KnownChildSensitiveDataConsents"), + ADDITIONAL_DATA_PROCESSING_CONSENT("AdditionalDataProcessingConsent"), + MSPA_COVERED_TRANSACTION("MspaCoveredTransaction"), + MSPA_OPT_OUT_OPTION_MODE("MspaOptOutOptionMode"), + MSPA_SERVICE_PROVIDER_MODE("MspaServiceProviderMode"); - public static final String VERSION = "Version"; - public static final String PROCESSING_NOTICE = "ProcessingNotice"; - public static final String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static final String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; - public static final String SALE_OPT_OUT = "SaleOptOut"; - public static final String TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut"; - public static final String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; - public static final String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; - public static final String ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent"; - public static final String MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static final String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static final String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + private String name; + + UsFlField(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames USFL_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USFL_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( UsFlField.VERSION, UsFlField.PROCESSING_NOTICE, UsFlField.SALE_OPT_OUT_NOTICE, diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsIaField.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsIaField.java index 90d2662a..3b3bb7cb 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsIaField.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsIaField.java @@ -1,27 +1,36 @@ package com.iab.gpp.encoder.field; -public final class UsIaField { - private UsIaField() {} +public enum UsIaField implements FieldKey { + VERSION("Version"), + PROCESSING_NOTICE("ProcessingNotice"), + SALE_OPT_OUT_NOTICE("SaleOptOutNotice"), + TARGETED_ADVERTISING_OPT_OUT_NOTICE("TargetedAdvertisingOptOutNotice"), + SENSITIVE_DATA_OPT_OUT_NOTICE("SensitiveDataOptOutNotice"), + SALE_OPT_OUT("SaleOptOut"), + TARGETED_ADVERTISING_OPT_OUT("TargetedAdvertisingOptOut"), + SENSITIVE_DATA_PROCESSING("SensitiveDataProcessing"), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS("KnownChildSensitiveDataConsents"), + MSPA_COVERED_TRANSACTION("MspaCoveredTransaction"), + MSPA_OPT_OUT_OPTION_MODE("MspaOptOutOptionMode"), + MSPA_SERVICE_PROVIDER_MODE("MspaServiceProviderMode"), - public static final String VERSION = "Version"; - public static final String PROCESSING_NOTICE = "ProcessingNotice"; - public static final String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static final String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; - public static final String SENSITIVE_DATA_OPT_OUT_NOTICE = "SensitiveDataOptOutNotice"; - public static final String SALE_OPT_OUT = "SaleOptOut"; - public static final String TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut"; - public static final String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; - public static final String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; - public static final String MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static final String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static final String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + GPC_SEGMENT_TYPE("GpcSegmentType"), + GPC_SEGMENT_INCLUDED("GpcSegmentIncluded"), + GPC("Gpc"); - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; + private String name; + + UsIaField(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames USIA_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USIA_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( UsIaField.VERSION, UsIaField.PROCESSING_NOTICE, UsIaField.SALE_OPT_OUT_NOTICE, @@ -38,7 +47,7 @@ private UsIaField() {} //@formatter:on //@formatter:off - public static final FieldNames USIA_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USIA_GPC_SEGMENT_FIELD_NAMES = new FieldNames<>( UsIaField.GPC_SEGMENT_TYPE, UsIaField.GPC_SEGMENT_INCLUDED, UsIaField.GPC diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsMtField.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsMtField.java index f3946b6f..07694812 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsMtField.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsMtField.java @@ -1,27 +1,36 @@ package com.iab.gpp.encoder.field; -public final class UsMtField { - private UsMtField() {} +public enum UsMtField implements FieldKey { + VERSION("Version"), + SHARING_NOTICE("SharingNotice"), + SALE_OPT_OUT_NOTICE("SaleOptOutNotice"), + TARGETED_ADVERTISING_OPT_OUT_NOTICE("TargetedAdvertisingOptOutNotice"), + SALE_OPT_OUT("SaleOptOut"), + TARGETED_ADVERTISING_OPT_OUT("TargetedAdvertisingOptOut"), + SENSITIVE_DATA_PROCESSING("SensitiveDataProcessing"), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS("KnownChildSensitiveDataConsents"), + ADDITIONAL_DATA_PROCESSING_CONSENT("AdditionalDataProcessingConsent"), + MSPA_COVERED_TRANSACTION("MspaCoveredTransaction"), + MSPA_OPT_OUT_OPTION_MODE("MspaOptOutOptionMode"), + MSPA_SERVICE_PROVIDER_MODE("MspaServiceProviderMode"), - public static final String VERSION = "Version"; - public static final String SHARING_NOTICE = "SharingNotice"; - public static final String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static final String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; - public static final String SALE_OPT_OUT = "SaleOptOut"; - public static final String TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut"; - public static final String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; - public static final String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; - public static final String ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent"; - public static final String MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static final String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static final String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + GPC_SEGMENT_TYPE("GpcSegmentType"), + GPC_SEGMENT_INCLUDED("GpcSegmentIncluded"), + GPC("Gpc"); - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; + private String name; + + UsMtField(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames USMT_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USMT_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( UsMtField.VERSION, UsMtField.SHARING_NOTICE, UsMtField.SALE_OPT_OUT_NOTICE, @@ -38,7 +47,7 @@ private UsMtField() {} //@formatter:on //@formatter:off - public static FieldNames USMT_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( + public static FieldNames USMT_GPC_SEGMENT_FIELD_NAMES = new FieldNames<>( UsMtField.GPC_SEGMENT_TYPE, UsMtField.GPC_SEGMENT_INCLUDED, UsMtField.GPC diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsNatField.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsNatField.java index d43cb586..de9c3822 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsNatField.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsNatField.java @@ -1,31 +1,40 @@ package com.iab.gpp.encoder.field; -public final class UsNatField { - private UsNatField() {} +public enum UsNatField implements FieldKey { + VERSION("Version"), + SHARING_NOTICE("SharingNotice"), + SALE_OPT_OUT_NOTICE("SaleOptOutNotice"), + SHARING_OPT_OUT_NOTICE("SharingOptOutNotice"), + TARGETED_ADVERTISING_OPT_OUT_NOTICE("TargetedAdvertisingOptOutNotice"), + SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE("SensitiveDataProcessingOptOutNotice"), + SENSITIVE_DATA_LIMIT_USE_NOTICE("SensitiveDataLimitUseNotice"), + SALE_OPT_OUT("SaleOptOut"), + SHARING_OPT_OUT("SharingOptOut"), + TARGETED_ADVERTISING_OPT_OUT("TargetedAdvertisingOptOut"), + SENSITIVE_DATA_PROCESSING("SensitiveDataProcessing"), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS("KnownChildSensitiveDataConsents"), + PERSONAL_DATA_CONSENTS("PersonalDataConsents"), + MSPA_COVERED_TRANSACTION("MspaCoveredTransaction"), + MSPA_OPT_OUT_OPTION_MODE("MspaOptOutOptionMode"), + MSPA_SERVICE_PROVIDER_MODE("MspaServiceProviderMode"), - public static final String VERSION = "Version"; - public static final String SHARING_NOTICE = "SharingNotice"; - public static final String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static final String SHARING_OPT_OUT_NOTICE = "SharingOptOutNotice"; - public static final String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; - public static final String SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE = "SensitiveDataProcessingOptOutNotice"; - public static final String SENSITIVE_DATA_LIMIT_USE_NOTICE = "SensitiveDataLimitUseNotice"; - public static final String SALE_OPT_OUT = "SaleOptOut"; - public static final String SHARING_OPT_OUT = "SharingOptOut"; - public static final String TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut"; - public static final String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; - public static final String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; - public static final String PERSONAL_DATA_CONSENTS = "PersonalDataConsents"; - public static final String MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static final String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static final String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + GPC_SEGMENT_TYPE("GpcSegmentType"), + GPC_SEGMENT_INCLUDED("GpcSegmentIncluded"), + GPC("Gpc"); - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; + private String name; + + UsNatField(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames USNAT_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USNAT_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( UsNatField.VERSION, UsNatField.SHARING_NOTICE, UsNatField.SALE_OPT_OUT_NOTICE, @@ -46,7 +55,7 @@ private UsNatField() {} //@formatter:on //@formatter:off - public static final FieldNames USNAT_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USNAT_GPC_SEGMENT_FIELD_NAMES = new FieldNames<>( UsNatField.GPC_SEGMENT_TYPE, UsNatField.GPC_SEGMENT_INCLUDED, UsNatField.GPC diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsNeField.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsNeField.java index 93a99130..a556270d 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsNeField.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsNeField.java @@ -1,27 +1,36 @@ package com.iab.gpp.encoder.field; -public final class UsNeField { - private UsNeField() {} +public enum UsNeField implements FieldKey { + VERSION("Version"), + PROCESSING_NOTICE("ProcessingNotice"), + SALE_OPT_OUT_NOTICE("SaleOptOutNotice"), + TARGETED_ADVERTISING_OPT_OUT_NOTICE("TargetedAdvertisingOptOutNotice"), + SALE_OPT_OUT("SaleOptOut"), + TARGETED_ADVERTISING_OPT_OUT("TargetedAdvertisingOptOut"), + SENSITIVE_DATA_PROCESSING("SensitiveDataProcessing"), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS("KnownChildSensitiveDataConsents"), + ADDITIONAL_DATA_PROCESSING_CONSENT("AdditionalDataProcessingConsent"), + MSPA_COVERED_TRANSACTION("MspaCoveredTransaction"), + MSPA_OPT_OUT_OPTION_MODE("MspaOptOutOptionMode"), + MSPA_SERVICE_PROVIDER_MODE("MspaServiceProviderMode"), - public static final String VERSION = "Version"; - public static final String PROCESSING_NOTICE = "ProcessingNotice"; - public static final String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static final String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; - public static final String SALE_OPT_OUT = "SaleOptOut"; - public static final String TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut"; - public static final String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; - public static final String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; - public static final String ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent"; - public static final String MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static final String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static final String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + GPC_SEGMENT_TYPE("GpcSegmentType"), + GPC_SEGMENT_INCLUDED("GpcSegmentIncluded"), + GPC("Gpc"); - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; + private String name; + + UsNeField(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames USNE_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USNE_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( UsNeField.VERSION, UsNeField.PROCESSING_NOTICE, UsNeField.SALE_OPT_OUT_NOTICE, @@ -38,7 +47,7 @@ private UsNeField() {} //@formatter:on //@formatter:off - public static final FieldNames USNE_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USNE_GPC_SEGMENT_FIELD_NAMES = new FieldNames<>( UsNeField.GPC_SEGMENT_TYPE, UsNeField.GPC_SEGMENT_INCLUDED, UsNeField.GPC diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsNhField.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsNhField.java index 44b99fbe..7247c62e 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsNhField.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsNhField.java @@ -1,27 +1,36 @@ package com.iab.gpp.encoder.field; -public final class UsNhField { - private UsNhField() {} +public enum UsNhField implements FieldKey { + VERSION("Version"), + PROCESSING_NOTICE("ProcessingNotice"), + SALE_OPT_OUT_NOTICE("SaleOptOutNotice"), + TARGETED_ADVERTISING_OPT_OUT_NOTICE("TargetedAdvertisingOptOutNotice"), + SALE_OPT_OUT("SaleOptOut"), + TARGETED_ADVERTISING_OPT_OUT("TargetedAdvertisingOptOut"), + SENSITIVE_DATA_PROCESSING("SensitiveDataProcessing"), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS("KnownChildSensitiveDataConsents"), + ADDITIONAL_DATA_PROCESSING_CONSENT("AdditionalDataProcessingConsent"), + MSPA_COVERED_TRANSACTION("MspaCoveredTransaction"), + MSPA_OPT_OUT_OPTION_MODE("MspaOptOutOptionMode"), + MSPA_SERVICE_PROVIDER_MODE("MspaServiceProviderMode"), - public static final String VERSION = "Version"; - public static final String PROCESSING_NOTICE = "ProcessingNotice"; - public static final String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static final String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; - public static final String SALE_OPT_OUT = "SaleOptOut"; - public static final String TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut"; - public static final String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; - public static final String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; - public static final String ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent"; - public static final String MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static final String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static final String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + GPC_SEGMENT_TYPE("GpcSegmentType"), + GPC_SEGMENT_INCLUDED("GpcSegmentIncluded"), + GPC("Gpc"); - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; + private String name; + + UsNhField(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames USNH_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USNH_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( UsNhField.VERSION, UsNhField.PROCESSING_NOTICE, UsNhField.SALE_OPT_OUT_NOTICE, @@ -38,7 +47,7 @@ private UsNhField() {} //@formatter:on //@formatter:off - public static final FieldNames USNH_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USNH_GPC_SEGMENT_FIELD_NAMES = new FieldNames<>( UsNhField.GPC_SEGMENT_TYPE, UsNhField.GPC_SEGMENT_INCLUDED, UsNhField.GPC diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsNjField.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsNjField.java index 1ef95e28..d47d15b1 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsNjField.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsNjField.java @@ -1,27 +1,36 @@ package com.iab.gpp.encoder.field; -public final class UsNjField { - private UsNjField() {} +public enum UsNjField implements FieldKey { + VERSION("Version"), + PROCESSING_NOTICE("ProcessingNotice"), + SALE_OPT_OUT_NOTICE("SaleOptOutNotice"), + TARGETED_ADVERTISING_OPT_OUT_NOTICE("TargetedAdvertisingOptOutNotice"), + SALE_OPT_OUT("SaleOptOut"), + TARGETED_ADVERTISING_OPT_OUT("TargetedAdvertisingOptOut"), + SENSITIVE_DATA_PROCESSING("SensitiveDataProcessing"), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS("KnownChildSensitiveDataConsents"), + ADDITIONAL_DATA_PROCESSING_CONSENT("AdditionalDataProcessingConsent"), + MSPA_COVERED_TRANSACTION("MspaCoveredTransaction"), + MSPA_OPT_OUT_OPTION_MODE("MspaOptOutOptionMode"), + MSPA_SERVICE_PROVIDER_MODE("MspaServiceProviderMode"), - public static final String VERSION = "Version"; - public static final String PROCESSING_NOTICE = "ProcessingNotice"; - public static final String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static final String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; - public static final String SALE_OPT_OUT = "SaleOptOut"; - public static final String TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut"; - public static final String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; - public static final String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; - public static final String ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent"; - public static final String MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static final String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static final String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + GPC_SEGMENT_TYPE("GpcSegmentType"), + GPC_SEGMENT_INCLUDED("GpcSegmentIncluded"), + GPC("Gpc"); - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; + private String name; + + UsNjField(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames USNJ_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USNJ_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( UsNjField.VERSION, UsNjField.PROCESSING_NOTICE, UsNjField.SALE_OPT_OUT_NOTICE, @@ -38,7 +47,7 @@ private UsNjField() {} //@formatter:on //@formatter:off - public static final FieldNames USNJ_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USNJ_GPC_SEGMENT_FIELD_NAMES = new FieldNames<>( UsNjField.GPC_SEGMENT_TYPE, UsNjField.GPC_SEGMENT_INCLUDED, UsNjField.GPC diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsOrField.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsOrField.java index adf05255..f2faafa2 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsOrField.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsOrField.java @@ -1,27 +1,36 @@ package com.iab.gpp.encoder.field; -public final class UsOrField { - private UsOrField() {} +public enum UsOrField implements FieldKey { + VERSION("Version"), + PROCESSING_NOTICE("ProcessingNotice"), + SALE_OPT_OUT_NOTICE("SaleOptOutNotice"), + TARGETED_ADVERTISING_OPT_OUT_NOTICE("TargetedAdvertisingOptOutNotice"), + SALE_OPT_OUT("SaleOptOut"), + TARGETED_ADVERTISING_OPT_OUT("TargetedAdvertisingOptOut"), + SENSITIVE_DATA_PROCESSING("SensitiveDataProcessing"), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS("KnownChildSensitiveDataConsents"), + ADDITIONAL_DATA_PROCESSING_CONSENT("AdditionalDataProcessingConsent"), + MSPA_COVERED_TRANSACTION("MspaCoveredTransaction"), + MSPA_OPT_OUT_OPTION_MODE("MspaOptOutOptionMode"), + MSPA_SERVICE_PROVIDER_MODE("MspaServiceProviderMode"), - public static final String VERSION = "Version"; - public static final String PROCESSING_NOTICE = "ProcessingNotice"; - public static final String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static final String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; - public static final String SALE_OPT_OUT = "SaleOptOut"; - public static final String TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut"; - public static final String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; - public static final String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; - public static final String ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent"; - public static final String MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static final String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static final String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + GPC_SEGMENT_TYPE("GpcSegmentType"), + GPC_SEGMENT_INCLUDED("GpcSegmentIncluded"), + GPC("Gpc"); - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; + private String name; + + UsOrField(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames USOR_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USOR_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( UsOrField.VERSION, UsOrField.PROCESSING_NOTICE, UsOrField.SALE_OPT_OUT_NOTICE, @@ -38,7 +47,7 @@ private UsOrField() {} //@formatter:on //@formatter:off - public static final FieldNames USOR_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USOR_GPC_SEGMENT_FIELD_NAMES = new FieldNames<>( UsOrField.GPC_SEGMENT_TYPE, UsOrField.GPC_SEGMENT_INCLUDED, UsOrField.GPC diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsTnField.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsTnField.java index 4271199e..09477e53 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsTnField.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsTnField.java @@ -1,27 +1,36 @@ package com.iab.gpp.encoder.field; -public final class UsTnField { - private UsTnField() {} +public enum UsTnField implements FieldKey { + VERSION("Version"), + PROCESSING_NOTICE("ProcessingNotice"), + SALE_OPT_OUT_NOTICE("SaleOptOutNotice"), + TARGETED_ADVERTISING_OPT_OUT_NOTICE("TargetedAdvertisingOptOutNotice"), + SALE_OPT_OUT("SaleOptOut"), + TARGETED_ADVERTISING_OPT_OUT("TargetedAdvertisingOptOut"), + SENSITIVE_DATA_PROCESSING("SensitiveDataProcessing"), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS("KnownChildSensitiveDataConsents"), + ADDITIONAL_DATA_PROCESSING_CONSENT("AdditionalDataProcessingConsent"), + MSPA_COVERED_TRANSACTION("MspaCoveredTransaction"), + MSPA_OPT_OUT_OPTION_MODE("MspaOptOutOptionMode"), + MSPA_SERVICE_PROVIDER_MODE("MspaServiceProviderMode"), - public static final String VERSION = "Version"; - public static final String PROCESSING_NOTICE = "ProcessingNotice"; - public static final String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static final String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; - public static final String SALE_OPT_OUT = "SaleOptOut"; - public static final String TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut"; - public static final String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; - public static final String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; - public static final String ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent"; - public static final String MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static final String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static final String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + GPC_SEGMENT_TYPE("GpcSegmentType"), + GPC_SEGMENT_INCLUDED("GpcSegmentIncluded"), + GPC("Gpc"); - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; + private String name; + + UsTnField(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames USTN_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USTN_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( UsTnField.VERSION, UsTnField.PROCESSING_NOTICE, UsTnField.SALE_OPT_OUT_NOTICE, @@ -38,7 +47,7 @@ private UsTnField() {} //@formatter:on //@formatter:off - public static final FieldNames USTN_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USTN_GPC_SEGMENT_FIELD_NAMES = new FieldNames<>( UsTnField.GPC_SEGMENT_TYPE, UsTnField.GPC_SEGMENT_INCLUDED, UsTnField.GPC diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsTxField.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsTxField.java index 5729593a..f441fe3b 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsTxField.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsTxField.java @@ -1,27 +1,36 @@ package com.iab.gpp.encoder.field; -public final class UsTxField { - private UsTxField() {} +public enum UsTxField implements FieldKey { + VERSION("Version"), + PROCESSING_NOTICE("ProcessingNotice"), + SALE_OPT_OUT_NOTICE("SaleOptOutNotice"), + TARGETED_ADVERTISING_OPT_OUT_NOTICE("TargetedAdvertisingOptOutNotice"), + SALE_OPT_OUT("SaleOptOut"), + TARGETED_ADVERTISING_OPT_OUT("TargetedAdvertisingOptOut"), + SENSITIVE_DATA_PROCESSING("SensitiveDataProcessing"), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS("KnownChildSensitiveDataConsents"), + ADDITIONAL_DATA_PROCESSING_CONSENT("AdditionalDataProcessingConsent"), + MSPA_COVERED_TRANSACTION("MspaCoveredTransaction"), + MSPA_OPT_OUT_OPTION_MODE("MspaOptOutOptionMode"), + MSPA_SERVICE_PROVIDER_MODE("MspaServiceProviderMode"), - public static final String VERSION = "Version"; - public static final String PROCESSING_NOTICE = "ProcessingNotice"; - public static final String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static final String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; - public static final String SALE_OPT_OUT = "SaleOptOut"; - public static final String TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut"; - public static final String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; - public static final String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; - public static final String ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent"; - public static final String MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static final String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static final String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + GPC_SEGMENT_TYPE("GpcSegmentType"), + GPC_SEGMENT_INCLUDED("GpcSegmentIncluded"), + GPC("Gpc"); - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; + private String name; + + UsTxField(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames USTX_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USTX_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( UsTxField.VERSION, UsTxField.PROCESSING_NOTICE, UsTxField.SALE_OPT_OUT_NOTICE, @@ -38,7 +47,7 @@ private UsTxField() {} //@formatter:on //@formatter:off - public static FieldNames USTX_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( + public static FieldNames USTX_GPC_SEGMENT_FIELD_NAMES = new FieldNames<>( UsTxField.GPC_SEGMENT_TYPE, UsTxField.GPC_SEGMENT_INCLUDED, UsTxField.GPC diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsUtField.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsUtField.java index 4cc9ff47..3f7c3ab3 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsUtField.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsUtField.java @@ -1,23 +1,32 @@ package com.iab.gpp.encoder.field; -public final class UsUtField { - private UsUtField() {} +public enum UsUtField implements FieldKey { + VERSION("Version"), + SHARING_NOTICE("SharingNotice"), + SALE_OPT_OUT_NOTICE("SaleOptOutNotice"), + TARGETED_ADVERTISING_OPT_OUT_NOTICE("TargetedAdvertisingOptOutNotice"), + SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE("SensitiveDataProcessingOptOutNotice"), + SALE_OPT_OUT("SaleOptOut"), + TARGETED_ADVERTISING_OPT_OUT("TargetedAdvertisingOptOut"), + SENSITIVE_DATA_PROCESSING("SensitiveDataProcessing"), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS("KnownChildSensitiveDataConsents"), + MSPA_COVERED_TRANSACTION("MspaCoveredTransaction"), + MSPA_OPT_OUT_OPTION_MODE("MspaOptOutOptionMode"), + MSPA_SERVICE_PROVIDER_MODE("MspaServiceProviderMode"); - public static final String VERSION = "Version"; - public static final String SHARING_NOTICE = "SharingNotice"; - public static final String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static final String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; - public static final String SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE = "SensitiveDataProcessingOptOutNotice"; - public static final String SALE_OPT_OUT = "SaleOptOut"; - public static final String TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut"; - public static final String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; - public static final String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; - public static final String MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static final String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static final String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + private String name; + + UsUtField(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames USUT_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USUT_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( UsUtField.VERSION, UsUtField.SHARING_NOTICE, UsUtField.SALE_OPT_OUT_NOTICE, diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsVaField.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsVaField.java index dd9e75cf..b6c1fd59 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsVaField.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsVaField.java @@ -1,22 +1,31 @@ package com.iab.gpp.encoder.field; -public final class UsVaField { - private UsVaField() {} +public enum UsVaField implements FieldKey { + VERSION("Version"), + SHARING_NOTICE("SharingNotice"), + SALE_OPT_OUT_NOTICE("SaleOptOutNotice"), + TARGETED_ADVERTISING_OPT_OUT_NOTICE("TargetedAdvertisingOptOutNotice"), + SALE_OPT_OUT("SaleOptOut"), + TARGETED_ADVERTISING_OPT_OUT("TargetedAdvertisingOptOut"), + SENSITIVE_DATA_PROCESSING("SensitiveDataProcessing"), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS("KnownChildSensitiveDataConsents"), + MSPA_COVERED_TRANSACTION("MspaCoveredTransaction"), + MSPA_OPT_OUT_OPTION_MODE("MspaOptOutOptionMode"), + MSPA_SERVICE_PROVIDER_MODE("MspaServiceProviderMode"); - public static final String VERSION = "Version"; - public static final String SHARING_NOTICE = "SharingNotice"; - public static final String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static final String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; - public static final String SALE_OPT_OUT = "SaleOptOut"; - public static final String TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut"; - public static final String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; - public static final String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; - public static final String MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static final String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static final String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + private String name; + + UsVaField(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames USVA_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USVA_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( UsVaField.VERSION, UsVaField.SHARING_NOTICE, UsVaField.SALE_OPT_OUT_NOTICE, diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UspV1Field.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UspV1Field.java index 9b497991..d7a9a96c 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UspV1Field.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UspV1Field.java @@ -1,15 +1,24 @@ package com.iab.gpp.encoder.field; -public final class UspV1Field { - private UspV1Field() {} +public enum UspV1Field implements FieldKey { + VERSION("Version"), + NOTICE("Notice"), + OPT_OUT_SALE("OptOutSale"), + LSPA_COVERED("LspaCovered"); - public static final String VERSION = "Version"; - public static final String NOTICE = "Notice"; - public static final String OPT_OUT_SALE = "OptOutSale"; - public static final String LSPA_COVERED = "LspaCovered"; + private String name; + + UspV1Field(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } //@formatter:off - public static final FieldNames USPV1_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( + public static final FieldNames USPV1_CORE_SEGMENT_FIELD_NAMES = new FieldNames<>( UspV1Field.VERSION, UspV1Field.NOTICE, UspV1Field.OPT_OUT_SALE, diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/AbstractEncodable.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/AbstractEncodable.java new file mode 100644 index 00000000..7fc75676 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/AbstractEncodable.java @@ -0,0 +1,47 @@ +package com.iab.gpp.encoder.section; + +import com.iab.gpp.encoder.datatype.encoder.Dirtyable; + +public abstract class AbstractEncodable implements Dirtyable { + + private CharSequence encoded; + + private boolean decoded = true; + + private final boolean isEmpty() { + return encoded == null || encoded.length() == 0; + } + + protected final void ensureDecode() { + if (!this.decoded) { + if (!isEmpty()) { + this.doDecode(this.encoded); + } + this.setDirty(false); + this.decoded = true; + } + } + + public final void decode(CharSequence encodedString) { + this.encoded = encodedString; + this.decoded = false; + } + + protected abstract void doDecode(CharSequence encodedString); + + protected abstract CharSequence doEncode(); + + public final String encode() { + return encodeCharSequence().toString(); + } + + public final CharSequence encodeCharSequence() { + if (isEmpty() || this.isDirty()) { + this.encoded = doEncode(); + this.setDirty(false); + this.decoded = true; + } + return this.encoded; + } + +} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/AbstractLazilyEncodableSection.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/AbstractLazilyEncodableSection.java deleted file mode 100644 index 167e7188..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/AbstractLazilyEncodableSection.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.iab.gpp.encoder.section; - -import java.util.List; -import com.iab.gpp.encoder.error.InvalidFieldException; -import com.iab.gpp.encoder.segment.EncodableSegment; - -public abstract class AbstractLazilyEncodableSection implements EncodableSection { - - protected List segments; - - private CharSequence encodedString = null; - - private boolean dirty = false; - private boolean decoded = true; - - protected AbstractLazilyEncodableSection() { - this.segments = initializeSegments(); - } - - protected abstract List initializeSegments(); - - protected abstract CharSequence encodeSection(List segments); - - protected abstract List decodeSection(CharSequence encodedString); - - public boolean hasField(String fieldName) { - if (!this.decoded) { - this.segments = this.decodeSection(this.encodedString); - this.dirty = false; - this.decoded = true; - } - - for(EncodableSegment segment : segments) { - if (segment.hasField(fieldName)) { - return true; - } - } - - return false; - } - - public Object getFieldValue(String fieldName) { - if (!this.decoded) { - this.segments = this.decodeSection(this.encodedString); - this.dirty = false; - this.decoded = true; - } - - for(EncodableSegment segment : segments) { - if(segment.hasField(fieldName)) { - return segment.getFieldValue(fieldName); - } - } - - throw new InvalidFieldException("Invalid field: '" + fieldName + "'"); - } - - public void setFieldValue(String fieldName, Object value) { - if (!this.decoded) { - this.segments = this.decodeSection(this.encodedString); - this.dirty = false; - this.decoded = true; - } - - for(EncodableSegment segment : segments) { - if(segment.hasField(fieldName)) { - segment.setFieldValue(fieldName, value); - this.dirty = true; - return; - } - } - - throw new InvalidFieldException("Invalid field: '" + fieldName + "'"); - } - - public String encode() { - return encodeCharSequence().toString(); - } - - public CharSequence encodeCharSequence() { - if (this.encodedString == null || this.encodedString.length() == 0 || this.dirty) { - this.encodedString = this.encodeSection(this.segments); - this.dirty = false; - this.decoded = true; - } - - return this.encodedString; - } - - public void decode(CharSequence encodedString) { - this.encodedString = encodedString; - this.dirty = false; - this.decoded = false; - } - - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("{id=").append(getId()).append(", name=").append(getName()).append(", version=").append(getVersion()); - for (EncodableSegment segment: segments) { - sb.append(", ").append(segment.toString()); - } - sb.append('}'); - return sb.toString(); - } -} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/EncodableSection.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/EncodableSection.java index a7324eef..089ae70b 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/EncodableSection.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/EncodableSection.java @@ -1,22 +1,195 @@ package com.iab.gpp.encoder.section; -public interface EncodableSection { +import java.util.ArrayList; +import java.util.List; +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.error.InvalidFieldException; +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.segment.EncodableSegment; - int getId(); +public abstract class EncodableSection & FieldKey> extends AbstractEncodable { - String getName(); + private final Object[] segments; - int getVersion(); + @SafeVarargs + protected EncodableSection(EncodableSegment... segments) { + this.segments = segments; + } - boolean hasField(String fieldName); + protected final int size() { + return segments.length; + } - Object getFieldValue(String fieldName); + @SuppressWarnings("unchecked") + protected final EncodableSegment getSegment(int index) { + return (EncodableSegment) segments[index]; + } - void setFieldValue(String fieldName, Object value); + public abstract int getId(); - String encode(); + public abstract String getName(); - CharSequence encodeCharSequence(); + public abstract int getVersion(); + + @Override + protected void doDecode(CharSequence encodedString) { + int numSegments = size(); + if (numSegments == 1) { + getSegment(0).decode(encodedString); + return; + } + List encodedSegments = SlicedCharSequence.split(encodedString, '.'); + for (int i = 0; i < numSegments; i++) { + getSegment(i).decode(encodedSegments.get(i)); + } + } + + @Override + protected CharSequence doEncode() { + int numSegments = size(); + if (numSegments == 1) { + return getSegment(0).encodeCharSequence(); + } + List encodedSegments = new ArrayList<>(numSegments); + for (int i = 0; i < numSegments; i++) { + encodedSegments.add(getSegment(i).encodeCharSequence()); + } + return SlicedCharSequence.join('.', encodedSegments); + } + + public final boolean hasField(FieldKey fieldName) { + ensureDecode(); + + int numSegments = size(); + for (int i = 0; i < numSegments; i++) { + EncodableSegment segment = getSegment(i); + E key = segment.resolveKey(fieldName); + if (key != null && segment.getField(key) != null) { + return true; + } + } + + return false; + } + + public final boolean hasField(E fieldName) { + ensureDecode(); + + int numSegments = size(); + for (int i = 0; i < numSegments; i++) { + EncodableSegment segment = getSegment(i); + if (segment.getField(fieldName) != null) { + return true; + } + } + + return false; + } + + public final Object getFieldValue(FieldKey fieldName) { + ensureDecode(); + + int numSegments = size(); + for (int i = 0; i < numSegments; i++) { + EncodableSegment segment = getSegment(i); + E key = segment.resolveKey(fieldName); + if (key != null) { + DataType field = segment.getField(key); + if (field != null) { + return field.getValue(); + } + } + } + + throw new InvalidFieldException("Invalid field: '" + fieldName + "'"); + } + + public final Object getFieldValue(E fieldName) { + ensureDecode(); + + int numSegments = size(); + for (int i = 0; i < numSegments; i++) { + EncodableSegment segment = getSegment(i); + DataType field = segment.getField(fieldName); + if (field != null) { + return field.getValue(); + } + } + + throw new InvalidFieldException("Invalid field: '" + fieldName + "'"); + } + + public final void setFieldValue(FieldKey fieldName, Object value) { + ensureDecode(); + + int numSegments = size(); + for (int i = 0; i < numSegments; i++) { + EncodableSegment segment = getSegment(i); + E key = segment.resolveKey(fieldName); + if (key != null) { + DataType field = segment.getField(key); + if (field != null) { + field.setValue(value); + onSet(key); + return; + } + } + } + + throw new InvalidFieldException("Invalid field: '" + fieldName + "'"); + } + + public final void setFieldValue(E fieldName, Object value) { + ensureDecode(); + + int numSegments = size(); + for (int i = 0; i < numSegments; i++) { + EncodableSegment segment = getSegment(i); + DataType field = segment.getField(fieldName); + if(field != null) { + field.setValue(value); + onSet(fieldName); + return; + } + } + + throw new InvalidFieldException("Invalid field: '" + fieldName + "'"); + } + + protected void onSet(E fieldName) { + // pass: override this to set last modified fields + } + + @Override + public final boolean isDirty() { + int numSegments = size(); + for (int i = 0; i < numSegments; i++) { + if (getSegment(i).isDirty()) { + return true; + } + } + return false; + } + + @Override + public final void setDirty(boolean dirty) { + int numSegments = size(); + for (int i = 0; i < numSegments; i++) { + getSegment(i).setDirty(dirty); + } + } + + @Override + public final String toString() { + ensureDecode(); + StringBuilder sb = new StringBuilder(); + sb.append("{id=").append(getId()).append(", name=").append(getName()).append(", version=").append(getVersion()); + int numSegments = size(); + for (int i = 0; i < numSegments; i++) { + sb.append(", ").append(getSegment(i).toString()); + } + sb.append('}'); + return sb.toString(); + } - void decode(CharSequence encodedString); } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/HeaderV1.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/HeaderV1.java index 3e6faa0c..4f23d3b1 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/HeaderV1.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/HeaderV1.java @@ -1,25 +1,21 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import com.iab.gpp.encoder.datatype.encoder.IntegerSet; import com.iab.gpp.encoder.field.HeaderV1Field; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.HeaderV1CoreSegment; -public class HeaderV1 extends AbstractLazilyEncodableSection { +public class HeaderV1 extends EncodableSection { public static final int ID = 3; public static final int VERSION = 1; public static final String NAME = "header"; public HeaderV1() { - super(); + super(new HeaderV1CoreSegment()); } public HeaderV1(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -38,39 +34,7 @@ public int getVersion() { return HeaderV1.VERSION; } - @Override - protected List initializeSegments() { - return Collections.singletonList(new HeaderV1CoreSegment()); - } - - @Override - protected List decodeSection(CharSequence encodedString) { - if(encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - - for (int i=0; i i) { - segments.get(i).decode(encodedSegments.get(i)); - } - } - } - - return segments; - } - - @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - for(EncodableSegment segment : segments) { - encodedSegments.add(segment.encodeCharSequence()); - } - return SlicedCharSequence.join('.', encodedSegments); - } - - public IntegerSet getSectionsIds() { return (IntegerSet) this.getFieldValue(HeaderV1Field.SECTION_IDS); } - - } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/Sections.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/Sections.java deleted file mode 100644 index a438d217..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/Sections.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.iab.gpp.encoder.section; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -public final class Sections { - private Sections() {} - - public static final List SECTION_ORDER; - - public static final Map SECTION_ID_NAME_MAP; - - static { - SECTION_ID_NAME_MAP = new HashMap<>(); - - SECTION_ID_NAME_MAP.put(TcfEuV2.ID, TcfEuV2.NAME); - SECTION_ID_NAME_MAP.put(TcfCaV1.ID, TcfCaV1.NAME); - SECTION_ID_NAME_MAP.put(UspV1.ID, UspV1.NAME); - SECTION_ID_NAME_MAP.put(UsNat.ID, UsNat.NAME); - SECTION_ID_NAME_MAP.put(UsCa.ID, UsCa.NAME); - SECTION_ID_NAME_MAP.put(UsVa.ID, UsVa.NAME); - SECTION_ID_NAME_MAP.put(UsCo.ID, UsCo.NAME); - SECTION_ID_NAME_MAP.put(UsUt.ID, UsUt.NAME); - SECTION_ID_NAME_MAP.put(UsCt.ID, UsCt.NAME); - SECTION_ID_NAME_MAP.put(UsFl.ID, UsFl.NAME); - SECTION_ID_NAME_MAP.put(UsMt.ID, UsMt.NAME); - SECTION_ID_NAME_MAP.put(UsOr.ID, UsOr.NAME); - SECTION_ID_NAME_MAP.put(UsTx.ID, UsTx.NAME); - SECTION_ID_NAME_MAP.put(UsDe.ID, UsDe.NAME); - SECTION_ID_NAME_MAP.put(UsIa.ID, UsIa.NAME); - SECTION_ID_NAME_MAP.put(UsNe.ID, UsNe.NAME); - SECTION_ID_NAME_MAP.put(UsNh.ID, UsNh.NAME); - SECTION_ID_NAME_MAP.put(UsNj.ID, UsNj.NAME); - SECTION_ID_NAME_MAP.put(UsTn.ID, UsTn.NAME); - - SECTION_ORDER = new ArrayList(SECTION_ID_NAME_MAP.keySet()).stream().sorted() - .map(id -> SECTION_ID_NAME_MAP.get(id)).collect(Collectors.toList()); - } -} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/SlicedCharSequence.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/SlicedCharSequence.java index 234bf439..85c7e5f7 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/SlicedCharSequence.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/SlicedCharSequence.java @@ -6,27 +6,43 @@ public final class SlicedCharSequence implements CharSequence { private static final String EMPTY = ""; - private final CharSequence base; + private final String base; private final int start; private final int end; - private SlicedCharSequence(CharSequence base, int start, int end) { + private SlicedCharSequence(String base, int start, int end) { this.base = base; this.start = start; this.end = end; } public static List split(CharSequence charSequence, char splitter) { - List out = new ArrayList<>(1); - int length = charSequence.length(); - int start = 0; - for (int i = 0; i < length; i++) { - if (charSequence.charAt(i) == splitter) { - out.add(new SlicedCharSequence(charSequence, start, i)); - start = i + 1; - } + // the first time we see some other CharSequence we convert to a String. + // this keeps all derived SlicedCharSequence instances anchored to the same base String. + // this is important because String.indexOf internally uses an optimized intrinsic. + // CharSequence does not have indexOf, only charAt which is quite slow in comparison. + // also we avoid a recursive structure of SlicedCharSequence. + String base; + int start; + int end; + if (charSequence instanceof SlicedCharSequence) { + SlicedCharSequence slicedCharSequence = (SlicedCharSequence) charSequence; + base = slicedCharSequence.base; + start = slicedCharSequence.start; + end = slicedCharSequence.end; + } else { + base = charSequence.toString(); + start = 0; + end = base.length(); + } + // most sections/segments have less than 4 components + List out = new ArrayList<>(4); + int next = 0; + while ((next = base.indexOf(splitter, start, end)) != -1) { + out.add(new SlicedCharSequence(base, start, next)); + start = next + 1; } - out.add(new SlicedCharSequence(charSequence, start, length)); + out.add(new SlicedCharSequence(base, start, end)); return out; } @@ -68,7 +84,7 @@ public CharSequence subSequence(int newStart, int newEnd) { @Override public String toString() { - return base.subSequence(start, end).toString(); + return base.substring(start, end); } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/TcfCaV1.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/TcfCaV1.java index e082f067..18566835 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/TcfCaV1.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/TcfCaV1.java @@ -2,30 +2,27 @@ import java.time.Instant; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import com.iab.gpp.encoder.datatype.RangeEntry; import com.iab.gpp.encoder.datatype.encoder.IntegerSet; import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.error.InvalidFieldException; import com.iab.gpp.encoder.field.TcfCaV1Field; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.TcfCaV1CoreSegment; import com.iab.gpp.encoder.segment.TcfCaV1DisclosedVendorsSegment; import com.iab.gpp.encoder.segment.TcfCaV1PublisherPurposesSegment; -public class TcfCaV1 extends AbstractLazilyEncodableSection { +public class TcfCaV1 extends EncodableSection { public static final int ID = 5; public static final int VERSION = 1; public static final String NAME = "tcfcav1"; public TcfCaV1() { - super(); + super(new TcfCaV1CoreSegment(), new TcfCaV1PublisherPurposesSegment(), new TcfCaV1DisclosedVendorsSegment()); } public TcfCaV1(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -45,73 +42,62 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new TcfCaV1CoreSegment(), new TcfCaV1PublisherPurposesSegment(), new TcfCaV1DisclosedVendorsSegment()); - } - - @Override - public List decodeSection(CharSequence encodedString) { - if (encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - for (int i = 0; i < encodedSegments.size(); i++) { - - /** - * The first 3 bits contain the segment id. Rather than decode the entire string, just check the first character. - * - * A-H = '000' = 0 - * I-P = '001' = 1 - * Y-Z,a-f = '011' = 3 - * - * Note that there is no segment id field for the core segment. Instead the first 6 bits are reserved - * for the encoding version which only coincidentally works here because the version value is less than 8. - */ - - CharSequence encodedSegment = encodedSegments.get(i); - if (encodedSegment.length() > 0) { - char firstChar = encodedSegment.charAt(0); - - if(firstChar >= 'A' && firstChar <= 'H') { - segments.get(0).decode(encodedSegment); - } else if(firstChar >= 'I' && firstChar <= 'P') { - segments.get(2).decode(encodedSegment); - } else if((firstChar >= 'Y' && firstChar <= 'Z') || (firstChar >= 'a' && firstChar <= 'f')) { - segments.get(1).decode(encodedSegment); - } else { - throw new DecodingException("Invalid segment '" + encodedSegment + "'"); - } + protected void doDecode(CharSequence encodedString) { + List encodedSegments = SlicedCharSequence.split(encodedString, '.'); + int numEncodedSegments = encodedSegments.size(); + for (int i = 0; i < numEncodedSegments; i++) { + + /** + * The first 3 bits contain the segment id. Rather than decode the entire string, just check the first character. + * + * A-H = '000' = 0 + * I-P = '001' = 1 + * Y-Z,a-f = '011' = 3 + * + * Note that there is no segment id field for the core segment. Instead the first 6 bits are reserved + * for the encoding version which only coincidentally works here because the version value is less than 8. + */ + + CharSequence encodedSegment = encodedSegments.get(i); + if (encodedSegment.length() > 0) { + char firstChar = encodedSegment.charAt(0); + + if(firstChar >= 'A' && firstChar <= 'H') { + getSegment(0).decode(encodedSegment); + } else if(firstChar >= 'I' && firstChar <= 'P') { + getSegment(2).decode(encodedSegment); + } else if((firstChar >= 'Y' && firstChar <= 'Z') || (firstChar >= 'a' && firstChar <= 'f')) { + getSegment(1).decode(encodedSegment); + } else { + throw new DecodingException("Invalid segment '" + encodedSegment + "'"); } } } - - return segments; } @Override - public CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); + protected CharSequence doEncode() { + List encodedSegments = new ArrayList<>(size()); - encodedSegments.add(segments.get(0).encodeCharSequence()); - encodedSegments.add(segments.get(1).encodeCharSequence()); + encodedSegments.add(getSegment(0).encodeCharSequence()); + encodedSegments.add(getSegment(1).encodeCharSequence()); if(!this.getDisclosedVendors().isEmpty()) { - encodedSegments.add(segments.get(2).encodeCharSequence()); + encodedSegments.add(getSegment(2).encodeCharSequence()); } return SlicedCharSequence.join('.', encodedSegments); } @Override - public void setFieldValue(String fieldName, Object value) throws InvalidFieldException { - super.setFieldValue(fieldName, value); - + public void onSet(TcfCaV1Field fieldName) { if (!fieldName.equals(TcfCaV1Field.CREATED) && !fieldName.equals(TcfCaV1Field.LAST_UPDATED)) { Instant utcDateTime = Instant.now(); - super.setFieldValue(TcfCaV1Field.CREATED, utcDateTime); - super.setFieldValue(TcfCaV1Field.LAST_UPDATED, utcDateTime); + this.setFieldValue(TcfCaV1Field.CREATED, utcDateTime); + this.setFieldValue(TcfCaV1Field.LAST_UPDATED, utcDateTime); } } - public Instant getCreated() { return (Instant) this.getFieldValue(TcfCaV1Field.CREATED); } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/TcfEuV2.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/TcfEuV2.java index 3c378d46..54b54042 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/TcfEuV2.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/TcfEuV2.java @@ -2,31 +2,28 @@ import java.time.Instant; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import com.iab.gpp.encoder.datatype.RangeEntry; import com.iab.gpp.encoder.datatype.encoder.IntegerSet; import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.error.InvalidFieldException; import com.iab.gpp.encoder.field.TcfEuV2Field; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.TcfEuV2CoreSegment; import com.iab.gpp.encoder.segment.TcfEuV2PublisherPurposesSegment; import com.iab.gpp.encoder.segment.TcfEuV2VendorsAllowedSegment; import com.iab.gpp.encoder.segment.TcfEuV2VendorsDisclosedSegment; -public class TcfEuV2 extends AbstractLazilyEncodableSection { +public class TcfEuV2 extends EncodableSection { public static final int ID = 2; public static final int VERSION = 2; public static final String NAME = "tcfeuv2"; public TcfEuV2() { - super(); + super(new TcfEuV2CoreSegment(), new TcfEuV2PublisherPurposesSegment(), new TcfEuV2VendorsAllowedSegment(), new TcfEuV2VendorsDisclosedSegment()); } public TcfEuV2(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -46,68 +43,60 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new TcfEuV2CoreSegment(), new TcfEuV2PublisherPurposesSegment(), new TcfEuV2VendorsAllowedSegment(), new TcfEuV2VendorsDisclosedSegment()); - } - - @Override - public List decodeSection(CharSequence encodedString) { - if (encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - for (int i = 0; i < encodedSegments.size(); i++) { - - /** - * The first 3 bits contain the segment id. Rather than decode the entire string, just check the first character. - * - * A-H = '000' = 0 - * I-P = '001' = 1 - * Q-X = '010' = 2 - * Y-Z,a-f = '011' = 3 - * - * Note that there is no segment id field for the core segment. Instead the first 6 bits are reserved - * for the encoding version which only coincidentally works here because the version value is less than 8. - */ - - CharSequence encodedSegment = encodedSegments.get(i); - if (encodedSegment.length() > 0) { - char firstChar = encodedSegment.charAt(0); - - // unfortunately, the segment ordering doesn't match the segment ids - if(firstChar >= 'A' && firstChar <= 'H') { - segments.get(0).decode(encodedSegment); - } else if(firstChar >= 'I' && firstChar <= 'P') { - segments.get(3).decode(encodedSegment); - } else if(firstChar >= 'Q' && firstChar <= 'X') { - segments.get(2).decode(encodedSegment); - } else if((firstChar >= 'Y' && firstChar <= 'Z') || (firstChar >= 'a' && firstChar <= 'f')) { - segments.get(1).decode(encodedSegment); - } else { - throw new DecodingException("Invalid segment '" + encodedSegment + "'"); - } + public void doDecode(CharSequence encodedString) { + List encodedSegments = SlicedCharSequence.split(encodedString, '.'); + int numEncodedSegments = encodedSegments.size(); + for (int i = 0; i < numEncodedSegments; i++) { + + /** + * The first 3 bits contain the segment id. Rather than decode the entire string, just check the first character. + * + * A-H = '000' = 0 + * I-P = '001' = 1 + * Q-X = '010' = 2 + * Y-Z,a-f = '011' = 3 + * + * Note that there is no segment id field for the core segment. Instead the first 6 bits are reserved + * for the encoding version which only coincidentally works here because the version value is less than 8. + */ + + CharSequence encodedSegment = encodedSegments.get(i); + if (encodedSegment.length() > 0) { + char firstChar = encodedSegment.charAt(0); + + // unfortunately, the segment ordering doesn't match the segment ids + if(firstChar >= 'A' && firstChar <= 'H') { + getSegment(0).decode(encodedSegment); + } else if(firstChar >= 'I' && firstChar <= 'P') { + getSegment(3).decode(encodedSegment); + } else if(firstChar >= 'Q' && firstChar <= 'X') { + getSegment(2).decode(encodedSegment); + } else if((firstChar >= 'Y' && firstChar <= 'Z') || (firstChar >= 'a' && firstChar <= 'f')) { + getSegment(1).decode(encodedSegment); + } else { + throw new DecodingException("Invalid segment '" + encodedSegment + "'"); } } } - - return segments; } @Override - public CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - if (segments.size() >= 1) { - encodedSegments.add(segments.get(0).encodeCharSequence()); + public CharSequence doEncode() { + List encodedSegments = new ArrayList<>(size()); + if (size() >= 1) { + encodedSegments.add(getSegment(0).encodeCharSequence()); Boolean isServiceSpecific = (Boolean) this.getFieldValue(TcfEuV2Field.IS_SERVICE_SPECIFIC); if (isServiceSpecific) { - if (segments.size() >= 2) { - encodedSegments.add(segments.get(1).encodeCharSequence()); + if (size() >= 2) { + encodedSegments.add(getSegment(1).encodeCharSequence()); } } else { - if (segments.size() >= 2) { - encodedSegments.add(segments.get(2).encodeCharSequence()); + if (size() >= 2) { + encodedSegments.add(getSegment(2).encodeCharSequence()); - if (segments.size() >= 3) { - encodedSegments.add(segments.get(3).encodeCharSequence()); + if (size() >= 3) { + encodedSegments.add(getSegment(3).encodeCharSequence()); } } } @@ -117,18 +106,15 @@ public CharSequence encodeSection(List segments) { } @Override - public void setFieldValue(String fieldName, Object value) throws InvalidFieldException { - super.setFieldValue(fieldName, value); - + public void onSet(TcfEuV2Field fieldName) { if (!fieldName.equals(TcfEuV2Field.CREATED) && !fieldName.equals(TcfEuV2Field.LAST_UPDATED)) { Instant utcDateTime = Instant.now(); - super.setFieldValue(TcfEuV2Field.CREATED, utcDateTime); - super.setFieldValue(TcfEuV2Field.LAST_UPDATED, utcDateTime); + this.setFieldValue(TcfEuV2Field.CREATED, utcDateTime); + this.setFieldValue(TcfEuV2Field.LAST_UPDATED, utcDateTime); } } - public Instant getCreated() { return (Instant) this.getFieldValue(TcfEuV2Field.CREATED); } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsCa.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsCa.java index 3ab9bbd2..751b3efd 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsCa.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsCa.java @@ -1,25 +1,24 @@ package com.iab.gpp.encoder.section; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.field.UsCaField; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.UsCaCoreSegment; import com.iab.gpp.encoder.segment.UsCaGpcSegment; -public class UsCa extends AbstractLazilyEncodableSection { +public class UsCa extends EncodableSection { public static final int ID = 8; public static final int VERSION = 1; public static final String NAME = "usca"; public UsCa() { - super(); + super(new UsCaCoreSegment(), new UsCaGpcSegment()); } public UsCa(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,39 +38,29 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsCaCoreSegment(), new UsCaGpcSegment()); - } + protected void doDecode(CharSequence encodedString) { + List encodedSegments = SlicedCharSequence.split(encodedString, '.'); + int numEncodedSegments = encodedSegments.size(); - @Override - protected List decodeSection(CharSequence encodedString) { - if (encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - - if (encodedSegments.size() > 0) { - segments.get(0).decode(encodedSegments.get(0)); - } - - if (encodedSegments.size() > 1) { - segments.get(1).setFieldValue(UsCaField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments.get(1)); - } else { - segments.get(1).setFieldValue(UsCaField.GPC_SEGMENT_INCLUDED, false); - } + if (numEncodedSegments > 0) { + getSegment(0).decode(encodedSegments.get(0)); } - return segments; + if (numEncodedSegments > 1) { + getSegment(1).setFieldValue(UsCaField.GPC_SEGMENT_INCLUDED, true); + getSegment(1).decode(encodedSegments.get(1)); + } else { + getSegment(1).setFieldValue(UsCaField.GPC_SEGMENT_INCLUDED, false); + } } @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - - if(!segments.isEmpty()) { - encodedSegments.add(segments.get(0).encodeCharSequence()); - if(segments.size() >= 2 && segments.get(1).getFieldValue(UsCaField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encodeCharSequence()); - } + protected CharSequence doEncode() { + List encodedSegments = new ArrayList<>(size()); + + encodedSegments.add(getSegment(0).encodeCharSequence()); + if(size() >= 2 && getSegment(1).getFieldValue(UsCaField.GPC_SEGMENT_INCLUDED).equals(true)) { + encodedSegments.add(getSegment(1).encodeCharSequence()); } return SlicedCharSequence.join('.', encodedSegments); @@ -98,14 +87,12 @@ public Integer getSharingOptOut() { return (Integer) this.getFieldValue(UsCaField.SHARING_OPT_OUT); } - @SuppressWarnings("unchecked") - public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsCaField.SENSITIVE_DATA_PROCESSING); + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsCaField.SENSITIVE_DATA_PROCESSING); } - @SuppressWarnings("unchecked") - public List getKnownChildSensitiveDataConsents() { - return (List) this.getFieldValue(UsCaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); + public FixedIntegerList getKnownChildSensitiveDataConsents() { + return (FixedIntegerList) this.getFieldValue(UsCaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); } public Integer getPersonalDataConsents() { diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsCo.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsCo.java index 083031a8..6edcdc50 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsCo.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsCo.java @@ -1,25 +1,24 @@ package com.iab.gpp.encoder.section; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.field.UsCoField; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.UsCoCoreSegment; import com.iab.gpp.encoder.segment.UsCoGpcSegment; -public class UsCo extends AbstractLazilyEncodableSection { +public class UsCo extends EncodableSection { public static final int ID = 10; public static final int VERSION = 1; public static final String NAME = "usco"; public UsCo() { - super(); + super(new UsCoCoreSegment(), new UsCoGpcSegment()); } public UsCo(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,39 +38,29 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsCoCoreSegment(), new UsCoGpcSegment()); - } + protected void doDecode(CharSequence encodedString) { + List encodedSegments = SlicedCharSequence.split(encodedString, '.'); + int numEncodedSegments = encodedSegments.size(); - @Override - protected List decodeSection(CharSequence encodedString) { - if (encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - - if (encodedSegments.size() > 0) { - segments.get(0).decode(encodedSegments.get(0)); - } - - if (encodedSegments.size() > 1) { - segments.get(1).setFieldValue(UsCoField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments.get(1)); - } else { - segments.get(1).setFieldValue(UsCoField.GPC_SEGMENT_INCLUDED, false); - } + if (numEncodedSegments > 0) { + getSegment(0).decode(encodedSegments.get(0)); } - return segments; + if (numEncodedSegments > 1) { + getSegment(1).setFieldValue(UsCoField.GPC_SEGMENT_INCLUDED, true); + getSegment(1).decode(encodedSegments.get(1)); + } else { + getSegment(1).setFieldValue(UsCoField.GPC_SEGMENT_INCLUDED, false); + } } @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - - if(!segments.isEmpty()) { - encodedSegments.add(segments.get(0).encodeCharSequence()); - if(segments.size() >= 2 && segments.get(1).getFieldValue(UsCoField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encodeCharSequence()); - } + protected CharSequence doEncode() { + List encodedSegments = new ArrayList<>(size()); + + encodedSegments.add(getSegment(0).encodeCharSequence()); + if(size() >= 2 && getSegment(1).getFieldValue(UsCoField.GPC_SEGMENT_INCLUDED).equals(true)) { + encodedSegments.add(getSegment(1).encodeCharSequence()); } return SlicedCharSequence.join('.', encodedSegments); @@ -98,9 +87,8 @@ public Integer getTargetedAdvertisingOptOut() { return (Integer) this.getFieldValue(UsCoField.TARGETED_ADVERTISING_OPT_OUT); } - @SuppressWarnings("unchecked") - public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsCoField.SENSITIVE_DATA_PROCESSING); + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsCoField.SENSITIVE_DATA_PROCESSING); } public Integer getKnownChildSensitiveDataConsents() { diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsCt.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsCt.java index 9d49656f..ae5d2425 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsCt.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsCt.java @@ -1,25 +1,24 @@ package com.iab.gpp.encoder.section; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.field.UsCtField; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.UsCtCoreSegment; import com.iab.gpp.encoder.segment.UsCtGpcSegment; -public class UsCt extends AbstractLazilyEncodableSection { +public class UsCt extends EncodableSection { public static final int ID = 12; public static final int VERSION = 1; public static final String NAME = "usct"; public UsCt() { - super(); + super(new UsCtCoreSegment(), new UsCtGpcSegment()); } public UsCt(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,39 +38,29 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsCtCoreSegment(), new UsCtGpcSegment()); - } + protected void doDecode(CharSequence encodedString) { + List encodedSegments = SlicedCharSequence.split(encodedString, '.'); + int numEncodedSegments = encodedSegments.size(); - @Override - protected List decodeSection(CharSequence encodedString) { - if (encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - - if (encodedSegments.size() > 0) { - segments.get(0).decode(encodedSegments.get(0)); - } - - if (encodedSegments.size() > 1) { - segments.get(1).setFieldValue(UsCtField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments.get(1)); - } else { - segments.get(1).setFieldValue(UsCtField.GPC_SEGMENT_INCLUDED, false); - } + if (numEncodedSegments > 0) { + getSegment(0).decode(encodedSegments.get(0)); } - return segments; + if (numEncodedSegments > 1) { + getSegment(1).setFieldValue(UsCtField.GPC_SEGMENT_INCLUDED, true); + getSegment(1).decode(encodedSegments.get(1)); + } else { + getSegment(1).setFieldValue(UsCtField.GPC_SEGMENT_INCLUDED, false); + } } @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - - if(!segments.isEmpty()) { - encodedSegments.add(segments.get(0).encodeCharSequence()); - if(segments.size() >= 2 && segments.get(1).getFieldValue(UsCtField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encodeCharSequence()); - } + protected CharSequence doEncode() { + List encodedSegments = new ArrayList<>(size()); + + encodedSegments.add(getSegment(0).encodeCharSequence()); + if(size() >= 2 && getSegment(1).getFieldValue(UsCtField.GPC_SEGMENT_INCLUDED).equals(true)) { + encodedSegments.add(getSegment(1).encodeCharSequence()); } return SlicedCharSequence.join('.', encodedSegments); @@ -98,14 +87,12 @@ public Integer getTargetedAdvertisingOptOut() { return (Integer) this.getFieldValue(UsCtField.TARGETED_ADVERTISING_OPT_OUT); } - @SuppressWarnings("unchecked") - public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsCtField.SENSITIVE_DATA_PROCESSING); + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsCtField.SENSITIVE_DATA_PROCESSING); } - @SuppressWarnings("unchecked") - public List getKnownChildSensitiveDataConsents() { - return (List) this.getFieldValue(UsCtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); + public FixedIntegerList getKnownChildSensitiveDataConsents() { + return (FixedIntegerList) this.getFieldValue(UsCtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); } public Integer getMspaCoveredTransaction() { diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsDe.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsDe.java index 52664417..b8813500 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsDe.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsDe.java @@ -1,25 +1,24 @@ package com.iab.gpp.encoder.section; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.field.UsDeField; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.UsDeCoreSegment; import com.iab.gpp.encoder.segment.UsDeGpcSegment; -public class UsDe extends AbstractLazilyEncodableSection { +public class UsDe extends EncodableSection { public static final int ID = 17; public static final int VERSION = 1; public static final String NAME = "usde"; public UsDe() { - super(); + super(new UsDeCoreSegment(), new UsDeGpcSegment()); } public UsDe(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,39 +38,29 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsDeCoreSegment(), new UsDeGpcSegment()); - } + protected void doDecode(CharSequence encodedString) { + List encodedSegments = SlicedCharSequence.split(encodedString, '.'); + int numEncodedSegments = encodedSegments.size(); - @Override - protected List decodeSection(CharSequence encodedString) { - if (encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - - if (encodedSegments.size() > 0) { - segments.get(0).decode(encodedSegments.get(0)); - } - - if (encodedSegments.size() > 1) { - segments.get(1).setFieldValue(UsDeField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments.get(1)); - } else { - segments.get(1).setFieldValue(UsDeField.GPC_SEGMENT_INCLUDED, false); - } + if (numEncodedSegments > 0) { + getSegment(0).decode(encodedSegments.get(0)); } - return segments; + if (numEncodedSegments > 1) { + getSegment(1).setFieldValue(UsDeField.GPC_SEGMENT_INCLUDED, true); + getSegment(1).decode(encodedSegments.get(1)); + } else { + getSegment(1).setFieldValue(UsDeField.GPC_SEGMENT_INCLUDED, false); + } } @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - - if (!segments.isEmpty()) { - encodedSegments.add(segments.get(0).encodeCharSequence()); - if (segments.size() >= 2 && segments.get(1).getFieldValue(UsDeField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encodeCharSequence()); - } + protected CharSequence doEncode() { + List encodedSegments = new ArrayList<>(size()); + + encodedSegments.add(getSegment(0).encodeCharSequence()); + if (size() >= 2 && getSegment(1).getFieldValue(UsDeField.GPC_SEGMENT_INCLUDED).equals(true)) { + encodedSegments.add(getSegment(1).encodeCharSequence()); } return SlicedCharSequence.join('.', encodedSegments); @@ -98,14 +87,12 @@ public Integer getTargetedAdvertisingOptOut() { return (Integer) this.getFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT); } - @SuppressWarnings("unchecked") - public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsDeField.SENSITIVE_DATA_PROCESSING); + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsDeField.SENSITIVE_DATA_PROCESSING); } - @SuppressWarnings("unchecked") - public List getKnownChildSensitiveDataConsents() { - return (List) this.getFieldValue(UsDeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); + public FixedIntegerList getKnownChildSensitiveDataConsents() { + return (FixedIntegerList) this.getFieldValue(UsDeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); } public Integer getAdditionalDataProcessingConsent() { diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsFl.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsFl.java index 6e6fd6b5..fe9de548 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsFl.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsFl.java @@ -1,24 +1,21 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.field.UsFlField; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.UsFlCoreSegment; -public class UsFl extends AbstractLazilyEncodableSection { +public class UsFl extends EncodableSection { public static final int ID = 13; public static final int VERSION = 1; public static final String NAME = "usfl"; public UsFl() { - super(); + super(new UsFlCoreSegment()); } public UsFl(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -37,36 +34,6 @@ public int getVersion() { return UsFl.VERSION; } - @Override - protected List initializeSegments() { - return Collections.singletonList(new UsFlCoreSegment()); - } - - @Override - protected List decodeSection(CharSequence encodedString) { - if(encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - - for (int i = 0; i < segments.size(); i++) { - if (encodedSegments.size() > i) { - segments.get(i).decode(encodedSegments.get(i)); - } - } - } - - return segments; - } - - @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - for (EncodableSegment segment : segments) { - encodedSegments.add(segment.encodeCharSequence()); - } - return SlicedCharSequence.join('.', encodedSegments); - } - - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsFlField.PROCESSING_NOTICE); } @@ -87,14 +54,12 @@ public Integer getTargetedAdvertisingOptOut() { return (Integer) this.getFieldValue(UsFlField.TARGETED_ADVERTISING_OPT_OUT); } - @SuppressWarnings("unchecked") - public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsFlField.SENSITIVE_DATA_PROCESSING); + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsFlField.SENSITIVE_DATA_PROCESSING); } - @SuppressWarnings("unchecked") - public List getKnownChildSensitiveDataConsents() { - return (List) this.getFieldValue(UsFlField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); + public FixedIntegerList getKnownChildSensitiveDataConsents() { + return (FixedIntegerList) this.getFieldValue(UsFlField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); } public Integer getAdditionalDataProcessingConsent() { diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsIa.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsIa.java index 37e5cb53..b3aed14b 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsIa.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsIa.java @@ -1,25 +1,24 @@ package com.iab.gpp.encoder.section; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.field.UsIaField; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.UsIaCoreSegment; import com.iab.gpp.encoder.segment.UsIaGpcSegment; -public class UsIa extends AbstractLazilyEncodableSection { +public class UsIa extends EncodableSection { public static final int ID = 18; public static final int VERSION = 1; public static final String NAME = "usia"; public UsIa() { - super(); + super(new UsIaCoreSegment(), new UsIaGpcSegment()); } public UsIa(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,39 +38,29 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsIaCoreSegment(), new UsIaGpcSegment()); - } + protected void doDecode(CharSequence encodedString) { + List encodedSegments = SlicedCharSequence.split(encodedString, '.'); + int numEncodedSegments = encodedSegments.size(); - @Override - protected List decodeSection(CharSequence encodedString) { - if (encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - - if (encodedSegments.size() > 0) { - segments.get(0).decode(encodedSegments.get(0)); - } - - if (encodedSegments.size() > 1) { - segments.get(1).setFieldValue(UsIaField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments.get(1)); - } else { - segments.get(1).setFieldValue(UsIaField.GPC_SEGMENT_INCLUDED, false); - } + if (numEncodedSegments > 0) { + getSegment(0).decode(encodedSegments.get(0)); } - return segments; + if (numEncodedSegments > 1) { + getSegment(1).setFieldValue(UsIaField.GPC_SEGMENT_INCLUDED, true); + getSegment(1).decode(encodedSegments.get(1)); + } else { + getSegment(1).setFieldValue(UsIaField.GPC_SEGMENT_INCLUDED, false); + } } @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - - if (!segments.isEmpty()) { - encodedSegments.add(segments.get(0).encodeCharSequence()); - if (segments.size() >= 2 && segments.get(1).getFieldValue(UsIaField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encodeCharSequence()); - } + protected CharSequence doEncode() { + List encodedSegments = new ArrayList<>(size()); + + encodedSegments.add(getSegment(0).encodeCharSequence()); + if (size() >= 2 && getSegment(1).getFieldValue(UsIaField.GPC_SEGMENT_INCLUDED).equals(true)) { + encodedSegments.add(getSegment(1).encodeCharSequence()); } return SlicedCharSequence.join('.', encodedSegments); @@ -102,9 +91,8 @@ public Integer getTargetedAdvertisingOptOut() { return (Integer) this.getFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT); } - @SuppressWarnings("unchecked") - public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsIaField.SENSITIVE_DATA_PROCESSING); + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsIaField.SENSITIVE_DATA_PROCESSING); } public Integer getKnownChildSensitiveDataConsents() { diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsMt.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsMt.java index 03dea7c1..37ad215a 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsMt.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsMt.java @@ -1,25 +1,24 @@ package com.iab.gpp.encoder.section; -import java.util.Arrays; import java.util.ArrayList; import java.util.List; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.field.UsMtField; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.UsMtCoreSegment; import com.iab.gpp.encoder.segment.UsMtGpcSegment; -public class UsMt extends AbstractLazilyEncodableSection { +public class UsMt extends EncodableSection { public static final int ID = 14; public static final int VERSION = 1; public static final String NAME = "usmt"; public UsMt() { - super(); + super(new UsMtCoreSegment(), new UsMtGpcSegment()); } public UsMt(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,39 +38,29 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsMtCoreSegment(), new UsMtGpcSegment()); - } + protected void doDecode(CharSequence encodedString) { + List encodedSegments = SlicedCharSequence.split(encodedString, '.'); + int numEncodedSegments = encodedSegments.size(); - @Override - protected List decodeSection(CharSequence encodedString) { - if(encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - - if (encodedSegments.size() > 0) { - segments.get(0).decode(encodedSegments.get(0)); - } - - if (encodedSegments.size() > 1) { - segments.get(1).setFieldValue(UsMtField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments.get(1)); - } else { - segments.get(1).setFieldValue(UsMtField.GPC_SEGMENT_INCLUDED, false); - } + if (numEncodedSegments > 0) { + getSegment(0).decode(encodedSegments.get(0)); } - return segments; + if (numEncodedSegments > 1) { + getSegment(1).setFieldValue(UsMtField.GPC_SEGMENT_INCLUDED, true); + getSegment(1).decode(encodedSegments.get(1)); + } else { + getSegment(1).setFieldValue(UsMtField.GPC_SEGMENT_INCLUDED, false); + } } @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - - if(!segments.isEmpty()) { - encodedSegments.add(segments.get(0).encodeCharSequence()); - if(segments.size() >= 2 && segments.get(1).getFieldValue(UsMtField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encodeCharSequence()); - } + protected CharSequence doEncode() { + List encodedSegments = new ArrayList<>(size()); + + encodedSegments.add(getSegment(0).encodeCharSequence()); + if(size() >= 2 && getSegment(1).getFieldValue(UsMtField.GPC_SEGMENT_INCLUDED).equals(true)) { + encodedSegments.add(getSegment(1).encodeCharSequence()); } return SlicedCharSequence.join('.', encodedSegments); @@ -98,14 +87,12 @@ public Integer getTargetedAdvertisingOptOut() { return (Integer) this.getFieldValue(UsMtField.TARGETED_ADVERTISING_OPT_OUT); } - @SuppressWarnings("unchecked") - public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsMtField.SENSITIVE_DATA_PROCESSING); + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsMtField.SENSITIVE_DATA_PROCESSING); } - @SuppressWarnings("unchecked") - public List getKnownChildSensitiveDataConsents() { - return (List) this.getFieldValue(UsMtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); + public FixedIntegerList getKnownChildSensitiveDataConsents() { + return (FixedIntegerList) this.getFieldValue(UsMtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); } public Integer getAdditionalDataProcessingConsent() { diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsNat.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsNat.java index 809f2569..c120e0b0 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsNat.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsNat.java @@ -1,25 +1,24 @@ package com.iab.gpp.encoder.section; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.field.UsNatField; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.UsNatCoreSegment; import com.iab.gpp.encoder.segment.UsNatGpcSegment; -public class UsNat extends AbstractLazilyEncodableSection { +public class UsNat extends EncodableSection { public static final int ID = 7; public static final int VERSION = 1; public static final String NAME = "usnat"; public UsNat() { - super(); + super(new UsNatCoreSegment(), new UsNatGpcSegment()); } public UsNat(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,39 +38,29 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsNatCoreSegment(), new UsNatGpcSegment()); - } + protected void doDecode(CharSequence encodedString) { + List encodedSegments = SlicedCharSequence.split(encodedString, '.'); + int numEncodedSegments = encodedSegments.size(); - @Override - protected List decodeSection(CharSequence encodedString) { - if (encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - - if (encodedSegments.size() > 0) { - segments.get(0).decode(encodedSegments.get(0)); - } - - if (encodedSegments.size() > 1) { - segments.get(1).setFieldValue(UsNatField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments.get(1)); - } else { - segments.get(1).setFieldValue(UsNatField.GPC_SEGMENT_INCLUDED, false); - } + if (numEncodedSegments > 0) { + getSegment(0).decode(encodedSegments.get(0)); } - return segments; + if (numEncodedSegments > 1) { + getSegment(1).setFieldValue(UsNatField.GPC_SEGMENT_INCLUDED, true); + getSegment(1).decode(encodedSegments.get(1)); + } else { + getSegment(1).setFieldValue(UsNatField.GPC_SEGMENT_INCLUDED, false); + } } @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - - if(!segments.isEmpty()) { - encodedSegments.add(segments.get(0).encodeCharSequence()); - if(segments.size() >= 2 && segments.get(1).getFieldValue(UsNatField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encodeCharSequence()); - } + protected CharSequence doEncode() { + List encodedSegments = new ArrayList<>(size()); + + encodedSegments.add(getSegment(0).encodeCharSequence()); + if(size() >= 2 && getSegment(1).getFieldValue(UsNatField.GPC_SEGMENT_INCLUDED).equals(true)) { + encodedSegments.add(getSegment(1).encodeCharSequence()); } return SlicedCharSequence.join('.', encodedSegments); @@ -114,14 +103,12 @@ public Integer getTargetedAdvertisingOptOut() { return (Integer) this.getFieldValue(UsNatField.TARGETED_ADVERTISING_OPT_OUT); } - @SuppressWarnings("unchecked") - public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsNatField.SENSITIVE_DATA_PROCESSING); + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsNatField.SENSITIVE_DATA_PROCESSING); } - @SuppressWarnings("unchecked") - public List getKnownChildSensitiveDataConsents() { - return (List) this.getFieldValue(UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); + public FixedIntegerList getKnownChildSensitiveDataConsents() { + return (FixedIntegerList) this.getFieldValue(UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); } public Integer getPersonalDataConsents() { diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsNe.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsNe.java index 36e9ff8b..4ecd1d52 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsNe.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsNe.java @@ -1,25 +1,24 @@ package com.iab.gpp.encoder.section; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.field.UsNeField; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.UsNeCoreSegment; import com.iab.gpp.encoder.segment.UsNeGpcSegment; -public class UsNe extends AbstractLazilyEncodableSection { +public class UsNe extends EncodableSection { public static final int ID = 19; public static final int VERSION = 1; public static final String NAME = "usne"; public UsNe() { - super(); + super(new UsNeCoreSegment(), new UsNeGpcSegment()); } public UsNe(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,39 +38,29 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsNeCoreSegment(), new UsNeGpcSegment()); - } + protected void doDecode(CharSequence encodedString) { + List encodedSegments = SlicedCharSequence.split(encodedString, '.'); + int numEncodedSegments = encodedSegments.size(); - @Override - protected List decodeSection(CharSequence encodedString) { - if(encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - - if (encodedSegments.size() > 0) { - segments.get(0).decode(encodedSegments.get(0)); - } - - if (encodedSegments.size() > 1) { - segments.get(1).setFieldValue(UsNeField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments.get(1)); - } else { - segments.get(1).setFieldValue(UsNeField.GPC_SEGMENT_INCLUDED, false); - } + if (numEncodedSegments > 0) { + getSegment(0).decode(encodedSegments.get(0)); } - return segments; + if (numEncodedSegments > 1) { + getSegment(1).setFieldValue(UsNeField.GPC_SEGMENT_INCLUDED, true); + getSegment(1).decode(encodedSegments.get(1)); + } else { + getSegment(1).setFieldValue(UsNeField.GPC_SEGMENT_INCLUDED, false); + } } @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - - if(!segments.isEmpty()) { - encodedSegments.add(segments.get(0).encodeCharSequence()); - if(segments.size() >= 2 && segments.get(1).getFieldValue(UsNeField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encodeCharSequence()); - } + protected CharSequence doEncode() { + List encodedSegments = new ArrayList<>(size()); + + encodedSegments.add(getSegment(0).encodeCharSequence()); + if(size() >= 2 && getSegment(1).getFieldValue(UsNeField.GPC_SEGMENT_INCLUDED).equals(true)) { + encodedSegments.add(getSegment(1).encodeCharSequence()); } return SlicedCharSequence.join('.', encodedSegments); @@ -98,9 +87,8 @@ public Integer getTargetedAdvertisingOptOut() { return (Integer) this.getFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT); } - @SuppressWarnings("unchecked") - public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsNeField.SENSITIVE_DATA_PROCESSING); + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsNeField.SENSITIVE_DATA_PROCESSING); } public Integer getKnownChildSensitiveDataConsents() { diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsNh.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsNh.java index b2f22d81..d4df1a83 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsNh.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsNh.java @@ -1,25 +1,24 @@ package com.iab.gpp.encoder.section; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.field.UsNhField; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.UsNhCoreSegment; import com.iab.gpp.encoder.segment.UsNhGpcSegment; -public class UsNh extends AbstractLazilyEncodableSection { +public class UsNh extends EncodableSection { public static final int ID = 20; public static final int VERSION = 1; public static final String NAME = "usnh"; public UsNh() { - super(); + super(new UsNhCoreSegment(), new UsNhGpcSegment()); } public UsNh(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,39 +38,29 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsNhCoreSegment(), new UsNhGpcSegment()); - } + protected void doDecode(CharSequence encodedString) { + List encodedSegments = SlicedCharSequence.split(encodedString, '.'); + int numEncodedSegments = encodedSegments.size(); - @Override - protected List decodeSection(CharSequence encodedString) { - if(encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - - if (encodedSegments.size() > 0) { - segments.get(0).decode(encodedSegments.get(0)); - } - - if (encodedSegments.size() > 1) { - segments.get(1).setFieldValue(UsNhField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments.get(1)); - } else { - segments.get(1).setFieldValue(UsNhField.GPC_SEGMENT_INCLUDED, false); - } + if (numEncodedSegments > 0) { + getSegment(0).decode(encodedSegments.get(0)); } - return segments; + if (numEncodedSegments > 1) { + getSegment(1).setFieldValue(UsNhField.GPC_SEGMENT_INCLUDED, true); + getSegment(1).decode(encodedSegments.get(1)); + } else { + getSegment(1).setFieldValue(UsNhField.GPC_SEGMENT_INCLUDED, false); + } } @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - - if(!segments.isEmpty()) { - encodedSegments.add(segments.get(0).encodeCharSequence()); - if(segments.size() >= 2 && segments.get(1).getFieldValue(UsNhField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encodeCharSequence()); - } + protected CharSequence doEncode() { + List encodedSegments = new ArrayList<>(size()); + + encodedSegments.add(getSegment(0).encodeCharSequence()); + if(size() >= 2 && getSegment(1).getFieldValue(UsNhField.GPC_SEGMENT_INCLUDED).equals(true)) { + encodedSegments.add(getSegment(1).encodeCharSequence()); } return SlicedCharSequence.join('.', encodedSegments); @@ -98,14 +87,12 @@ public Integer getTargetedAdvertisingOptOut() { return (Integer) this.getFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT); } - @SuppressWarnings("unchecked") - public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsNhField.SENSITIVE_DATA_PROCESSING); + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsNhField.SENSITIVE_DATA_PROCESSING); } - @SuppressWarnings("unchecked") - public List getKnownChildSensitiveDataConsents() { - return (List) this.getFieldValue(UsNhField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); + public FixedIntegerList getKnownChildSensitiveDataConsents() { + return (FixedIntegerList) this.getFieldValue(UsNhField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); } public Integer getAdditionalDataProcessingConsent() { diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsNj.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsNj.java index b694d403..973d850a 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsNj.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsNj.java @@ -1,25 +1,24 @@ package com.iab.gpp.encoder.section; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.field.UsNjField; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.UsNjCoreSegment; import com.iab.gpp.encoder.segment.UsNjGpcSegment; -public class UsNj extends AbstractLazilyEncodableSection { +public class UsNj extends EncodableSection { public static final int ID = 21; public static final int VERSION = 1; public static final String NAME = "usnj"; public UsNj() { - super(); + super(new UsNjCoreSegment(), new UsNjGpcSegment()); } public UsNj(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,39 +38,29 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsNjCoreSegment(), new UsNjGpcSegment()); - } + protected void doDecode(CharSequence encodedString) { + List encodedSegments = SlicedCharSequence.split(encodedString, '.'); + int numEncodedSegments = encodedSegments.size(); - @Override - protected List decodeSection(CharSequence encodedString) { - if(encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - - if (encodedSegments.size() > 0) { - segments.get(0).decode(encodedSegments.get(0)); - } - - if (encodedSegments.size() > 1) { - segments.get(1).setFieldValue(UsNjField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments.get(1)); - } else { - segments.get(1).setFieldValue(UsNjField.GPC_SEGMENT_INCLUDED, false); - } + if (numEncodedSegments > 0) { + getSegment(0).decode(encodedSegments.get(0)); } - return segments; + if (numEncodedSegments > 1) { + getSegment(1).setFieldValue(UsNjField.GPC_SEGMENT_INCLUDED, true); + getSegment(1).decode(encodedSegments.get(1)); + } else { + getSegment(1).setFieldValue(UsNjField.GPC_SEGMENT_INCLUDED, false); + } } @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - - if(!segments.isEmpty()) { - encodedSegments.add(segments.get(0).encodeCharSequence()); - if(segments.size() >= 2 && segments.get(1).getFieldValue(UsNjField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encodeCharSequence()); - } + protected CharSequence doEncode() { + List encodedSegments = new ArrayList<>(size()); + + encodedSegments.add(getSegment(0).encodeCharSequence()); + if(size() >= 2 && getSegment(1).getFieldValue(UsNjField.GPC_SEGMENT_INCLUDED).equals(true)) { + encodedSegments.add(getSegment(1).encodeCharSequence()); } return SlicedCharSequence.join('.', encodedSegments); @@ -98,14 +87,12 @@ public Integer getTargetedAdvertisingOptOut() { return (Integer) this.getFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT); } - @SuppressWarnings("unchecked") - public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsNjField.SENSITIVE_DATA_PROCESSING); + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsNjField.SENSITIVE_DATA_PROCESSING); } - @SuppressWarnings("unchecked") - public List getKnownChildSensitiveDataConsents() { - return (List) this.getFieldValue(UsNjField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); + public FixedIntegerList getKnownChildSensitiveDataConsents() { + return (FixedIntegerList) this.getFieldValue(UsNjField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); } public Integer getAdditionalDataProcessingConsent() { diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsOr.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsOr.java index 3e14ca1a..8c976cea 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsOr.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsOr.java @@ -1,25 +1,24 @@ package com.iab.gpp.encoder.section; -import java.util.Arrays; import java.util.ArrayList; import java.util.List; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.field.UsOrField; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.UsOrCoreSegment; import com.iab.gpp.encoder.segment.UsOrGpcSegment; -public class UsOr extends AbstractLazilyEncodableSection { +public class UsOr extends EncodableSection { public static final int ID = 15; public static final int VERSION = 1; public static final String NAME = "usor"; public UsOr() { - super(); + super(new UsOrCoreSegment(), new UsOrGpcSegment()); } public UsOr(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,39 +38,29 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsOrCoreSegment(), new UsOrGpcSegment()); - } + protected void doDecode(CharSequence encodedString) { + List encodedSegments = SlicedCharSequence.split(encodedString, '.'); + int numEncodedSegments = encodedSegments.size(); - @Override - protected List decodeSection(CharSequence encodedString) { - if(encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - - if (encodedSegments.size() > 0) { - segments.get(0).decode(encodedSegments.get(0)); - } - - if (encodedSegments.size() > 1) { - segments.get(1).setFieldValue(UsOrField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments.get(1)); - } else { - segments.get(1).setFieldValue(UsOrField.GPC_SEGMENT_INCLUDED, false); - } + if (numEncodedSegments > 0) { + getSegment(0).decode(encodedSegments.get(0)); } - return segments; + if (numEncodedSegments > 1) { + getSegment(1).setFieldValue(UsOrField.GPC_SEGMENT_INCLUDED, true); + getSegment(1).decode(encodedSegments.get(1)); + } else { + getSegment(1).setFieldValue(UsOrField.GPC_SEGMENT_INCLUDED, false); + } } @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - - if(!segments.isEmpty()) { - encodedSegments.add(segments.get(0).encodeCharSequence()); - if(segments.size() >= 2 && segments.get(1).getFieldValue(UsOrField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encodeCharSequence()); - } + protected CharSequence doEncode() { + List encodedSegments = new ArrayList<>(size()); + + encodedSegments.add(getSegment(0).encodeCharSequence()); + if(size() >= 2 && getSegment(1).getFieldValue(UsOrField.GPC_SEGMENT_INCLUDED).equals(true)) { + encodedSegments.add(getSegment(1).encodeCharSequence()); } return SlicedCharSequence.join('.', encodedSegments); @@ -98,14 +87,12 @@ public Integer getTargetedAdvertisingOptOut() { return (Integer) this.getFieldValue(UsOrField.TARGETED_ADVERTISING_OPT_OUT); } - @SuppressWarnings("unchecked") - public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsOrField.SENSITIVE_DATA_PROCESSING); + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsOrField.SENSITIVE_DATA_PROCESSING); } - @SuppressWarnings("unchecked") - public List getKnownChildSensitiveDataConsents() { - return (List) this.getFieldValue(UsOrField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); + public FixedIntegerList getKnownChildSensitiveDataConsents() { + return (FixedIntegerList) this.getFieldValue(UsOrField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); } public Integer getAdditionalDataProcessingConsent() { diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsTn.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsTn.java index 894f9ed9..bc60d071 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsTn.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsTn.java @@ -1,25 +1,24 @@ package com.iab.gpp.encoder.section; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.field.UsTnField; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.UsTnCoreSegment; import com.iab.gpp.encoder.segment.UsTnGpcSegment; -public class UsTn extends AbstractLazilyEncodableSection { +public class UsTn extends EncodableSection { public static final int ID = 22; public static final int VERSION = 1; public static final String NAME = "ustn"; public UsTn() { - super(); + super(new UsTnCoreSegment(), new UsTnGpcSegment()); } public UsTn(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,39 +38,29 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsTnCoreSegment(), new UsTnGpcSegment()); - } + protected void doDecode(CharSequence encodedString) { + List encodedSegments = SlicedCharSequence.split(encodedString,'.'); + int numEncodedSegments = encodedSegments.size(); - @Override - protected List decodeSection(CharSequence encodedString) { - if(encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString,'.'); - - if(encodedSegments.size() > 0) { - segments.get(0).decode(encodedSegments.get(0)); - } - - if(encodedSegments.size() > 1) { - segments.get(1).setFieldValue(UsTnField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments.get(1)); - } else { - segments.get(1).setFieldValue(UsTnField.GPC_SEGMENT_INCLUDED, false); - } + if(numEncodedSegments > 0) { + getSegment(0).decode(encodedSegments.get(0)); } - return segments; + if(numEncodedSegments > 1) { + getSegment(1).setFieldValue(UsTnField.GPC_SEGMENT_INCLUDED, true); + getSegment(1).decode(encodedSegments.get(1)); + } else { + getSegment(1).setFieldValue(UsTnField.GPC_SEGMENT_INCLUDED, false); + } } @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - - if(!segments.isEmpty()) { - encodedSegments.add(segments.get(0).encodeCharSequence()); - if(segments.size() >= 2 && segments.get(1).getFieldValue(UsTnField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encodeCharSequence()); - } + protected CharSequence doEncode() { + List encodedSegments = new ArrayList<>(size()); + + encodedSegments.add(getSegment(0).encodeCharSequence()); + if(size() >= 2 && getSegment(1).getFieldValue(UsTnField.GPC_SEGMENT_INCLUDED).equals(true)) { + encodedSegments.add(getSegment(1).encodeCharSequence()); } return SlicedCharSequence.join('.', encodedSegments); @@ -98,9 +87,8 @@ public Integer getTargetedAdvertisingOptOut() { return (Integer) this.getFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT); } - @SuppressWarnings("unchecked") - public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsTnField.SENSITIVE_DATA_PROCESSING); + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsTnField.SENSITIVE_DATA_PROCESSING); } public Integer getKnownChildSensitiveDataConsents() { diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsTx.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsTx.java index 0feec120..05c1d5c0 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsTx.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsTx.java @@ -1,25 +1,24 @@ package com.iab.gpp.encoder.section; -import java.util.Arrays; import java.util.ArrayList; import java.util.List; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.field.UsTxField; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.UsTxCoreSegment; import com.iab.gpp.encoder.segment.UsTxGpcSegment; -public class UsTx extends AbstractLazilyEncodableSection { +public class UsTx extends EncodableSection { public static final int ID = 16; public static final int VERSION = 1; public static final String NAME = "ustx"; public UsTx() { - super(); + super(new UsTxCoreSegment(), new UsTxGpcSegment()); } public UsTx(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,39 +38,29 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsTxCoreSegment(), new UsTxGpcSegment()); - } + protected void doDecode(CharSequence encodedString) { + List encodedSegments = SlicedCharSequence.split(encodedString, '.'); + int numEncodedSegments = encodedSegments.size(); - @Override - protected List decodeSection(CharSequence encodedString) { - if(encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - - if (encodedSegments.size() > 0) { - segments.get(0).decode(encodedSegments.get(0)); - } - - if (encodedSegments.size() > 1) { - segments.get(1).setFieldValue(UsTxField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments.get(1)); - } else { - segments.get(1).setFieldValue(UsTxField.GPC_SEGMENT_INCLUDED, false); - } + if (numEncodedSegments > 0) { + getSegment(0).decode(encodedSegments.get(0)); } - return segments; + if (numEncodedSegments > 1) { + getSegment(1).setFieldValue(UsTxField.GPC_SEGMENT_INCLUDED, true); + getSegment(1).decode(encodedSegments.get(1)); + } else { + getSegment(1).setFieldValue(UsTxField.GPC_SEGMENT_INCLUDED, false); + } } @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - - if(!segments.isEmpty()) { - encodedSegments.add(segments.get(0).encodeCharSequence()); - if(segments.size() >= 2 && segments.get(1).getFieldValue(UsTxField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encodeCharSequence()); - } + protected CharSequence doEncode() { + List encodedSegments = new ArrayList<>(size()); + + encodedSegments.add(getSegment(0).encodeCharSequence()); + if(size() >= 2 && getSegment(1).getFieldValue(UsTxField.GPC_SEGMENT_INCLUDED).equals(true)) { + encodedSegments.add(getSegment(1).encodeCharSequence()); } return SlicedCharSequence.join('.', encodedSegments); @@ -98,9 +87,8 @@ public Integer getTargetedAdvertisingOptOut() { return (Integer) this.getFieldValue(UsTxField.TARGETED_ADVERTISING_OPT_OUT); } - @SuppressWarnings("unchecked") - public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsTxField.SENSITIVE_DATA_PROCESSING); + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsTxField.SENSITIVE_DATA_PROCESSING); } public Integer getKnownChildSensitiveDataConsents() { diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsUt.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsUt.java index 96d2217b..68a7a729 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsUt.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsUt.java @@ -1,24 +1,21 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.field.UsUtField; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.UsUtCoreSegment; -public class UsUt extends AbstractLazilyEncodableSection { +public class UsUt extends EncodableSection { public static final int ID = 11; public static final int VERSION = 1; public static final String NAME = "usut"; public UsUt() { - super(); + super(new UsUtCoreSegment()); } public UsUt(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -37,36 +34,6 @@ public int getVersion() { return UsUt.VERSION; } - @Override - protected List initializeSegments() { - return Collections.singletonList(new UsUtCoreSegment()); - } - - @Override - protected List decodeSection(CharSequence encodedString) { - if (encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - - for (int i = 0; i < segments.size(); i++) { - if (encodedSegments.size() > i) { - segments.get(i).decode(encodedSegments.get(i)); - } - } - } - - return segments; - } - - @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - for(EncodableSegment segment : segments) { - encodedSegments.add(segment.encodeCharSequence()); - } - return SlicedCharSequence.join('.', encodedSegments); - } - - public Integer getSharingNotice() { return (Integer) this.getFieldValue(UsUtField.SHARING_NOTICE); } @@ -91,9 +58,8 @@ public Integer getTargetedAdvertisingOptOut() { return (Integer) this.getFieldValue(UsUtField.TARGETED_ADVERTISING_OPT_OUT); } - @SuppressWarnings("unchecked") - public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsUtField.SENSITIVE_DATA_PROCESSING); + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsUtField.SENSITIVE_DATA_PROCESSING); } public Integer getKnownChildSensitiveDataConsents() { diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsVa.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsVa.java index c144a2d3..ee12afe5 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsVa.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsVa.java @@ -1,24 +1,21 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.field.UsVaField; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.UsVaCoreSegment; -public class UsVa extends AbstractLazilyEncodableSection { +public class UsVa extends EncodableSection { public static final int ID = 9; public static final int VERSION = 1; public static final String NAME = "usva"; public UsVa() { - super(); + super(new UsVaCoreSegment()); } public UsVa(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -37,36 +34,6 @@ public int getVersion() { return UsVa.VERSION; } - @Override - protected List initializeSegments() { - return Collections.singletonList(new UsVaCoreSegment()); - } - - @Override - protected List decodeSection(CharSequence encodedString) { - if (encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - - for (int i = 0; i < segments.size(); i++) { - if (encodedSegments.size() > i) { - segments.get(i).decode(encodedSegments.get(i)); - } - } - } - - return segments; - } - - @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - for (EncodableSegment segment : segments) { - encodedSegments.add(segment.encodeCharSequence()); - } - return SlicedCharSequence.join('.', encodedSegments); - } - - public Integer getSharingNotice() { return (Integer) this.getFieldValue(UsVaField.SHARING_NOTICE); } @@ -87,9 +54,8 @@ public Integer getTargetedAdvertisingOptOut() { return (Integer) this.getFieldValue(UsVaField.TARGETED_ADVERTISING_OPT_OUT); } - @SuppressWarnings("unchecked") - public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsVaField.SENSITIVE_DATA_PROCESSING); + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsVaField.SENSITIVE_DATA_PROCESSING); } public Integer getKnownChildSensitiveDataConsents() { diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UspV1.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UspV1.java index 0e1f7f88..615badc3 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UspV1.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UspV1.java @@ -1,24 +1,20 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import com.iab.gpp.encoder.field.UspV1Field; -import com.iab.gpp.encoder.segment.EncodableSegment; import com.iab.gpp.encoder.segment.UspV1CoreSegment; -public class UspV1 extends AbstractLazilyEncodableSection { +public class UspV1 extends EncodableSection { public static final int ID = 6; public static final int VERSION = 1; public static final String NAME = "uspv1"; public UspV1() { - super(); + super(new UspV1CoreSegment()); } public UspV1(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -37,36 +33,6 @@ public int getVersion() { return UspV1.VERSION; } - @Override - protected List initializeSegments() { - return Collections.singletonList(new UspV1CoreSegment()); - } - - @Override - protected List decodeSection(CharSequence encodedString) { - if (encodedString != null && encodedString.length() > 0) { - List encodedSegments = SlicedCharSequence.split(encodedString, '.'); - - for (int i=0; i < segments.size(); i++) { - if (encodedSegments.size() > i) { - segments.get(i).decode(encodedSegments.get(i)); - } - } - } - - return segments; - } - - @Override - protected CharSequence encodeSection(List segments) { - List encodedSegments = new ArrayList<>(segments.size()); - for(EncodableSegment segment : segments) { - encodedSegments.add(segment.encodeCharSequence()); - } - return SlicedCharSequence.join('.', encodedSegments); - } - - public Character getNotice() { return (Character) this.getFieldValue(UspV1Field.NOTICE); } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/AbstractBase64Segment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/AbstractBase64Segment.java new file mode 100644 index 00000000..05af6a33 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/AbstractBase64Segment.java @@ -0,0 +1,67 @@ +package com.iab.gpp.encoder.segment; + +import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; +import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; +import com.iab.gpp.encoder.bitstring.BitString; +import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; +import com.iab.gpp.encoder.datatype.AbstractEncodableBitStringDataType; +import com.iab.gpp.encoder.error.DecodingException; +import com.iab.gpp.encoder.error.EncodingException; +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.field.FieldNames; + +abstract class AbstractBase64Segment & FieldKey> extends AbstractLazilyEncodableSegment> { + + protected AbstractBase64Segment(FieldNames fieldNames) { + super(fieldNames); + } + + protected AbstractBase64UrlEncoder getBase64UrlEncoder() { + return CompressedBase64UrlEncoder.getInstance(); + } + + @Override + protected final CharSequence doEncode() { + BitStringBuilder bitString = new BitStringBuilder(); + int size = fieldNames.size(); + for (int i = 0; i < size; i++) { + AbstractEncodableBitStringDataType field = get(i); + if (field != null) { + field.encode(bitString); + } else { + throw new EncodingException("Field not found: '" + fieldNames.get(i) + "'"); + } + } + + return getBase64UrlEncoder().encode(bitString); + } + + @Override + protected final void doDecode(CharSequence encodedString) { + try { + BitString bitString = decodeBitString(encodedString); + int size = fieldNames.size(); + BitStringReader reader = new BitStringReader(bitString); + for (int i = 0; i < size; i++) { + AbstractEncodableBitStringDataType field = get(i); + if (field != null) { + try { + field.decode(reader); + } catch (Exception e) { + throw new DecodingException("Unable to decode " + fieldNames.get(i), e); + } + } else { + throw new DecodingException("Field not found: '" + fieldNames.get(i) + "'"); + } + } + } catch (Exception e) { + throw new DecodingException("Unable to decode "+ getClass().getSimpleName() +" '" + encodedString + "'", e); + } + } + + protected BitString decodeBitString(CharSequence encodedString) { + return getBase64UrlEncoder().decode(encodedString); + } + +} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/AbstractLazilyEncodableSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/AbstractLazilyEncodableSegment.java index 9e07c18e..81372e59 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/AbstractLazilyEncodableSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/AbstractLazilyEncodableSegment.java @@ -1,16 +1,17 @@ package com.iab.gpp.encoder.segment; -import java.util.List; import java.util.function.Predicate; import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.error.InvalidFieldException; -import com.iab.gpp.encoder.field.Fields; +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.field.FieldNames; -public abstract class AbstractLazilyEncodableSegment> implements EncodableSegment { +abstract class AbstractLazilyEncodableSegment & FieldKey, T extends DataType> extends EncodableSegment { protected static final Predicate nullableBooleanAsTwoBitIntegerValidator = (n -> n >= 0 && n <= 2); protected static final Predicate nonNullableBooleanAsTwoBitIntegerValidator = (n -> n >= 1 && n <= 2); - protected static final Predicate> nullableBooleanAsTwoBitIntegerListValidator = (l -> { + protected static final Predicate nullableBooleanAsTwoBitIntegerListValidator = (l -> { for (int n : l) { if (n < 0 || n > 2) { return false; @@ -19,34 +20,75 @@ public abstract class AbstractLazilyEncodableSegment> implem return true; }); - protected T fields; + protected final FieldNames fieldNames; + private final Object[] values; - private CharSequence encodedString = null; + protected AbstractLazilyEncodableSegment(FieldNames fieldNames) { + this.fieldNames = fieldNames; + this.values = new Object[fieldNames.size()]; + } - private boolean decoded = true; - protected AbstractLazilyEncodableSegment() { - this.fields = initializeFields(); + @Override + public final DataType getField(E fieldName) { + ensureDecode(); + return get(fieldName); } - protected abstract T initializeFields(); + @Override + public final E resolveKey(FieldKey fieldName) { + return fieldNames.resolveKey(fieldName); + } - protected abstract StringBuilder encodeSegment(T fields); + protected final void initialize(E key, T value) { + Integer index = fieldNames.getIndex(key); + if (index == null) { + throw new IllegalArgumentException("invalid key "+ key); + } + values[index] = value; + } - protected abstract void decodeSegment(CharSequence encodedString, T fields); + @SuppressWarnings("unchecked") + protected final T get(int index) { + return (T) values[index]; + } - public boolean hasField(String fieldName) { - return this.fields.containsKey(fieldName); + protected final T get(E key) { + Integer index = fieldNames.getIndex(key); + if (index != null) { + return get(index); + } + return null; } - public Object getFieldValue(String fieldName) { - if (!this.decoded) { - this.decodeSegment(this.encodedString, this.fields); - this.fields.markClean(); - this.decoded = true; + @Override + public final boolean isDirty() { + int size = fieldNames.size(); + for (int i = 0; i < size; i++) { + T value = get(i); + if (value != null && value.isDirty()) { + return true; + } } + return false; + } - DataType field = this.fields.get(fieldName); + @Override + public final void setDirty(boolean dirty) { + int size = fieldNames.size(); + for (int i = 0; i < size; i++) { + T value = get(i); + if (value != null) { + value.setDirty(dirty); + } + } + } + + @Override + public Object getFieldValue(E fieldName) { + ensureDecode(); + + DataType field = this.get(fieldName); if (field != null) { return field.getValue(); } else { @@ -54,14 +96,11 @@ public Object getFieldValue(String fieldName) { } } - public void setFieldValue(String fieldName, Object value) { - if (!this.decoded) { - this.decodeSegment(this.encodedString, this.fields); - this.fields.markClean(); - this.decoded = true; - } + @Override + public void setFieldValue(E fieldName, Object value) { + ensureDecode(); - DataType field = this.fields.get(fieldName); + DataType field = this.get(fieldName); if (field != null) { field.setValue(value); } else { @@ -69,29 +108,15 @@ public void setFieldValue(String fieldName, Object value) { } } - public CharSequence encodeCharSequence() { - if (this.encodedString == null || this.encodedString.length() == 0 || this.fields.isDirty()) { - this.encodedString = encodeSegment(this.fields); - this.fields.markClean(); - this.decoded = true; - } - - return this.encodedString; - } - - public void decode(CharSequence encodedString) { - this.encodedString = encodedString; - this.fields.markClean(); - this.decoded = false; - } - + @Override public String toString() { + ensureDecode(); StringBuilder sb = new StringBuilder(); sb.append("{name=").append(getClass().getSimpleName()); - for (String field : fields.getNames()) { - if (hasField(field)) { - sb.append(", ").append(field).append('=').append(getFieldValue(field)); - } + int size = fieldNames.size(); + for (int i = 0; i < size; i++) { + E field = fieldNames.get(i); + sb.append(", ").append(field.getName()).append('=').append(get(field)); } sb.append('}'); return sb.toString(); diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/EncodableSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/EncodableSegment.java index 033b14c9..00bfdfdd 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/EncodableSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/EncodableSegment.java @@ -1,14 +1,15 @@ package com.iab.gpp.encoder.segment; -public interface EncodableSegment { +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.section.AbstractEncodable; - boolean hasField(String fieldName); +public abstract class EncodableSegment & FieldKey> extends AbstractEncodable { + public abstract E resolveKey(FieldKey fieldName); - Object getFieldValue(String fieldName); + public abstract DataType getField(E fieldName); + + public abstract Object getFieldValue(E fieldName); - void setFieldValue(String fieldName, Object value); - - CharSequence encodeCharSequence(); - - void decode(CharSequence encodedString); + public abstract void setFieldValue(E fieldName, Object value); } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/HeaderV1CoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/HeaderV1CoreSegment.java index adea375e..3e926695 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/HeaderV1CoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/HeaderV1CoreSegment.java @@ -1,57 +1,17 @@ package com.iab.gpp.encoder.segment; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFibonacciIntegerRange; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.HeaderV1Field; import com.iab.gpp.encoder.section.HeaderV1; -public final class HeaderV1CoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class HeaderV1CoreSegment extends AbstractBase64Segment { public HeaderV1CoreSegment() { - super(); - } - - public HeaderV1CoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(HeaderV1Field.HEADER_CORE_SEGMENT_FIELD_NAMES); - fields.put(HeaderV1Field.ID, new EncodableFixedInteger(6, HeaderV1.ID)); - fields.put(HeaderV1Field.VERSION, new EncodableFixedInteger(6, HeaderV1.VERSION)); - fields.put(HeaderV1Field.SECTION_IDS, new EncodableFibonacciIntegerRange()); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode HeaderV1CoreSegment '" + encodedString + "'", e); - } + super(HeaderV1Field.HEADER_CORE_SEGMENT_FIELD_NAMES); + initialize(HeaderV1Field.ID, new EncodableFixedInteger(6, HeaderV1.ID)); + initialize(HeaderV1Field.VERSION, new EncodableFixedInteger(6, HeaderV1.VERSION)); + initialize(HeaderV1Field.SECTION_IDS, new EncodableFibonacciIntegerRange()); } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1CoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1CoreSegment.java index 5b081f6e..6be9b664 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1CoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1CoreSegment.java @@ -1,11 +1,6 @@ package com.iab.gpp.encoder.segment; import java.time.Instant; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableArrayOfFixedIntegerRanges; import com.iab.gpp.encoder.datatype.EncodableBoolean; import com.iab.gpp.encoder.datatype.EncodableDatetime; @@ -13,66 +8,31 @@ import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedString; import com.iab.gpp.encoder.datatype.EncodableOptimizedFixedRange; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.TcfCaV1Field; import com.iab.gpp.encoder.section.TcfCaV1; -public final class TcfCaV1CoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class TcfCaV1CoreSegment extends AbstractBase64Segment { public TcfCaV1CoreSegment() { - super(); - } - - public TcfCaV1CoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - // NOTE: TcfCaV1.setFieldValue records modifications + super(TcfCaV1Field.TCFCAV1_CORE_SEGMENT_FIELD_NAMES); + // NOTE: TcfCaV1.onSet records modifications Instant date = Instant.EPOCH; - - EncodableBitStringFields fields = new EncodableBitStringFields(TcfCaV1Field.TCFCAV1_CORE_SEGMENT_FIELD_NAMES); - fields.put(TcfCaV1Field.VERSION, new EncodableFixedInteger(6, TcfCaV1.VERSION)); - fields.put(TcfCaV1Field.CREATED, new EncodableDatetime(date)); - fields.put(TcfCaV1Field.LAST_UPDATED, new EncodableDatetime(date)); - fields.put(TcfCaV1Field.CMP_ID, new EncodableFixedInteger(12, 0)); - fields.put(TcfCaV1Field.CMP_VERSION, new EncodableFixedInteger(12, 0)); - fields.put(TcfCaV1Field.CONSENT_SCREEN, new EncodableFixedInteger(6, 0)); - fields.put(TcfCaV1Field.CONSENT_LANGUAGE, new EncodableFixedString(2, "EN")); - fields.put(TcfCaV1Field.VENDOR_LIST_VERSION, new EncodableFixedInteger(12, 0)); - fields.put(TcfCaV1Field.TCF_POLICY_VERSION, new EncodableFixedInteger(6, 2)); - fields.put(TcfCaV1Field.USE_NON_STANDARD_STACKS, new EncodableBoolean(false)); - fields.put(TcfCaV1Field.SPECIAL_FEATURE_EXPRESS_CONSENT, new EncodableFixedBitfield(12)); - fields.put(TcfCaV1Field.PURPOSES_EXPRESS_CONSENT, new EncodableFixedBitfield(24)); - fields.put(TcfCaV1Field.PURPOSES_IMPLIED_CONSENT, new EncodableFixedBitfield(24)); - fields.put(TcfCaV1Field.VENDOR_EXPRESS_CONSENT, new EncodableOptimizedFixedRange()); - fields.put(TcfCaV1Field.VENDOR_IMPLIED_CONSENT, new EncodableOptimizedFixedRange()); - fields.put(TcfCaV1Field.PUB_RESTRICTIONS, new EncodableArrayOfFixedIntegerRanges(6, 2, false)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); + initialize(TcfCaV1Field.VERSION, new EncodableFixedInteger(6, TcfCaV1.VERSION)); + initialize(TcfCaV1Field.CREATED, new EncodableDatetime(date)); + initialize(TcfCaV1Field.LAST_UPDATED, new EncodableDatetime(date)); + initialize(TcfCaV1Field.CMP_ID, new EncodableFixedInteger(12, 0)); + initialize(TcfCaV1Field.CMP_VERSION, new EncodableFixedInteger(12, 0)); + initialize(TcfCaV1Field.CONSENT_SCREEN, new EncodableFixedInteger(6, 0)); + initialize(TcfCaV1Field.CONSENT_LANGUAGE, new EncodableFixedString(2, "EN")); + initialize(TcfCaV1Field.VENDOR_LIST_VERSION, new EncodableFixedInteger(12, 0)); + initialize(TcfCaV1Field.TCF_POLICY_VERSION, new EncodableFixedInteger(6, 2)); + initialize(TcfCaV1Field.USE_NON_STANDARD_STACKS, new EncodableBoolean(false)); + initialize(TcfCaV1Field.SPECIAL_FEATURE_EXPRESS_CONSENT, new EncodableFixedBitfield(12)); + initialize(TcfCaV1Field.PURPOSES_EXPRESS_CONSENT, new EncodableFixedBitfield(24)); + initialize(TcfCaV1Field.PURPOSES_IMPLIED_CONSENT, new EncodableFixedBitfield(24)); + initialize(TcfCaV1Field.VENDOR_EXPRESS_CONSENT, new EncodableOptimizedFixedRange()); + initialize(TcfCaV1Field.VENDOR_IMPLIED_CONSENT, new EncodableOptimizedFixedRange()); + initialize(TcfCaV1Field.PUB_RESTRICTIONS, new EncodableArrayOfFixedIntegerRanges(6, 2, false)); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode TcfCaV1CoreSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1DisclosedVendorsSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1DisclosedVendorsSegment.java index 7d1f83a9..939cfbad 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1DisclosedVendorsSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1DisclosedVendorsSegment.java @@ -1,54 +1,15 @@ package com.iab.gpp.encoder.segment; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableOptimizedFixedRange; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.TcfCaV1Field; -public final class TcfCaV1DisclosedVendorsSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class TcfCaV1DisclosedVendorsSegment extends AbstractBase64Segment { public TcfCaV1DisclosedVendorsSegment() { - super(); - } - - public TcfCaV1DisclosedVendorsSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(TcfCaV1Field.TCFCAV1_DISCLOSED_VENDORS_SEGMENT_FIELD_NAMES); - fields.put(TcfCaV1Field.DISCLOSED_VENDORS_SEGMENT_TYPE, new EncodableFixedInteger(3, 1)); - fields.put(TcfCaV1Field.DISCLOSED_VENDORS, new EncodableOptimizedFixedRange()); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); + super(TcfCaV1Field.TCFCAV1_DISCLOSED_VENDORS_SEGMENT_FIELD_NAMES); + initialize(TcfCaV1Field.DISCLOSED_VENDORS_SEGMENT_TYPE, new EncodableFixedInteger(3, 1)); + initialize(TcfCaV1Field.DISCLOSED_VENDORS, new EncodableOptimizedFixedRange()); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if (encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode TcfCaV1DisclosedVendorsSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1PublisherPurposesSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1PublisherPurposesSegment.java index 0424bb5d..62f7f82f 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1PublisherPurposesSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1PublisherPurposesSegment.java @@ -1,41 +1,21 @@ package com.iab.gpp.encoder.segment; import java.util.function.IntSupplier; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedBitfield; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFlexibleBitfield; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.TcfCaV1Field; -public final class TcfCaV1PublisherPurposesSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class TcfCaV1PublisherPurposesSegment extends AbstractBase64Segment { public TcfCaV1PublisherPurposesSegment() { - super(); - } - - public TcfCaV1PublisherPurposesSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(TcfCaV1Field.TCFCAV1_PUBLISHER_PURPOSES_SEGMENT_FIELD_NAMES); - fields.put(TcfCaV1Field.PUB_PURPOSES_SEGMENT_TYPE, new EncodableFixedInteger(3, 3)); - fields.put(TcfCaV1Field.PUB_PURPOSES_EXPRESS_CONSENT, new EncodableFixedBitfield(24)); - fields.put(TcfCaV1Field.PUB_PURPOSES_IMPLIED_CONSENT, new EncodableFixedBitfield(24)); + super(TcfCaV1Field.TCFCAV1_PUBLISHER_PURPOSES_SEGMENT_FIELD_NAMES); + initialize(TcfCaV1Field.PUB_PURPOSES_SEGMENT_TYPE, new EncodableFixedInteger(3, 3)); + initialize(TcfCaV1Field.PUB_PURPOSES_EXPRESS_CONSENT, new EncodableFixedBitfield(24)); + initialize(TcfCaV1Field.PUB_PURPOSES_IMPLIED_CONSENT, new EncodableFixedBitfield(24)); EncodableFixedInteger numCustomPurposes = new EncodableFixedInteger(6, 0); - fields.put(TcfCaV1Field.NUM_CUSTOM_PURPOSES, numCustomPurposes); + initialize(TcfCaV1Field.NUM_CUSTOM_PURPOSES, numCustomPurposes); IntSupplier getLengthSupplier = new IntSupplier() { @@ -46,30 +26,11 @@ public int getAsInt() { }; - fields.put(TcfCaV1Field.CUSTOM_PURPOSES_EXPRESS_CONSENT, + initialize(TcfCaV1Field.CUSTOM_PURPOSES_EXPRESS_CONSENT, new EncodableFlexibleBitfield(getLengthSupplier)); - fields.put(TcfCaV1Field.CUSTOM_PURPOSES_IMPLIED_CONSENT, + initialize(TcfCaV1Field.CUSTOM_PURPOSES_IMPLIED_CONSENT, new EncodableFlexibleBitfield(getLengthSupplier)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode TcfCaV1PublisherPurposesSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2CoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2CoreSegment.java index 98f81351..4c63d7c8 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2CoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2CoreSegment.java @@ -3,9 +3,6 @@ import java.time.Instant; import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; import com.iab.gpp.encoder.base64.TraditionalBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableArrayOfFixedIntegerRanges; import com.iab.gpp.encoder.datatype.EncodableBoolean; import com.iab.gpp.encoder.datatype.EncodableDatetime; @@ -13,70 +10,40 @@ import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedString; import com.iab.gpp.encoder.datatype.EncodableOptimizedFixedRange; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.TcfEuV2Field; import com.iab.gpp.encoder.section.TcfEuV2; -public final class TcfEuV2CoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = TraditionalBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class TcfEuV2CoreSegment extends AbstractBase64Segment { public TcfEuV2CoreSegment() { - super(); - } - - public TcfEuV2CoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - // NOTE: TcfEuV2.setFieldValue records modifications + super(TcfEuV2Field.TCFEUV2_CORE_SEGMENT_FIELD_NAMES); + // NOTE: TcfEuV2.onSet records modifications Instant date = Instant.EPOCH; - EncodableBitStringFields fields = new EncodableBitStringFields(TcfEuV2Field.TCFEUV2_CORE_SEGMENT_FIELD_NAMES); - fields.put(TcfEuV2Field.VERSION, new EncodableFixedInteger(6, TcfEuV2.VERSION)); - fields.put(TcfEuV2Field.CREATED, new EncodableDatetime(date)); - fields.put(TcfEuV2Field.LAST_UPDATED, new EncodableDatetime(date)); - fields.put(TcfEuV2Field.CMP_ID, new EncodableFixedInteger(12, 0)); - fields.put(TcfEuV2Field.CMP_VERSION, new EncodableFixedInteger(12, 0)); - fields.put(TcfEuV2Field.CONSENT_SCREEN, new EncodableFixedInteger(6, 0)); - fields.put(TcfEuV2Field.CONSENT_LANGUAGE, new EncodableFixedString(2, "EN")); - fields.put(TcfEuV2Field.VENDOR_LIST_VERSION, new EncodableFixedInteger(12, 0)); - fields.put(TcfEuV2Field.POLICY_VERSION, new EncodableFixedInteger(6, 2)); - fields.put(TcfEuV2Field.IS_SERVICE_SPECIFIC, new EncodableBoolean(false)); - fields.put(TcfEuV2Field.USE_NON_STANDARD_STACKS, new EncodableBoolean(false)); - fields.put(TcfEuV2Field.SPECIAL_FEATURE_OPTINS, new EncodableFixedBitfield(12)); - fields.put(TcfEuV2Field.PURPOSE_CONSENTS, new EncodableFixedBitfield(24)); - fields.put(TcfEuV2Field.PURPOSE_LEGITIMATE_INTERESTS, new EncodableFixedBitfield(24)); - fields.put(TcfEuV2Field.PURPOSE_ONE_TREATMENT, new EncodableBoolean(false)); - fields.put(TcfEuV2Field.PUBLISHER_COUNTRY_CODE, new EncodableFixedString(2, "AA")); - fields.put(TcfEuV2Field.VENDOR_CONSENTS, new EncodableOptimizedFixedRange()); - fields.put(TcfEuV2Field.VENDOR_LEGITIMATE_INTERESTS, new EncodableOptimizedFixedRange()); - - fields.put(TcfEuV2Field.PUBLISHER_RESTRICTIONS, new EncodableArrayOfFixedIntegerRanges(6, 2, false)); - return fields; + initialize(TcfEuV2Field.VERSION, new EncodableFixedInteger(6, TcfEuV2.VERSION)); + initialize(TcfEuV2Field.CREATED, new EncodableDatetime(date)); + initialize(TcfEuV2Field.LAST_UPDATED, new EncodableDatetime(date)); + initialize(TcfEuV2Field.CMP_ID, new EncodableFixedInteger(12, 0)); + initialize(TcfEuV2Field.CMP_VERSION, new EncodableFixedInteger(12, 0)); + initialize(TcfEuV2Field.CONSENT_SCREEN, new EncodableFixedInteger(6, 0)); + initialize(TcfEuV2Field.CONSENT_LANGUAGE, new EncodableFixedString(2, "EN")); + initialize(TcfEuV2Field.VENDOR_LIST_VERSION, new EncodableFixedInteger(12, 0)); + initialize(TcfEuV2Field.POLICY_VERSION, new EncodableFixedInteger(6, 2)); + initialize(TcfEuV2Field.IS_SERVICE_SPECIFIC, new EncodableBoolean(false)); + initialize(TcfEuV2Field.USE_NON_STANDARD_STACKS, new EncodableBoolean(false)); + initialize(TcfEuV2Field.SPECIAL_FEATURE_OPTINS, new EncodableFixedBitfield(12)); + initialize(TcfEuV2Field.PURPOSE_CONSENTS, new EncodableFixedBitfield(24)); + initialize(TcfEuV2Field.PURPOSE_LEGITIMATE_INTERESTS, new EncodableFixedBitfield(24)); + initialize(TcfEuV2Field.PURPOSE_ONE_TREATMENT, new EncodableBoolean(false)); + initialize(TcfEuV2Field.PUBLISHER_COUNTRY_CODE, new EncodableFixedString(2, "AA")); + initialize(TcfEuV2Field.VENDOR_CONSENTS, new EncodableOptimizedFixedRange()); + initialize(TcfEuV2Field.VENDOR_LEGITIMATE_INTERESTS, new EncodableOptimizedFixedRange()); + + initialize(TcfEuV2Field.PUBLISHER_RESTRICTIONS, new EncodableArrayOfFixedIntegerRanges(6, 2, false)); } - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); + protected AbstractBase64UrlEncoder getBase64UrlEncoder() { + return TraditionalBase64UrlEncoder.getInstance(); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode TcfEuV2CoreSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2PublisherPurposesSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2PublisherPurposesSegment.java index 69135848..3cd9ecce 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2PublisherPurposesSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2PublisherPurposesSegment.java @@ -3,39 +3,21 @@ import java.util.function.IntSupplier; import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; import com.iab.gpp.encoder.base64.TraditionalBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedBitfield; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFlexibleBitfield; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.TcfEuV2Field; -public final class TcfEuV2PublisherPurposesSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = TraditionalBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class TcfEuV2PublisherPurposesSegment extends AbstractBase64Segment { public TcfEuV2PublisherPurposesSegment() { - super(); - } - - public TcfEuV2PublisherPurposesSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(TcfEuV2Field.TCFEUV2_PUBLISHER_PURPOSES_SEGMENT_FIELD_NAMES); - fields.put(TcfEuV2Field.PUBLISHER_PURPOSES_SEGMENT_TYPE, new EncodableFixedInteger(3, 3)); - fields.put(TcfEuV2Field.PUBLISHER_CONSENTS, new EncodableFixedBitfield(24)); - fields.put(TcfEuV2Field.PUBLISHER_LEGITIMATE_INTERESTS, new EncodableFixedBitfield(24)); + super(TcfEuV2Field.TCFEUV2_PUBLISHER_PURPOSES_SEGMENT_FIELD_NAMES); + initialize(TcfEuV2Field.PUBLISHER_PURPOSES_SEGMENT_TYPE, new EncodableFixedInteger(3, 3)); + initialize(TcfEuV2Field.PUBLISHER_CONSENTS, new EncodableFixedBitfield(24)); + initialize(TcfEuV2Field.PUBLISHER_LEGITIMATE_INTERESTS, new EncodableFixedBitfield(24)); EncodableFixedInteger numCustomPurposes = new EncodableFixedInteger(6, 0); - fields.put(TcfEuV2Field.NUM_CUSTOM_PURPOSES, numCustomPurposes); + initialize(TcfEuV2Field.NUM_CUSTOM_PURPOSES, numCustomPurposes); IntSupplier getLengthSupplier = new IntSupplier() { @@ -46,30 +28,15 @@ public int getAsInt() { }; - fields.put(TcfEuV2Field.PUBLISHER_CUSTOM_CONSENTS, + initialize(TcfEuV2Field.PUBLISHER_CUSTOM_CONSENTS, new EncodableFlexibleBitfield(getLengthSupplier)); - fields.put(TcfEuV2Field.PUBLISHER_CUSTOM_LEGITIMATE_INTERESTS, + initialize(TcfEuV2Field.PUBLISHER_CUSTOM_LEGITIMATE_INTERESTS, new EncodableFlexibleBitfield(getLengthSupplier)); - return fields; } - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); + protected AbstractBase64UrlEncoder getBase64UrlEncoder() { + return TraditionalBase64UrlEncoder.getInstance(); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode TcfEuV2PublisherPurposesSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2VendorsAllowedSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2VendorsAllowedSegment.java index 9bd9a7c3..608d9653 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2VendorsAllowedSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2VendorsAllowedSegment.java @@ -2,53 +2,19 @@ import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; import com.iab.gpp.encoder.base64.TraditionalBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableOptimizedFixedRange; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.TcfEuV2Field; -public final class TcfEuV2VendorsAllowedSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = TraditionalBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class TcfEuV2VendorsAllowedSegment extends AbstractBase64Segment { public TcfEuV2VendorsAllowedSegment() { - super(); - } - - public TcfEuV2VendorsAllowedSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(TcfEuV2Field.TCFEUV2_VENDORS_ALLOWED_SEGMENT_FIELD_NAMES); - fields.put(TcfEuV2Field.VENDORS_ALLOWED_SEGMENT_TYPE, new EncodableFixedInteger(3, 2)); - fields.put(TcfEuV2Field.VENDORS_ALLOWED, new EncodableOptimizedFixedRange()); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); + super(TcfEuV2Field.TCFEUV2_VENDORS_ALLOWED_SEGMENT_FIELD_NAMES); + initialize(TcfEuV2Field.VENDORS_ALLOWED_SEGMENT_TYPE, new EncodableFixedInteger(3, 2)); + initialize(TcfEuV2Field.VENDORS_ALLOWED, new EncodableOptimizedFixedRange()); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode TcfEuV2VendorsAllowedSegment '" + encodedString + "'", e); - } + protected AbstractBase64UrlEncoder getBase64UrlEncoder() { + return TraditionalBase64UrlEncoder.getInstance(); } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2VendorsDisclosedSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2VendorsDisclosedSegment.java index 4db588ed..c73b21ec 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2VendorsDisclosedSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2VendorsDisclosedSegment.java @@ -2,53 +2,20 @@ import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; import com.iab.gpp.encoder.base64.TraditionalBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableOptimizedFixedRange; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.TcfEuV2Field; -public final class TcfEuV2VendorsDisclosedSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = TraditionalBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class TcfEuV2VendorsDisclosedSegment extends AbstractBase64Segment { public TcfEuV2VendorsDisclosedSegment() { - super(); - } - - public TcfEuV2VendorsDisclosedSegment(String encodedString) { - super(); - this.decode(encodedString); + super(TcfEuV2Field.TCFEUV2_VENDORS_DISCLOSED_SEGMENT_FIELD_NAMES); + initialize(TcfEuV2Field.VENDORS_DISCLOSED_SEGMENT_TYPE, new EncodableFixedInteger(3, 1)); + initialize(TcfEuV2Field.VENDORS_DISCLOSED, new EncodableOptimizedFixedRange()); } - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(TcfEuV2Field.TCFEUV2_VENDORS_DISCLOSED_SEGMENT_FIELD_NAMES); - fields.put(TcfEuV2Field.VENDORS_DISCLOSED_SEGMENT_TYPE, new EncodableFixedInteger(3, 1)); - fields.put(TcfEuV2Field.VENDORS_DISCLOSED, new EncodableOptimizedFixedRange()); - return fields; + protected AbstractBase64UrlEncoder getBase64UrlEncoder() { + return TraditionalBase64UrlEncoder.getInstance(); } - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode TcfEuV2VendorsDisclosedSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCaCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCaCoreSegment.java index eafc1f12..69d87f9d 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCaCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCaCoreSegment.java @@ -1,79 +1,38 @@ package com.iab.gpp.encoder.segment; -import java.util.Arrays; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsCaField; import com.iab.gpp.encoder.section.UsCa; -public final class UsCaCoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsCaCoreSegment extends AbstractBase64Segment { public UsCaCoreSegment() { - super(); - } - - public UsCaCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsCaField.USCA_CORE_SEGMENT_FIELD_NAMES); - fields.put(UsCaField.VERSION, new EncodableFixedInteger(6, UsCa.VERSION)); - fields.put(UsCaField.SALE_OPT_OUT_NOTICE, + super(UsCaField.USCA_CORE_SEGMENT_FIELD_NAMES); + initialize(UsCaField.VERSION, new EncodableFixedInteger(6, UsCa.VERSION)); + initialize(UsCaField.SALE_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCaField.SHARING_OPT_OUT_NOTICE, + initialize(UsCaField.SHARING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCaField.SENSITIVE_DATA_LIMIT_USE_NOTICE, + initialize(UsCaField.SENSITIVE_DATA_LIMIT_USE_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCaField.SALE_OPT_OUT, + initialize(UsCaField.SALE_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCaField.SHARING_OPT_OUT, + initialize(UsCaField.SHARING_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCaField.SENSITIVE_DATA_PROCESSING, - new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0, 0)) + initialize(UsCaField.SENSITIVE_DATA_PROCESSING, + new EncodableFixedIntegerList(2, 9) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsCaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, Arrays.asList(0, 0)) + initialize(UsCaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, 2) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsCaField.PERSONAL_DATA_CONSENTS, + initialize(UsCaField.PERSONAL_DATA_CONSENTS, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCaField.MSPA_COVERED_TRANSACTION, + initialize(UsCaField.MSPA_COVERED_TRANSACTION, new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCaField.MSPA_OPT_OUT_OPTION_MODE, + initialize(UsCaField.MSPA_OPT_OUT_OPTION_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCaField.MSPA_SERVICE_PROVIDER_MODE, + initialize(UsCaField.MSPA_SERVICE_PROVIDER_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if (encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsCaCoreSegment '" + encodedString + "'", e); - } } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCaGpcSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCaGpcSegment.java index ed72554c..47813843 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCaGpcSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCaGpcSegment.java @@ -1,56 +1,17 @@ package com.iab.gpp.encoder.segment; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableBoolean; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.UnencodableBoolean; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsCaField; -public final class UsCaGpcSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsCaGpcSegment extends AbstractBase64Segment { public UsCaGpcSegment() { - super(); - } - - public UsCaGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsCaField.USCA_GPC_SEGMENT_FIELD_NAMES); - fields.put(UsCaField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsCaField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); - fields.put(UsCaField.GPC, new EncodableBoolean(false)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); + super(UsCaField.USCA_GPC_SEGMENT_FIELD_NAMES); + initialize(UsCaField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); + initialize(UsCaField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); + initialize(UsCaField.GPC, new EncodableBoolean(false)); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsCaGpcSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCoCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCoCoreSegment.java index 98e96fc9..2fdd170c 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCoCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCoCoreSegment.java @@ -1,76 +1,35 @@ package com.iab.gpp.encoder.segment; -import java.util.Arrays; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsCoField; import com.iab.gpp.encoder.section.UsCo; -public final class UsCoCoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsCoCoreSegment extends AbstractBase64Segment { public UsCoCoreSegment() { - super(); - } - - public UsCoCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsCoField.USCO_CORE_SEGMENT_FIELD_NAMES); - fields.put(UsCoField.VERSION, new EncodableFixedInteger(6, UsCo.VERSION)); - fields.put(UsCoField.SHARING_NOTICE, + super(UsCoField.USCO_CORE_SEGMENT_FIELD_NAMES); + initialize(UsCoField.VERSION, new EncodableFixedInteger(6, UsCo.VERSION)); + initialize(UsCoField.SHARING_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCoField.SALE_OPT_OUT_NOTICE, + initialize(UsCoField.SALE_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCoField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + initialize(UsCoField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCoField.SALE_OPT_OUT, + initialize(UsCoField.SALE_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCoField.TARGETED_ADVERTISING_OPT_OUT, + initialize(UsCoField.TARGETED_ADVERTISING_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCoField.SENSITIVE_DATA_PROCESSING, new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0)) + initialize(UsCoField.SENSITIVE_DATA_PROCESSING, new EncodableFixedIntegerList(2, 7) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsCoField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + initialize(UsCoField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCoField.MSPA_COVERED_TRANSACTION, + initialize(UsCoField.MSPA_COVERED_TRANSACTION, new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCoField.MSPA_OPT_OUT_OPTION_MODE, + initialize(UsCoField.MSPA_OPT_OUT_OPTION_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCoField.MSPA_SERVICE_PROVIDER_MODE, + initialize(UsCoField.MSPA_SERVICE_PROVIDER_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if (encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsCoCoreSegment '" + encodedString + "'", e); - } } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCoGpcSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCoGpcSegment.java index 509e8aaf..884e6b0e 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCoGpcSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCoGpcSegment.java @@ -1,56 +1,17 @@ package com.iab.gpp.encoder.segment; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableBoolean; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.UnencodableBoolean; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsCoField; -public final class UsCoGpcSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsCoGpcSegment extends AbstractBase64Segment { public UsCoGpcSegment() { - super(); - } - - public UsCoGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsCoField.USCO_GPC_SEGMENT_FIELD_NAMES); - fields.put(UsCoField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsCoField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); - fields.put(UsCoField.GPC, new EncodableBoolean(false)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); + super(UsCoField.USCO_GPC_SEGMENT_FIELD_NAMES); + initialize(UsCoField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); + initialize(UsCoField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); + initialize(UsCoField.GPC, new EncodableBoolean(false)); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsCoGpcSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCtCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCtCoreSegment.java index d6e27686..bfda454c 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCtCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCtCoreSegment.java @@ -1,77 +1,36 @@ package com.iab.gpp.encoder.segment; -import java.util.Arrays; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsCtField; import com.iab.gpp.encoder.section.UsCt; -public final class UsCtCoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsCtCoreSegment extends AbstractBase64Segment { public UsCtCoreSegment() { - super(); - } - - public UsCtCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsCtField.USCT_CORE_SEGMENT_FIELD_NAMES); - fields.put(UsCtField.VERSION, new EncodableFixedInteger(6, UsCt.VERSION)); - fields.put(UsCtField.SHARING_NOTICE, + super(UsCtField.USCT_CORE_SEGMENT_FIELD_NAMES); + initialize(UsCtField.VERSION, new EncodableFixedInteger(6, UsCt.VERSION)); + initialize(UsCtField.SHARING_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCtField.SALE_OPT_OUT_NOTICE, + initialize(UsCtField.SALE_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + initialize(UsCtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCtField.SALE_OPT_OUT, + initialize(UsCtField.SALE_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCtField.TARGETED_ADVERTISING_OPT_OUT, + initialize(UsCtField.TARGETED_ADVERTISING_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCtField.SENSITIVE_DATA_PROCESSING, - new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0)) + initialize(UsCtField.SENSITIVE_DATA_PROCESSING, + new EncodableFixedIntegerList(2, 8) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsCtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0)) + initialize(UsCtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, 3) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsCtField.MSPA_COVERED_TRANSACTION, + initialize(UsCtField.MSPA_COVERED_TRANSACTION, new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCtField.MSPA_OPT_OUT_OPTION_MODE, + initialize(UsCtField.MSPA_OPT_OUT_OPTION_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCtField.MSPA_SERVICE_PROVIDER_MODE, + initialize(UsCtField.MSPA_SERVICE_PROVIDER_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if (encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsCtCoreSegment '" + encodedString + "'", e); - } } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCtGpcSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCtGpcSegment.java index b15c2ab5..b6aea217 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCtGpcSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCtGpcSegment.java @@ -1,56 +1,17 @@ package com.iab.gpp.encoder.segment; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableBoolean; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.UnencodableBoolean; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsCtField; -public final class UsCtGpcSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsCtGpcSegment extends AbstractBase64Segment { public UsCtGpcSegment() { - super(); - } - - public UsCtGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsCtField.USCT_GPC_SEGMENT_FIELD_NAMES); - fields.put(UsCtField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsCtField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); - fields.put(UsCtField.GPC, new EncodableBoolean(false)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); + super(UsCtField.USCT_GPC_SEGMENT_FIELD_NAMES); + initialize(UsCtField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); + initialize(UsCtField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); + initialize(UsCtField.GPC, new EncodableBoolean(false)); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsCtGpcSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsDeCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsDeCoreSegment.java index 534fbf28..45404a78 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsDeCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsDeCoreSegment.java @@ -1,80 +1,39 @@ package com.iab.gpp.encoder.segment; -import java.util.Arrays; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsDeField; import com.iab.gpp.encoder.section.UsDe; -public final class UsDeCoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsDeCoreSegment extends AbstractBase64Segment { public UsDeCoreSegment() { - super(); - } - - public UsDeCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsDeField.USDE_CORE_SEGMENT_FIELD_NAMES); - fields.put(UsDeField.VERSION, new EncodableFixedInteger(6, UsDe.VERSION)); - fields.put(UsDeField.PROCESSING_NOTICE, + super(UsDeField.USDE_CORE_SEGMENT_FIELD_NAMES); + initialize(UsDeField.VERSION, new EncodableFixedInteger(6, UsDe.VERSION)); + initialize(UsDeField.PROCESSING_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsDeField.SALE_OPT_OUT_NOTICE, + initialize(UsDeField.SALE_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + initialize(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsDeField.SALE_OPT_OUT, + initialize(UsDeField.SALE_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsDeField.TARGETED_ADVERTISING_OPT_OUT, + initialize(UsDeField.TARGETED_ADVERTISING_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsDeField.SENSITIVE_DATA_PROCESSING, - new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0, 0)) + initialize(UsDeField.SENSITIVE_DATA_PROCESSING, + new EncodableFixedIntegerList(2, 9) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsDeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0)) + initialize(UsDeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + new EncodableFixedIntegerList(2, 5) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsDeField.ADDITIONAL_DATA_PROCESSING_CONSENT, + initialize(UsDeField.ADDITIONAL_DATA_PROCESSING_CONSENT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsDeField.MSPA_COVERED_TRANSACTION, + initialize(UsDeField.MSPA_COVERED_TRANSACTION, new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsDeField.MSPA_OPT_OUT_OPTION_MODE, + initialize(UsDeField.MSPA_OPT_OUT_OPTION_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsDeField.MSPA_SERVICE_PROVIDER_MODE, + initialize(UsDeField.MSPA_SERVICE_PROVIDER_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if (encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsDeCoreSegment '" + encodedString + "'", e); - } } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsDeGpcSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsDeGpcSegment.java index 6978a358..f23ae86c 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsDeGpcSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsDeGpcSegment.java @@ -1,56 +1,17 @@ package com.iab.gpp.encoder.segment; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableBoolean; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.UnencodableBoolean; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsDeField; -public final class UsDeGpcSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsDeGpcSegment extends AbstractBase64Segment { public UsDeGpcSegment() { - super(); - } - - public UsDeGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsDeField.USDE_GPC_SEGMENT_FIELD_NAMES); - fields.put(UsDeField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsDeField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); - fields.put(UsDeField.GPC, new EncodableBoolean(false)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); + super(UsDeField.USDE_GPC_SEGMENT_FIELD_NAMES); + initialize(UsDeField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); + initialize(UsDeField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); + initialize(UsDeField.GPC, new EncodableBoolean(false)); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsDeGpcSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsFlCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsFlCoreSegment.java index 384d34ac..315fbdcb 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsFlCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsFlCoreSegment.java @@ -1,78 +1,38 @@ package com.iab.gpp.encoder.segment; -import java.util.Arrays; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsFlField; import com.iab.gpp.encoder.section.UsFl; -public final class UsFlCoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsFlCoreSegment extends AbstractBase64Segment { public UsFlCoreSegment() { - super(); - } - - public UsFlCoreSegment(CharSequence encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsFlField.USFL_CORE_SEGMENT_FIELD_NAMES); - fields.put(UsFlField.VERSION, new EncodableFixedInteger(6, UsFl.VERSION)); - fields.put(UsFlField.PROCESSING_NOTICE, + super(UsFlField.USFL_CORE_SEGMENT_FIELD_NAMES); + initialize(UsFlField.VERSION, new EncodableFixedInteger(6, UsFl.VERSION)); + initialize(UsFlField.PROCESSING_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsFlField.SALE_OPT_OUT_NOTICE, + initialize(UsFlField.SALE_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsFlField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + initialize(UsFlField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsFlField.SALE_OPT_OUT, + initialize(UsFlField.SALE_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsFlField.TARGETED_ADVERTISING_OPT_OUT, + initialize(UsFlField.TARGETED_ADVERTISING_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsFlField.SENSITIVE_DATA_PROCESSING, - new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0)) + initialize(UsFlField.SENSITIVE_DATA_PROCESSING, + new EncodableFixedIntegerList(2, 8) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsFlField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0)) + initialize(UsFlField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, 3) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsFlField.ADDITIONAL_DATA_PROCESSING_CONSENT, + initialize(UsFlField.ADDITIONAL_DATA_PROCESSING_CONSENT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsFlField.MSPA_COVERED_TRANSACTION, + initialize(UsFlField.MSPA_COVERED_TRANSACTION, new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsFlField.MSPA_OPT_OUT_OPTION_MODE, + initialize(UsFlField.MSPA_OPT_OUT_OPTION_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsFlField.MSPA_SERVICE_PROVIDER_MODE, + initialize(UsFlField.MSPA_SERVICE_PROVIDER_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if (encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsFlCoreSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsIaCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsIaCoreSegment.java index 530ccd13..2e39d723 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsIaCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsIaCoreSegment.java @@ -1,79 +1,38 @@ package com.iab.gpp.encoder.segment; -import java.util.Arrays; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsIaField; import com.iab.gpp.encoder.section.UsIa; -public final class UsIaCoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsIaCoreSegment extends AbstractBase64Segment { public UsIaCoreSegment() { - super(); - } - - public UsIaCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsIaField.USIA_CORE_SEGMENT_FIELD_NAMES); - fields.put(UsIaField.VERSION, new EncodableFixedInteger(6, UsIa.VERSION)); - fields.put(UsIaField.PROCESSING_NOTICE, + super(UsIaField.USIA_CORE_SEGMENT_FIELD_NAMES); + initialize(UsIaField.VERSION, new EncodableFixedInteger(6, UsIa.VERSION)); + initialize(UsIaField.PROCESSING_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsIaField.SALE_OPT_OUT_NOTICE, + initialize(UsIaField.SALE_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + initialize(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsIaField.SENSITIVE_DATA_OPT_OUT_NOTICE, + initialize(UsIaField.SENSITIVE_DATA_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsIaField.SALE_OPT_OUT, + initialize(UsIaField.SALE_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsIaField.TARGETED_ADVERTISING_OPT_OUT, + initialize(UsIaField.TARGETED_ADVERTISING_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsIaField.SENSITIVE_DATA_PROCESSING, - new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0)) + initialize(UsIaField.SENSITIVE_DATA_PROCESSING, + new EncodableFixedIntegerList(2, 8) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsIaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + initialize(UsIaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsIaField.MSPA_COVERED_TRANSACTION, + initialize(UsIaField.MSPA_COVERED_TRANSACTION, new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsIaField.MSPA_OPT_OUT_OPTION_MODE, + initialize(UsIaField.MSPA_OPT_OUT_OPTION_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsIaField.MSPA_SERVICE_PROVIDER_MODE, + initialize(UsIaField.MSPA_SERVICE_PROVIDER_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if (encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsIaCoreSegment '" + encodedString + "'", e); - } } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsIaGpcSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsIaGpcSegment.java index 02a9eb1e..99588b5d 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsIaGpcSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsIaGpcSegment.java @@ -1,56 +1,17 @@ package com.iab.gpp.encoder.segment; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableBoolean; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.UnencodableBoolean; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsIaField; -public final class UsIaGpcSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsIaGpcSegment extends AbstractBase64Segment { public UsIaGpcSegment() { - super(); - } - - public UsIaGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsIaField.USIA_GPC_SEGMENT_FIELD_NAMES); - fields.put(UsIaField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsIaField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); - fields.put(UsIaField.GPC, new EncodableBoolean(false)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); + super(UsIaField.USIA_GPC_SEGMENT_FIELD_NAMES); + initialize(UsIaField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); + initialize(UsIaField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); + initialize(UsIaField.GPC, new EncodableBoolean(false)); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsIaGpcSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMtCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMtCoreSegment.java index 49d8813b..1a9c8099 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMtCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMtCoreSegment.java @@ -1,79 +1,38 @@ package com.iab.gpp.encoder.segment; -import java.util.Arrays; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsMtField; import com.iab.gpp.encoder.section.UsMt; -public final class UsMtCoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsMtCoreSegment extends AbstractBase64Segment { public UsMtCoreSegment() { - super(); - } - - public UsMtCoreSegment(CharSequence encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsMtField.USMT_CORE_SEGMENT_FIELD_NAMES); - fields.put(UsMtField.VERSION, new EncodableFixedInteger(6, UsMt.VERSION)); - fields.put(UsMtField.SHARING_NOTICE, + super(UsMtField.USMT_CORE_SEGMENT_FIELD_NAMES); + initialize(UsMtField.VERSION, new EncodableFixedInteger(6, UsMt.VERSION)); + initialize(UsMtField.SHARING_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsMtField.SALE_OPT_OUT_NOTICE, + initialize(UsMtField.SALE_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsMtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + initialize(UsMtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsMtField.SALE_OPT_OUT, + initialize(UsMtField.SALE_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsMtField.TARGETED_ADVERTISING_OPT_OUT, + initialize(UsMtField.TARGETED_ADVERTISING_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsMtField.SENSITIVE_DATA_PROCESSING, - new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0)) + initialize(UsMtField.SENSITIVE_DATA_PROCESSING, + new EncodableFixedIntegerList(2, 8) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsMtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0)) + initialize(UsMtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, 3) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsMtField.ADDITIONAL_DATA_PROCESSING_CONSENT, + initialize(UsMtField.ADDITIONAL_DATA_PROCESSING_CONSENT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsMtField.MSPA_COVERED_TRANSACTION, + initialize(UsMtField.MSPA_COVERED_TRANSACTION, new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsMtField.MSPA_OPT_OUT_OPTION_MODE, + initialize(UsMtField.MSPA_OPT_OUT_OPTION_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsMtField.MSPA_SERVICE_PROVIDER_MODE, + initialize(UsMtField.MSPA_SERVICE_PROVIDER_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if (encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsMtCoreSegment '" + encodedString + "'", e); - } } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMtGpcSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMtGpcSegment.java index 60c2e3b9..7caa3f4a 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMtGpcSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMtGpcSegment.java @@ -1,56 +1,17 @@ package com.iab.gpp.encoder.segment; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableBoolean; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.UnencodableBoolean; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsMtField; -public final class UsMtGpcSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsMtGpcSegment extends AbstractBase64Segment { public UsMtGpcSegment() { - super(); - } - - public UsMtGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsMtField.USMT_GPC_SEGMENT_FIELD_NAMES); - fields.put(UsMtField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsMtField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); - fields.put(UsMtField.GPC, new EncodableBoolean(false)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); + super(UsMtField.USMT_GPC_SEGMENT_FIELD_NAMES); + initialize(UsMtField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); + initialize(UsMtField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); + initialize(UsMtField.GPC, new EncodableBoolean(false)); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsMtGpcSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNatCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNatCoreSegment.java index 5257d91e..f2ee5ad3 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNatCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNatCoreSegment.java @@ -1,101 +1,67 @@ package com.iab.gpp.encoder.segment; -import java.util.Arrays; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsNatField; import com.iab.gpp.encoder.section.UsNat; -public final class UsNatCoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsNatCoreSegment extends AbstractBase64Segment { public UsNatCoreSegment() { - super(); - } - - public UsNatCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsNatField.USNAT_CORE_SEGMENT_FIELD_NAMES); - fields.put(UsNatField.VERSION, new EncodableFixedInteger(6, UsNat.VERSION)); - fields.put(UsNatField.SHARING_NOTICE, + super(UsNatField.USNAT_CORE_SEGMENT_FIELD_NAMES); + initialize(UsNatField.VERSION, new EncodableFixedInteger(6, UsNat.VERSION)); + initialize(UsNatField.SHARING_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.SALE_OPT_OUT_NOTICE, + initialize(UsNatField.SALE_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.SHARING_OPT_OUT_NOTICE, + initialize(UsNatField.SHARING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + initialize(UsNatField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE, + initialize(UsNatField.SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.SENSITIVE_DATA_LIMIT_USE_NOTICE, + initialize(UsNatField.SENSITIVE_DATA_LIMIT_USE_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.SALE_OPT_OUT, + initialize(UsNatField.SALE_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.SHARING_OPT_OUT, + initialize(UsNatField.SHARING_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.TARGETED_ADVERTISING_OPT_OUT, + initialize(UsNatField.TARGETED_ADVERTISING_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.SENSITIVE_DATA_PROCESSING, - new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) + initialize(UsNatField.SENSITIVE_DATA_PROCESSING, + new EncodableFixedIntegerList(2, 16) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0)) + initialize(UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, 3) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsNatField.PERSONAL_DATA_CONSENTS, + initialize(UsNatField.PERSONAL_DATA_CONSENTS, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.MSPA_COVERED_TRANSACTION, + initialize(UsNatField.MSPA_COVERED_TRANSACTION, new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.MSPA_OPT_OUT_OPTION_MODE, + initialize(UsNatField.MSPA_OPT_OUT_OPTION_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.MSPA_SERVICE_PROVIDER_MODE, + initialize(UsNatField.MSPA_SERVICE_PROVIDER_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - return fields; } @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if (encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - - // Necessary to maintain backwards compatibility when sensitive data processing changed from a - // length of 12 to 16 and known child sensitive data consents changed from a length of 2 to 3 in the - // DE, IA, NE, NH, NJ, TN release - if (bitString.length() == 66) { - BitStringBuilder builder = new BitStringBuilder(); - builder.append(bitString.substring(0, 48)); - builder.append(BitString.of("00000000")); - builder.append(bitString.substring(48, 52)); - builder.append(BitString.of("00")); - builder.append(bitString.substring(52, 62)); - bitString = builder.build(); - } - - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsNatCoreSegment '" + encodedString + "'", e); + protected BitString decodeBitString(CharSequence encodedString) { + BitString bitString = super.decodeBitString(encodedString); + // Necessary to maintain backwards compatibility when sensitive data processing changed from a + // length of 12 to 16 and known child sensitive data consents changed from a length of 2 to 3 in the + // DE, IA, NE, NH, NJ, TN release + if (bitString.length() == 66) { + BitStringBuilder builder = new BitStringBuilder(); + + builder.append(bitString, 0, 48); + builder.extend(8); + builder.append(bitString, 48, 52); + builder.extend(2); + builder.append(bitString, 52, 62); + bitString = builder.build(); } + return bitString; } - + } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNatGpcSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNatGpcSegment.java index 5d0771a3..f7ab9ba6 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNatGpcSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNatGpcSegment.java @@ -1,56 +1,17 @@ package com.iab.gpp.encoder.segment; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableBoolean; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.UnencodableBoolean; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsNatField; -public final class UsNatGpcSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsNatGpcSegment extends AbstractBase64Segment { public UsNatGpcSegment() { - super(); - } - - public UsNatGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsNatField.USNAT_GPC_SEGMENT_FIELD_NAMES); - fields.put(UsNatField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsNatField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); - fields.put(UsNatField.GPC, new EncodableBoolean(false)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); + super(UsNatField.USNAT_GPC_SEGMENT_FIELD_NAMES); + initialize(UsNatField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); + initialize(UsNatField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); + initialize(UsNatField.GPC, new EncodableBoolean(false)); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsNatGpcSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNeCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNeCoreSegment.java index fb7b77a1..a1eda150 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNeCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNeCoreSegment.java @@ -1,79 +1,38 @@ package com.iab.gpp.encoder.segment; -import java.util.Arrays; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsNeField; import com.iab.gpp.encoder.section.UsNe; -public final class UsNeCoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsNeCoreSegment extends AbstractBase64Segment { public UsNeCoreSegment() { - super(); - } - - public UsNeCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsNeField.USNE_CORE_SEGMENT_FIELD_NAMES); - fields.put(UsNeField.VERSION, new EncodableFixedInteger(6, UsNe.VERSION)); - fields.put(UsNeField.PROCESSING_NOTICE, + super(UsNeField.USNE_CORE_SEGMENT_FIELD_NAMES); + initialize(UsNeField.VERSION, new EncodableFixedInteger(6, UsNe.VERSION)); + initialize(UsNeField.PROCESSING_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNeField.SALE_OPT_OUT_NOTICE, + initialize(UsNeField.SALE_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + initialize(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNeField.SALE_OPT_OUT, + initialize(UsNeField.SALE_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNeField.TARGETED_ADVERTISING_OPT_OUT, + initialize(UsNeField.TARGETED_ADVERTISING_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNeField.SENSITIVE_DATA_PROCESSING, - new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0)) + initialize(UsNeField.SENSITIVE_DATA_PROCESSING, + new EncodableFixedIntegerList(2, 8) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsNeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + initialize(UsNeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNeField.ADDITIONAL_DATA_PROCESSING_CONSENT, + initialize(UsNeField.ADDITIONAL_DATA_PROCESSING_CONSENT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNeField.MSPA_COVERED_TRANSACTION, + initialize(UsNeField.MSPA_COVERED_TRANSACTION, new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNeField.MSPA_OPT_OUT_OPTION_MODE, + initialize(UsNeField.MSPA_OPT_OUT_OPTION_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNeField.MSPA_SERVICE_PROVIDER_MODE, + initialize(UsNeField.MSPA_SERVICE_PROVIDER_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if (encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsNeCoreSegment '" + encodedString + "'", e); - } } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNeGpcSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNeGpcSegment.java index 16b3e688..01456505 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNeGpcSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNeGpcSegment.java @@ -1,56 +1,17 @@ package com.iab.gpp.encoder.segment; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableBoolean; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.UnencodableBoolean; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsNeField; -public final class UsNeGpcSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsNeGpcSegment extends AbstractBase64Segment { public UsNeGpcSegment() { - super(); - } - - public UsNeGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsNeField.USNE_GPC_SEGMENT_FIELD_NAMES); - fields.put(UsNeField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsNeField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); - fields.put(UsNeField.GPC, new EncodableBoolean(false)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); + super(UsNeField.USNE_GPC_SEGMENT_FIELD_NAMES); + initialize(UsNeField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); + initialize(UsNeField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); + initialize(UsNeField.GPC, new EncodableBoolean(false)); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsNeGpcSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNhCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNhCoreSegment.java index 789f86b5..1376ec01 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNhCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNhCoreSegment.java @@ -1,79 +1,38 @@ package com.iab.gpp.encoder.segment; -import java.util.Arrays; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsNhField; import com.iab.gpp.encoder.section.UsNh; -public final class UsNhCoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsNhCoreSegment extends AbstractBase64Segment { public UsNhCoreSegment() { - super(); - } - - public UsNhCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsNhField.USNH_CORE_SEGMENT_FIELD_NAMES); - fields.put(UsNhField.VERSION, new EncodableFixedInteger(6, UsNh.VERSION)); - fields.put(UsNhField.PROCESSING_NOTICE, + super(UsNhField.USNH_CORE_SEGMENT_FIELD_NAMES); + initialize(UsNhField.VERSION, new EncodableFixedInteger(6, UsNh.VERSION)); + initialize(UsNhField.PROCESSING_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNhField.SALE_OPT_OUT_NOTICE, + initialize(UsNhField.SALE_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + initialize(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNhField.SALE_OPT_OUT, + initialize(UsNhField.SALE_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNhField.TARGETED_ADVERTISING_OPT_OUT, + initialize(UsNhField.TARGETED_ADVERTISING_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNhField.SENSITIVE_DATA_PROCESSING, - new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0)) + initialize(UsNhField.SENSITIVE_DATA_PROCESSING, + new EncodableFixedIntegerList(2, 8) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsNhField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0)) + initialize(UsNhField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, 3) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsNhField.ADDITIONAL_DATA_PROCESSING_CONSENT, + initialize(UsNhField.ADDITIONAL_DATA_PROCESSING_CONSENT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNhField.MSPA_COVERED_TRANSACTION, + initialize(UsNhField.MSPA_COVERED_TRANSACTION, new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNhField.MSPA_OPT_OUT_OPTION_MODE, + initialize(UsNhField.MSPA_OPT_OUT_OPTION_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNhField.MSPA_SERVICE_PROVIDER_MODE, + initialize(UsNhField.MSPA_SERVICE_PROVIDER_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if (encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsNhCoreSegment '" + encodedString + "'", e); - } } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNhGpcSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNhGpcSegment.java index 1343c79e..9abeebb8 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNhGpcSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNhGpcSegment.java @@ -1,56 +1,17 @@ package com.iab.gpp.encoder.segment; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableBoolean; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.UnencodableBoolean; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsNhField; -public final class UsNhGpcSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsNhGpcSegment extends AbstractBase64Segment { public UsNhGpcSegment() { - super(); - } - - public UsNhGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsNhField.USNH_GPC_SEGMENT_FIELD_NAMES); - fields.put(UsNhField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsNhField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); - fields.put(UsNhField.GPC, new EncodableBoolean(false)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); + super(UsNhField.USNH_GPC_SEGMENT_FIELD_NAMES); + initialize(UsNhField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); + initialize(UsNhField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); + initialize(UsNhField.GPC, new EncodableBoolean(false)); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsNhGpcSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNjCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNjCoreSegment.java index 99f94205..f8809920 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNjCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNjCoreSegment.java @@ -1,79 +1,38 @@ package com.iab.gpp.encoder.segment; -import java.util.Arrays; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsNjField; import com.iab.gpp.encoder.section.UsNj; -public final class UsNjCoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsNjCoreSegment extends AbstractBase64Segment { public UsNjCoreSegment() { - super(); - } - - public UsNjCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsNjField.USNJ_CORE_SEGMENT_FIELD_NAMES); - fields.put(UsNjField.VERSION, new EncodableFixedInteger(6, UsNj.VERSION)); - fields.put(UsNjField.PROCESSING_NOTICE, + super(UsNjField.USNJ_CORE_SEGMENT_FIELD_NAMES); + initialize(UsNjField.VERSION, new EncodableFixedInteger(6, UsNj.VERSION)); + initialize(UsNjField.PROCESSING_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNjField.SALE_OPT_OUT_NOTICE, + initialize(UsNjField.SALE_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + initialize(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNjField.SALE_OPT_OUT, + initialize(UsNjField.SALE_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNjField.TARGETED_ADVERTISING_OPT_OUT, + initialize(UsNjField.TARGETED_ADVERTISING_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNjField.SENSITIVE_DATA_PROCESSING, - new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) + initialize(UsNjField.SENSITIVE_DATA_PROCESSING, + new EncodableFixedIntegerList(2, 10) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsNjField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0)) + initialize(UsNjField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, 5) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsNjField.ADDITIONAL_DATA_PROCESSING_CONSENT, + initialize(UsNjField.ADDITIONAL_DATA_PROCESSING_CONSENT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNjField.MSPA_COVERED_TRANSACTION, + initialize(UsNjField.MSPA_COVERED_TRANSACTION, new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNjField.MSPA_OPT_OUT_OPTION_MODE, + initialize(UsNjField.MSPA_OPT_OUT_OPTION_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNjField.MSPA_SERVICE_PROVIDER_MODE, + initialize(UsNjField.MSPA_SERVICE_PROVIDER_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if (encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsNjCoreSegment '" + encodedString + "'", e); - } } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNjGpcSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNjGpcSegment.java index e5b14d7e..c651e912 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNjGpcSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNjGpcSegment.java @@ -1,56 +1,17 @@ package com.iab.gpp.encoder.segment; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableBoolean; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.UnencodableBoolean; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsNjField; -public final class UsNjGpcSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsNjGpcSegment extends AbstractBase64Segment { public UsNjGpcSegment() { - super(); - } - - public UsNjGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsNjField.USNJ_GPC_SEGMENT_FIELD_NAMES); - fields.put(UsNjField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsNjField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); - fields.put(UsNjField.GPC, new EncodableBoolean(false)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); + super(UsNjField.USNJ_GPC_SEGMENT_FIELD_NAMES); + initialize(UsNjField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); + initialize(UsNjField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); + initialize(UsNjField.GPC, new EncodableBoolean(false)); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsNjGpcSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsOrCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsOrCoreSegment.java index f9ef489d..c06f095d 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsOrCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsOrCoreSegment.java @@ -1,79 +1,38 @@ package com.iab.gpp.encoder.segment; -import java.util.Arrays; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsOrField; import com.iab.gpp.encoder.section.UsOr; -public final class UsOrCoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsOrCoreSegment extends AbstractBase64Segment { public UsOrCoreSegment() { - super(); - } - - public UsOrCoreSegment(CharSequence encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsOrField.USOR_CORE_SEGMENT_FIELD_NAMES); - fields.put(UsOrField.VERSION, new EncodableFixedInteger(6, UsOr.VERSION)); - fields.put(UsOrField.PROCESSING_NOTICE, + super(UsOrField.USOR_CORE_SEGMENT_FIELD_NAMES); + initialize(UsOrField.VERSION, new EncodableFixedInteger(6, UsOr.VERSION)); + initialize(UsOrField.PROCESSING_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsOrField.SALE_OPT_OUT_NOTICE, + initialize(UsOrField.SALE_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsOrField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + initialize(UsOrField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsOrField.SALE_OPT_OUT, + initialize(UsOrField.SALE_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsOrField.TARGETED_ADVERTISING_OPT_OUT, + initialize(UsOrField.TARGETED_ADVERTISING_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsOrField.SENSITIVE_DATA_PROCESSING, - new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) + initialize(UsOrField.SENSITIVE_DATA_PROCESSING, + new EncodableFixedIntegerList(2, 11) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsOrField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0)) + initialize(UsOrField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, 3) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsOrField.ADDITIONAL_DATA_PROCESSING_CONSENT, + initialize(UsOrField.ADDITIONAL_DATA_PROCESSING_CONSENT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsOrField.MSPA_COVERED_TRANSACTION, + initialize(UsOrField.MSPA_COVERED_TRANSACTION, new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsOrField.MSPA_OPT_OUT_OPTION_MODE, + initialize(UsOrField.MSPA_OPT_OUT_OPTION_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsOrField.MSPA_SERVICE_PROVIDER_MODE, + initialize(UsOrField.MSPA_SERVICE_PROVIDER_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if (encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsOrCoreSegment '" + encodedString + "'", e); - } } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsOrGpcSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsOrGpcSegment.java index 087a6d3d..aaacbc33 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsOrGpcSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsOrGpcSegment.java @@ -1,56 +1,17 @@ package com.iab.gpp.encoder.segment; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableBoolean; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.UnencodableBoolean; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsOrField; -public final class UsOrGpcSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsOrGpcSegment extends AbstractBase64Segment { public UsOrGpcSegment() { - super(); - } - - public UsOrGpcSegment(CharSequence encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsOrField.USOR_GPC_SEGMENT_FIELD_NAMES); - fields.put(UsOrField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsOrField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); - fields.put(UsOrField.GPC, new EncodableBoolean(false)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); + super(UsOrField.USOR_GPC_SEGMENT_FIELD_NAMES); + initialize(UsOrField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); + initialize(UsOrField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); + initialize(UsOrField.GPC, new EncodableBoolean(false)); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsOrGpcSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTnCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTnCoreSegment.java index b6bd3409..b4749be5 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTnCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTnCoreSegment.java @@ -1,79 +1,38 @@ package com.iab.gpp.encoder.segment; -import java.util.Arrays; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsTnField; import com.iab.gpp.encoder.section.UsTn; -public final class UsTnCoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsTnCoreSegment extends AbstractBase64Segment { public UsTnCoreSegment() { - super(); - } - - public UsTnCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsTnField.USTN_CORE_SEGMENT_FIELD_NAMES); - fields.put(UsTnField.VERSION, new EncodableFixedInteger(6, UsTn.VERSION)); - fields.put(UsTnField.PROCESSING_NOTICE, + super(UsTnField.USTN_CORE_SEGMENT_FIELD_NAMES); + initialize(UsTnField.VERSION, new EncodableFixedInteger(6, UsTn.VERSION)); + initialize(UsTnField.PROCESSING_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTnField.SALE_OPT_OUT_NOTICE, + initialize(UsTnField.SALE_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + initialize(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTnField.SALE_OPT_OUT, + initialize(UsTnField.SALE_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTnField.TARGETED_ADVERTISING_OPT_OUT, + initialize(UsTnField.TARGETED_ADVERTISING_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTnField.SENSITIVE_DATA_PROCESSING, - new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0)) + initialize(UsTnField.SENSITIVE_DATA_PROCESSING, + new EncodableFixedIntegerList(2, 8) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsTnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + initialize(UsTnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTnField.ADDITIONAL_DATA_PROCESSING_CONSENT, + initialize(UsTnField.ADDITIONAL_DATA_PROCESSING_CONSENT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTnField.MSPA_COVERED_TRANSACTION, + initialize(UsTnField.MSPA_COVERED_TRANSACTION, new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTnField.MSPA_OPT_OUT_OPTION_MODE, + initialize(UsTnField.MSPA_OPT_OUT_OPTION_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTnField.MSPA_SERVICE_PROVIDER_MODE, + initialize(UsTnField.MSPA_SERVICE_PROVIDER_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if (encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsTnCoreSegment '" + encodedString + "'", e); - } } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTnGpcSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTnGpcSegment.java index 12c5aab3..26c63cbe 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTnGpcSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTnGpcSegment.java @@ -1,56 +1,17 @@ package com.iab.gpp.encoder.segment; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableBoolean; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.UnencodableBoolean; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsTnField; -public final class UsTnGpcSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsTnGpcSegment extends AbstractBase64Segment { public UsTnGpcSegment() { - super(); - } - - public UsTnGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsTnField.USTN_GPC_SEGMENT_FIELD_NAMES); - fields.put(UsTnField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsTnField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); - fields.put(UsTnField.GPC, new EncodableBoolean(false)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); + super(UsTnField.USTN_GPC_SEGMENT_FIELD_NAMES); + initialize(UsTnField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); + initialize(UsTnField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); + initialize(UsTnField.GPC, new EncodableBoolean(false)); } - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsTnGpcSegment '" + encodedString + "'", e); - } - } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTxCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTxCoreSegment.java index 2b809263..93cb427d 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTxCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTxCoreSegment.java @@ -1,79 +1,38 @@ package com.iab.gpp.encoder.segment; -import java.util.Arrays; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsTxField; import com.iab.gpp.encoder.section.UsTx; -public final class UsTxCoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsTxCoreSegment extends AbstractBase64Segment { public UsTxCoreSegment() { - super(); - } - - public UsTxCoreSegment(CharSequence encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsTxField.USTX_CORE_SEGMENT_FIELD_NAMES); - fields.put(UsTxField.VERSION, new EncodableFixedInteger(6, UsTx.VERSION)); - fields.put(UsTxField.PROCESSING_NOTICE, + super(UsTxField.USTX_CORE_SEGMENT_FIELD_NAMES); + initialize(UsTxField.VERSION, new EncodableFixedInteger(6, UsTx.VERSION)); + initialize(UsTxField.PROCESSING_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTxField.SALE_OPT_OUT_NOTICE, + initialize(UsTxField.SALE_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTxField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + initialize(UsTxField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTxField.SALE_OPT_OUT, + initialize(UsTxField.SALE_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTxField.TARGETED_ADVERTISING_OPT_OUT, + initialize(UsTxField.TARGETED_ADVERTISING_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTxField.SENSITIVE_DATA_PROCESSING, - new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0)) + initialize(UsTxField.SENSITIVE_DATA_PROCESSING, + new EncodableFixedIntegerList(2, 8) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsTxField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + initialize(UsTxField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTxField.ADDITIONAL_DATA_PROCESSING_CONSENT, + initialize(UsTxField.ADDITIONAL_DATA_PROCESSING_CONSENT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTxField.MSPA_COVERED_TRANSACTION, + initialize(UsTxField.MSPA_COVERED_TRANSACTION, new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTxField.MSPA_OPT_OUT_OPTION_MODE, + initialize(UsTxField.MSPA_OPT_OUT_OPTION_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTxField.MSPA_SERVICE_PROVIDER_MODE, + initialize(UsTxField.MSPA_SERVICE_PROVIDER_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if (encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsTxCoreSegment '" + encodedString + "'", e); - } } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTxGpcSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTxGpcSegment.java index 33626df8..bdeff998 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTxGpcSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTxGpcSegment.java @@ -1,56 +1,16 @@ package com.iab.gpp.encoder.segment; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableBoolean; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.UnencodableBoolean; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsTxField; -public final class UsTxGpcSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsTxGpcSegment extends AbstractBase64Segment { public UsTxGpcSegment() { - super(); - } - - public UsTxGpcSegment(CharSequence encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsTxField.USTX_GPC_SEGMENT_FIELD_NAMES); - fields.put(UsTxField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsTxField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); - fields.put(UsTxField.GPC, new EncodableBoolean(false)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if(encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsTxGpcSegment '" + encodedString + "'", e); - } + super(UsTxField.USTX_GPC_SEGMENT_FIELD_NAMES); + initialize(UsTxField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); + initialize(UsTxField.GPC_SEGMENT_INCLUDED, new UnencodableBoolean(true)); + initialize(UsTxField.GPC, new EncodableBoolean(false)); } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsUtCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsUtCoreSegment.java index 368cfca5..7200ca99 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsUtCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsUtCoreSegment.java @@ -1,79 +1,38 @@ package com.iab.gpp.encoder.segment; -import java.util.Arrays; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsUtField; import com.iab.gpp.encoder.section.UsUt; -public final class UsUtCoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsUtCoreSegment extends AbstractBase64Segment { public UsUtCoreSegment() { - super(); - } - - public UsUtCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsUtField.USUT_CORE_SEGMENT_FIELD_NAMES); - fields.put(UsUtField.VERSION, new EncodableFixedInteger(6, UsUt.VERSION)); - fields.put(UsUtField.SHARING_NOTICE, + super(UsUtField.USUT_CORE_SEGMENT_FIELD_NAMES); + initialize(UsUtField.VERSION, new EncodableFixedInteger(6, UsUt.VERSION)); + initialize(UsUtField.SHARING_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsUtField.SALE_OPT_OUT_NOTICE, + initialize(UsUtField.SALE_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsUtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + initialize(UsUtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsUtField.SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE, + initialize(UsUtField.SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsUtField.SALE_OPT_OUT, + initialize(UsUtField.SALE_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsUtField.TARGETED_ADVERTISING_OPT_OUT, + initialize(UsUtField.TARGETED_ADVERTISING_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsUtField.SENSITIVE_DATA_PROCESSING, - new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0)) + initialize(UsUtField.SENSITIVE_DATA_PROCESSING, + new EncodableFixedIntegerList(2, 8) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsUtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + initialize(UsUtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsUtField.MSPA_COVERED_TRANSACTION, + initialize(UsUtField.MSPA_COVERED_TRANSACTION, new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsUtField.MSPA_OPT_OUT_OPTION_MODE, + initialize(UsUtField.MSPA_OPT_OUT_OPTION_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsUtField.MSPA_SERVICE_PROVIDER_MODE, + initialize(UsUtField.MSPA_SERVICE_PROVIDER_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if (encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsUtCoreSegment '" + encodedString + "'", e); - } } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsVaCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsVaCoreSegment.java index b374520b..57cc14ab 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsVaCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsVaCoreSegment.java @@ -1,77 +1,36 @@ package com.iab.gpp.encoder.segment; -import java.util.Arrays; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.bitstring.BitStringEncoder; import com.iab.gpp.encoder.datatype.EncodableFixedInteger; import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; import com.iab.gpp.encoder.field.UsVaField; import com.iab.gpp.encoder.section.UsVa; -public final class UsVaCoreSegment extends AbstractLazilyEncodableSegment { - - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); +public final class UsVaCoreSegment extends AbstractBase64Segment { public UsVaCoreSegment() { - super(); - } - - public UsVaCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(UsVaField.USVA_CORE_SEGMENT_FIELD_NAMES); - fields.put(UsVaField.VERSION, new EncodableFixedInteger(6, UsVa.VERSION)); - fields.put(UsVaField.SHARING_NOTICE, + super(UsVaField.USVA_CORE_SEGMENT_FIELD_NAMES); + initialize(UsVaField.VERSION, new EncodableFixedInteger(6, UsVa.VERSION)); + initialize(UsVaField.SHARING_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsVaField.SALE_OPT_OUT_NOTICE, + initialize(UsVaField.SALE_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsVaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + initialize(UsVaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsVaField.SALE_OPT_OUT, + initialize(UsVaField.SALE_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsVaField.TARGETED_ADVERTISING_OPT_OUT, + initialize(UsVaField.TARGETED_ADVERTISING_OPT_OUT, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsVaField.SENSITIVE_DATA_PROCESSING, - new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0)) + initialize(UsVaField.SENSITIVE_DATA_PROCESSING, + new EncodableFixedIntegerList(2, 8) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsVaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + initialize(UsVaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsVaField.MSPA_COVERED_TRANSACTION, + initialize(UsVaField.MSPA_COVERED_TRANSACTION, new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsVaField.MSPA_OPT_OUT_OPTION_MODE, + initialize(UsVaField.MSPA_OPT_OUT_OPTION_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsVaField.MSPA_SERVICE_PROVIDER_MODE, + initialize(UsVaField.MSPA_SERVICE_PROVIDER_MODE, new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - return fields; - } - - @Override - protected StringBuilder encodeSegment(EncodableBitStringFields fields) { - BitStringBuilder bitString = bitStringEncoder.encode(fields); - return base64UrlEncoder.encode(bitString); - } - - @Override - protected void decodeSegment(CharSequence encodedString, EncodableBitStringFields fields) { - if (encodedString == null || encodedString.length() == 0) { - this.fields.reset(fields); - } - try { - BitString bitString = base64UrlEncoder.decode(encodedString); - bitStringEncoder.decode(bitString, fields); - } catch (Exception e) { - throw new DecodingException("Unable to decode UsVaCoreSegment '" + encodedString + "'", e); - } } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UspV1CoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UspV1CoreSegment.java index 0dce8a33..2b33f181 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UspV1CoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UspV1CoreSegment.java @@ -1,54 +1,43 @@ package com.iab.gpp.encoder.segment; +import com.iab.gpp.encoder.datatype.DataType; import com.iab.gpp.encoder.datatype.UnencodableCharacter; import com.iab.gpp.encoder.datatype.UnencodableInteger; import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.GenericFields; import com.iab.gpp.encoder.field.UspV1Field; import com.iab.gpp.encoder.section.UspV1; -public final class UspV1CoreSegment extends AbstractLazilyEncodableSegment { +public final class UspV1CoreSegment extends AbstractLazilyEncodableSegment> { public UspV1CoreSegment() { - super(); - } - - public UspV1CoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected GenericFields initializeFields() { - GenericFields fields = new GenericFields(UspV1Field.USPV1_CORE_SEGMENT_FIELD_NAMES); - fields.put(UspV1Field.VERSION, new UnencodableInteger(UspV1.VERSION)); - fields.put(UspV1Field.NOTICE, new UnencodableCharacter('-', (v -> v == 'Y' || v == 'N' || v == '-'))); - fields.put(UspV1Field.OPT_OUT_SALE, new UnencodableCharacter('-', (v -> v == 'Y' || v == 'N' || v == '-'))); - fields.put(UspV1Field.LSPA_COVERED, new UnencodableCharacter('-', (v -> v == 'Y' || v == 'N' || v == '-'))); - return fields; + super(UspV1Field.USPV1_CORE_SEGMENT_FIELD_NAMES); + initialize(UspV1Field.VERSION, new UnencodableInteger(UspV1.VERSION)); + initialize(UspV1Field.NOTICE, new UnencodableCharacter('-', (v -> v == 'Y' || v == 'N' || v == '-'))); + initialize(UspV1Field.OPT_OUT_SALE, new UnencodableCharacter('-', (v -> v == 'Y' || v == 'N' || v == '-'))); + initialize(UspV1Field.LSPA_COVERED, new UnencodableCharacter('-', (v -> v == 'Y' || v == 'N' || v == '-'))); } @Override - protected StringBuilder encodeSegment(GenericFields fields) { + protected CharSequence doEncode() { StringBuilder str = new StringBuilder(); - str.append(fields.get(UspV1Field.VERSION).getValue()); - str.append(fields.get(UspV1Field.NOTICE).getValue()); - str.append(fields.get(UspV1Field.OPT_OUT_SALE).getValue()); - str.append(fields.get(UspV1Field.LSPA_COVERED).getValue()); + str.append(get(UspV1Field.VERSION).getValue()); + str.append(get(UspV1Field.NOTICE).getValue()); + str.append(get(UspV1Field.OPT_OUT_SALE).getValue()); + str.append(get(UspV1Field.LSPA_COVERED).getValue()); return str; } @Override - protected void decodeSegment(CharSequence encodedString, GenericFields fields) { + protected void doDecode(CharSequence encodedString) { if (encodedString == null || encodedString.length() != 4) { throw new DecodingException("Invalid uspv1 string: '" + encodedString + "'"); } try { - fields.get(UspV1Field.VERSION).setValue((int)(encodedString.charAt(0) - '0')); - fields.get(UspV1Field.NOTICE).setValue(encodedString.charAt(1)); - fields.get(UspV1Field.OPT_OUT_SALE).setValue(encodedString.charAt(2)); - fields.get(UspV1Field.LSPA_COVERED).setValue(encodedString.charAt(3)); + get(UspV1Field.VERSION).setValue((int)(encodedString.charAt(0) - '0')); + get(UspV1Field.NOTICE).setValue(encodedString.charAt(1)); + get(UspV1Field.OPT_OUT_SALE).setValue(encodedString.charAt(2)); + get(UspV1Field.LSPA_COVERED).setValue(encodedString.charAt(3)); } catch (Exception e) { throw new DecodingException("Unable to decode UspV1CoreSegment '" + encodedString + "'", e); } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/GppModelTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/GppModelTest.java index 738ae8e1..71aa195c 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/GppModelTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/GppModelTest.java @@ -15,10 +15,16 @@ import com.iab.gpp.encoder.field.UsCaField; import com.iab.gpp.encoder.field.UsCoField; import com.iab.gpp.encoder.field.UsCtField; +import com.iab.gpp.encoder.field.UsDeField; import com.iab.gpp.encoder.field.UsFlField; +import com.iab.gpp.encoder.field.UsIaField; import com.iab.gpp.encoder.field.UsMtField; import com.iab.gpp.encoder.field.UsNatField; +import com.iab.gpp.encoder.field.UsNeField; +import com.iab.gpp.encoder.field.UsNhField; +import com.iab.gpp.encoder.field.UsNjField; import com.iab.gpp.encoder.field.UsOrField; +import com.iab.gpp.encoder.field.UsTnField; import com.iab.gpp.encoder.field.UsTxField; import com.iab.gpp.encoder.field.UsUtField; import com.iab.gpp.encoder.field.UsVaField; @@ -97,8 +103,8 @@ public void testEncodeDefaultAll() { Assertions.assertEquals(false, gppModel.hasSection(UsTn.NAME)); gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.VERSION, TcfEuV2.VERSION); - gppModel.setFieldValue(TcfEuV2.NAME, TcfCaV1Field.CREATED, utcDateTime); - gppModel.setFieldValue(TcfEuV2.NAME, TcfCaV1Field.LAST_UPDATED, utcDateTime); + gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.CREATED, utcDateTime); + gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.LAST_UPDATED, utcDateTime); gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.VERSION, TcfCaV1.VERSION); gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.CREATED, utcDateTime); gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.LAST_UPDATED, utcDateTime); @@ -113,12 +119,12 @@ public void testEncodeDefaultAll() { gppModel.setFieldValue(UsMt.NAME, UsMtField.VERSION, UsMt.VERSION); gppModel.setFieldValue(UsOr.NAME, UsOrField.VERSION, UsOr.VERSION); gppModel.setFieldValue(UsTx.NAME, UsTxField.VERSION, UsTx.VERSION); - gppModel.setFieldValue(UsDe.NAME, UsTxField.VERSION, UsTx.VERSION); - gppModel.setFieldValue(UsIa.NAME, UsTxField.VERSION, UsTx.VERSION); - gppModel.setFieldValue(UsNe.NAME, UsTxField.VERSION, UsTx.VERSION); - gppModel.setFieldValue(UsNh.NAME, UsTxField.VERSION, UsTx.VERSION); - gppModel.setFieldValue(UsNj.NAME, UsTxField.VERSION, UsTx.VERSION); - gppModel.setFieldValue(UsTn.NAME, UsTxField.VERSION, UsTx.VERSION); + gppModel.setFieldValue(UsDe.NAME, UsDeField.VERSION, UsDe.VERSION); + gppModel.setFieldValue(UsIa.NAME, UsIaField.VERSION, UsIa.VERSION); + gppModel.setFieldValue(UsNe.NAME, UsNeField.VERSION, UsNe.VERSION); + gppModel.setFieldValue(UsNh.NAME, UsNhField.VERSION, UsNh.VERSION); + gppModel.setFieldValue(UsNj.NAME, UsNjField.VERSION, UsNj.VERSION); + gppModel.setFieldValue(UsTn.NAME, UsTnField.VERSION, UsTn.VERSION); @@ -223,8 +229,8 @@ public void testEncodeTcfEuV2() { gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.USE_NON_STANDARD_STACKS, false); gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.PURPOSE_ONE_TREATMENT, false); gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.PUBLISHER_COUNTRY_CODE, "AA"); - gppModel.setFieldValue(TcfEuV2.NAME, TcfCaV1Field.CREATED, utcDateTime); - gppModel.setFieldValue(TcfEuV2.NAME, TcfCaV1Field.LAST_UPDATED, utcDateTime); + gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.CREATED, utcDateTime); + gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.LAST_UPDATED, utcDateTime); Assertions.assertEquals(Arrays.asList(2), gppModel.getSectionIds()); Assertions.assertEquals(false, gppModel.hasSection(UspV1.ID)); @@ -269,8 +275,8 @@ public void testEncodeUspV1AndTcfEuV2() { gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.USE_NON_STANDARD_STACKS, false); gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.PURPOSE_ONE_TREATMENT, false); gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.PUBLISHER_COUNTRY_CODE, "AA"); - gppModel.setFieldValue(TcfEuV2.NAME, TcfCaV1Field.CREATED, utcDateTime); - gppModel.setFieldValue(TcfEuV2.NAME, TcfCaV1Field.LAST_UPDATED, utcDateTime); + gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.CREATED, utcDateTime); + gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.LAST_UPDATED, utcDateTime); Assertions.assertEquals(Arrays.asList(2), gppModel.getSectionIds()); Assertions.assertEquals(false, gppModel.hasSection(UspV1.NAME)); @@ -319,8 +325,8 @@ public void testEncodeUspV1AndTcfEuV2AndTcfCaV1() { gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.USE_NON_STANDARD_STACKS, false); gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.PURPOSE_ONE_TREATMENT, false); gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.PUBLISHER_COUNTRY_CODE, "AA"); - gppModel.setFieldValue(TcfEuV2.NAME, TcfCaV1Field.CREATED, utcDateTime); - gppModel.setFieldValue(TcfEuV2.NAME, TcfCaV1Field.LAST_UPDATED, utcDateTime); + gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.CREATED, utcDateTime); + gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.LAST_UPDATED, utcDateTime); Assertions.assertEquals(Arrays.asList(2), gppModel.getSectionIds()); @@ -708,13 +714,13 @@ public void testDecode4() { @Test public void testDecode5() { GppModel gppModel = new GppModel("DBABLA~BVQqAAAAAgA.QA"); - gppModel.getFieldValue(UsNat.NAME, UspV1Field.VERSION); + gppModel.getFieldValue(UsNat.NAME, UsNatField.VERSION); } @Test public void testDecode6() { GppModel gppModel = new GppModel("DBABLA~BAAAAAAAAQA.QA"); - gppModel.getFieldValue(UsNat.NAME, UspV1Field.VERSION); + gppModel.getFieldValue(UsNat.NAME, UsNatField.VERSION); Assertions.assertEquals(Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), gppModel.getFieldValue(UsNat.NAME, UsNatField.SENSITIVE_DATA_PROCESSING)); Assertions.assertEquals(Arrays.asList(0, 0, 0), @@ -724,7 +730,7 @@ public void testDecode6() { @Test public void testDecode7() { GppModel gppModel = new GppModel("DBABLA~BAAAAAAAAABA.QA"); - gppModel.getFieldValue(UsNat.NAME, UspV1Field.VERSION); + gppModel.getFieldValue(UsNat.NAME, UsNatField.VERSION); Assertions.assertEquals(Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), gppModel.getFieldValue(UsNat.NAME, UsNatField.SENSITIVE_DATA_PROCESSING)); Assertions.assertEquals(Arrays.asList(0, 0, 0), @@ -734,7 +740,7 @@ public void testDecode7() { @Test public void testDecode8() { GppModel gppModel = new GppModel("DBABLA~BAAAAAABEQA.QA"); - gppModel.getFieldValue(UsNat.NAME, UspV1Field.VERSION); + gppModel.getFieldValue(UsNat.NAME, UsNatField.VERSION); Assertions.assertEquals(Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0), gppModel.getFieldValue(UsNat.NAME, UsNatField.SENSITIVE_DATA_PROCESSING)); Assertions.assertEquals(Arrays.asList(0, 1, 0), @@ -744,7 +750,7 @@ public void testDecode8() { @Test public void testDecode9() { GppModel gppModel = new GppModel("DBABLA~BAAAAAAAAQRA.QA"); - gppModel.getFieldValue(UsNat.NAME, UspV1Field.VERSION); + gppModel.getFieldValue(UsNat.NAME, UsNatField.VERSION); Assertions.assertEquals(Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1), gppModel.getFieldValue(UsNat.NAME, UsNatField.SENSITIVE_DATA_PROCESSING)); Assertions.assertEquals(Arrays.asList(0, 0, 1), @@ -809,7 +815,7 @@ public void testDecodingEmptyString() { GppModel gppModel = new GppModel("DBABTA~1---"); Assertions.assertEquals("DBABTA~1---", gppModel.encode()); - gppModel.decode(null); + gppModel.decode(""); Assertions.assertEquals("DBAA", gppModel.encode()); gppModel.setFieldValue("uspv1", UspV1Field.NOTICE, 'Y'); diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/base64/TraditionalBase64UrlEncoderTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/base64/TraditionalBase64UrlEncoderTest.java index 02985a7e..a4fb89dc 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/base64/TraditionalBase64UrlEncoderTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/base64/TraditionalBase64UrlEncoderTest.java @@ -9,26 +9,7 @@ public class TraditionalBase64UrlEncoderTest { private TraditionalBase64UrlEncoder base64UrlEncoder = TraditionalBase64UrlEncoder.getInstance(); - @Test - public void testEncode1() { - BitStringBuilder builder = new BitStringBuilder(); - builder.append(BitString.of("0000110000010000000000010011")); - Assertions.assertEquals("DBABMAAA", base64UrlEncoder.encode(builder).toString()); - } - - @Test - public void testEncode2() { - BitStringBuilder builder = new BitStringBuilder(); - builder.append(BitString.of("000011000001000000000010001101011")); - Assertions.assertEquals("DBACNYAA", base64UrlEncoder.encode(builder).toString()); - } - - @Test - public void testEncode3() { - BitStringBuilder builder = new BitStringBuilder(); - builder.append(BitString.of("00001100000100000000000110001111")); - Assertions.assertEquals("DBABjwAA", base64UrlEncoder.encode(builder).toString()); - } + @Test public void testDecode1() { @@ -44,5 +25,23 @@ public void testDecode2() { public void testDecode3() { Assertions.assertEquals("000011000001000000000001100011110000000000000000", base64UrlEncoder.decode("DBABjwAA").toString()); } + + @Test + public void testDifferingLengthDecodes() { + for (int length = 0; length < 1000; length++) { + StringBuilder in = new StringBuilder(); + StringBuilder out = new StringBuilder(); + for (int i = 0; i < length; i++) { + if (i % 2 == 0) { + in.append('u'); + out.append("101110"); + } else { + in.append('d'); + out.append("011101"); + } + } + Assertions.assertEquals(out.toString(), base64UrlEncoder.decode(in.toString()).toString()); + } + } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/DirtyableListTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/DirtyableListTest.java new file mode 100644 index 00000000..dbbc28b0 --- /dev/null +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/DirtyableListTest.java @@ -0,0 +1,38 @@ +package com.iab.gpp.encoder.datatype; + +import static org.junit.jupiter.api.Assertions.*; +import java.util.List; +import java.util.Set; +import org.junit.jupiter.api.Test; + +class DirtyableListTest { + + @Test + void test() { + RangeEntry item1 = new RangeEntry(1, 2, Set.of(3,4,5)); + RangeEntry item2 = new RangeEntry(6, 7, Set.of(8,9,10)); + RangeEntry item3 = new RangeEntry(11, 12, Set.of(13,14,15)); + DirtyableList list = new DirtyableList<>(); + list.add(item1); + list.addAll(List.of(item2, item3)); + assertEquals(List.of(item1, item2, item3), list); + assertEquals(item1, list.get(0)); + assertEquals(item2, list.get(1)); + assertEquals(item3, list.get(2)); + assertEquals(3, list.size()); + assertFalse(list.isEmpty()); + assertTrue(list.isDirty()); + list.setDirty(false); + assertFalse(list.isDirty()); + item2.getIds().remove(9); + assertTrue(list.isDirty()); + RangeEntry item2a = new RangeEntry(100, 200, Set.of(300,400,500)); + assertEquals(item2, list.set(1, item2a)); + assertEquals(item2a, list.get(1)); + assertEquals(item3, list.remove(2)); + assertEquals(2, list.size()); + list.add(item3); + assertEquals(List.of(item1, item2a, item3), list); + } + +} diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableBooleanTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableBooleanTest.java deleted file mode 100644 index cdecadc3..00000000 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableBooleanTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import com.iab.gpp.encoder.bitstring.BitString; - -public class EncodableBooleanTest { - - @Test - public void testSubstring1() throws SubstringException { - Assertions.assertEquals("000000000000000000000000000000000000", - new EncodableDatetime().substring(BitString.of("10000000000000000000000000000000000001"), 1).toString()); - } - - @Test - public void testSubstring2() throws SubstringException { - Assertions.assertEquals("111111111111111111111111111111111111", - new EncodableDatetime().substring(BitString.of("01111111111111111111111111111111111110"), 1).toString()); - } - -} diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableDatetimeTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableDatetimeTest.java deleted file mode 100644 index bd9460b8..00000000 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableDatetimeTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.error.DecodingException; - -public class EncodableDatetimeTest { - - @Test - public void testSubstring1() throws DecodingException, SubstringException { - Assertions.assertEquals("000000000000000000000000000000000000", - new EncodableDatetime().substring(BitString.of("10000000000000000000000000000000000001"), 1).toString()); - } - - @Test - public void testSubstring2() throws DecodingException, SubstringException { - Assertions.assertEquals("111111111111111111111111111111111111", - new EncodableDatetime().substring(BitString.of("01111111111111111111111111111111111110"), 1).toString()); - } - -} diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFibonacciIntegerRangeTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFibonacciIntegerRangeTest.java deleted file mode 100644 index 76e5919b..00000000 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFibonacciIntegerRangeTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.error.DecodingException; - -public class EncodableFibonacciIntegerRangeTest { - - @Test - public void testSubstring1() throws DecodingException, SubstringException { - Assertions.assertEquals("0000000000100001110110011", - new EncodableFibonacciIntegerRange().substring(BitString.of("100000000001000011101100110"), 1).toString()); - } -} diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedBitfieldTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedBitfieldTest.java deleted file mode 100644 index 17d98cfe..00000000 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedBitfieldTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import com.iab.gpp.encoder.bitstring.BitString; - -public class EncodableFixedBitfieldTest { - - @Test - public void testSubstring1() throws SubstringException { - Assertions.assertEquals("000", new EncodableFixedBitfield(3).substring(BitString.of("10001"), 1).toString()); - } - - @Test - public void testSubstring2() throws SubstringException { - Assertions.assertEquals("111", new EncodableFixedBitfield(3).substring(BitString.of("01110"), 1).toString()); - } - -} diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerListTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerListTest.java deleted file mode 100644 index 3cf83666..00000000 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerListTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import com.iab.gpp.encoder.bitstring.BitString; - -public class EncodableFixedIntegerListTest { - - @Test - public void testSubstring1() throws SubstringException { - Assertions.assertEquals("1000", new EncodableFixedIntegerList(2, 2).substring(BitString.of("10001"), 0).toString()); - } - - @Test - public void testSubstring2() throws SubstringException { - Assertions.assertEquals("1110", new EncodableFixedIntegerList(2, 2).substring(BitString.of("01110"), 1).toString()); - } - -} diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerRangeTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerRangeTest.java index dc3e6cfc..638d19da 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerRangeTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerRangeTest.java @@ -7,25 +7,12 @@ import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; public class EncodableFixedIntegerRangeTest { - @Test - public void testSubstring1() throws DecodingException, SubstringException { - Assertions.assertEquals("00000000001000000000000000011100000000000001010000000000001000", - new EncodableFixedIntegerRange().substring(BitString.of("1000000000010000000000000000111000000000000010100000000000010001"), - 1).toString()); - } - - @Test - public void testSubstring2() throws DecodingException, SubstringException { - Assertions.assertEquals("00000000000100000000000011101", new EncodableFixedIntegerRange().substring( - BitString.of("000010001111010010000110111111111100000000001111010010000110111111111100000000000000000000000000000000000000000100001101000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000001110110000000000010000000000001110100000000000000000000000000000"), - 230).toString()); - } - @Test public void testEncode1() throws EncodingException { EncodableFixedIntegerRange encodableFixedIntegerRange = new EncodableFixedIntegerRange(); @@ -47,14 +34,14 @@ public void testEncode2() throws EncodingException { @Test public void testDecode1() throws DecodingException { EncodableFixedIntegerRange encodableFixedIntegerRange = new EncodableFixedIntegerRange(); - encodableFixedIntegerRange.decode(BitString.of("00000000000100000000000011100")); + encodableFixedIntegerRange.decode(new BitStringReader(BitString.of("00000000000100000000000011100"))); Assertions.assertEquals(Set.of(28), encodableFixedIntegerRange.getValue()); } @Test public void testDecode2() throws DecodingException { EncodableFixedIntegerRange encodableFixedIntegerRange = new EncodableFixedIntegerRange(); - encodableFixedIntegerRange.decode(BitString.of("00000000000100000000000011101")); + encodableFixedIntegerRange.decode(new BitStringReader(BitString.of("00000000000100000000000011101"))); Assertions.assertEquals(Set.of(29), encodableFixedIntegerRange.getValue()); } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerTest.java deleted file mode 100644 index 54a2c9cb..00000000 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import com.iab.gpp.encoder.bitstring.BitString; - -public class EncodableFixedIntegerTest { - - @Test - public void testSubstring1() throws SubstringException { - Assertions.assertEquals("000", new EncodableFixedInteger(3).substring(BitString.of("10001"), 1).toString()); - } - - @Test - public void testSubstring2() throws SubstringException { - Assertions.assertEquals("111", new EncodableFixedInteger(3).substring(BitString.of("01110"), 1).toString()); - } - -} diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedStringTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedStringTest.java deleted file mode 100644 index 77beabe3..00000000 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedStringTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import com.iab.gpp.encoder.bitstring.BitString; - -public class EncodableFixedStringTest { - - @Test - public void testSubstring1() throws SubstringException { - Assertions.assertEquals("000000000000", new EncodableFixedString(2).substring(BitString.of("10000000000001"), 1).toString()); - } - - @Test - public void testSubstring2() throws SubstringException { - Assertions.assertEquals("111111111111", new EncodableFixedString(2).substring(BitString.of("01111111111110"), 1).toString()); - } - -} diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableOptimizedFixedRangeTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableOptimizedFixedRangeTest.java index 5cfc68b5..d73c6e91 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableOptimizedFixedRangeTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableOptimizedFixedRangeTest.java @@ -7,6 +7,7 @@ import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; public class EncodableOptimizedFixedRangeTest { @@ -47,39 +48,25 @@ public void testEncode4() { @Test public void testDecode1() { - encodableOptimizedFixedRange.decode(BitString.of("00000000001100000000000000001000000000001000000000000000000000001")); + encodableOptimizedFixedRange.decode(new BitStringReader(BitString.of("00000000001100000000000000001000000000001000000000000000000000001"))); Assertions.assertEquals(Set.of(12, 24, 48), encodableOptimizedFixedRange.getValue()); } @Test public void testDecode2() { - encodableOptimizedFixedRange.decode(BitString.of("00000000000111100000000000000000001000000000001")); + encodableOptimizedFixedRange.decode(new BitStringReader(BitString.of("00000000000111100000000000000000001000000000001"))); Assertions.assertEquals(Set.of(18, 30), encodableOptimizedFixedRange.getValue()); } @Test public void testDecode3() { - encodableOptimizedFixedRange.decode(BitString.of("000000000001110000000000000000000000000000001")); + encodableOptimizedFixedRange.decode(new BitStringReader(BitString.of("000000000001110000000000000000000000000000001"))); Assertions.assertEquals(Set.of(28), encodableOptimizedFixedRange.getValue()); } @Test public void testDecode4() { - encodableOptimizedFixedRange.decode(BitString.of("0000000000011101100000000000100000000000011101")); + encodableOptimizedFixedRange.decode(new BitStringReader(BitString.of("0000000000011101100000000000100000000000011101"))); Assertions.assertEquals(Set.of(29), encodableOptimizedFixedRange.getValue()); } - - @Test - public void testSubstring1() throws SubstringException { - Assertions.assertEquals("000000000001110000000000000000000000000000001", encodableOptimizedFixedRange.substring( - BitString.of("000010001111010010000110111111111100000000001111010010000110111111111100000000000000000000000000000000000000000100001101000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000001110000000000000000000000000000001000000000000000000000000000000"), - 213).toString()); - } - - @Test - public void testSubstring2() throws SubstringException { - Assertions.assertEquals("0000000000011101100000000000100000000000011101", encodableOptimizedFixedRange.substring( - BitString.of("000010001111010010000110111111111100000000001111010010000110111111111100000000000000000000000000000000000000000100001101000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000001110110000000000010000000000001110100000000000000000000000000000"), - 213).toString()); - } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/FixedIntegerListTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/FixedIntegerListTest.java new file mode 100644 index 00000000..6aee9b3e --- /dev/null +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/FixedIntegerListTest.java @@ -0,0 +1,32 @@ +package com.iab.gpp.encoder.datatype; + +import static org.junit.jupiter.api.Assertions.*; +import java.util.List; +import org.junit.jupiter.api.Test; + +class FixedIntegerListTest { + + @Test + void test() { + FixedIntegerList list = new FixedIntegerList(5); + assertFalse(list.isDirty()); + list.set(0, 2); + list.set(1, 1); + list.set(2, 5); + list.set(3, 8); + list.set(4, 3); + assertThrows(IllegalArgumentException.class, () -> list.set(4, 128)); + assertThrows(IllegalArgumentException.class, () -> list.set(4, -1)); + assertEquals(5, list.size()); + assertEquals(List.of(2,1,5,8,3), list); + assertEquals(2, list.get(0)); + assertEquals(1, list.get(1)); + assertEquals(5, list.get(2)); + assertEquals(8, list.get(3)); + assertEquals(3, list.get(4)); + assertTrue(list.isDirty()); + list.setDirty(false); + assertFalse(list.isDirty()); + } + +} diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/DatetimeEncoderTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/DatetimeEncoderTest.java index ac18fbd3..73f74cb9 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/DatetimeEncoderTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/DatetimeEncoderTest.java @@ -6,6 +6,7 @@ import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.error.DecodingException; public class DatetimeEncoderTest { @@ -16,7 +17,7 @@ public void test1() throws DecodingException { BitStringBuilder builder = new BitStringBuilder(); DatetimeEncoder.encode(builder, date1); String encodedDate1 = builder.build().toString(); - Instant date2 = DatetimeEncoder.decode(BitString.of(encodedDate1)); + Instant date2 = DatetimeEncoder.decode(new BitStringReader(BitString.of(encodedDate1))); Assertions.assertEquals((date1.toEpochMilli() / 100L) * 100L, date2.toEpochMilli()); } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FibonacciIntegerEncoderTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FibonacciIntegerEncoderTest.java index 2f2c8520..060a25c1 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FibonacciIntegerEncoderTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FibonacciIntegerEncoderTest.java @@ -5,6 +5,7 @@ import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; @@ -66,75 +67,49 @@ public void testEncodeTooLarge() { FibonacciIntegerEncoder.encode(builder, Integer.MAX_VALUE)); } + private int decode(String str) { + return new BitStringReader(BitString.of(str)).readFibonacci(); + } + @Test public void testDecode1() throws DecodingException { - Assertions.assertEquals(1, FibonacciIntegerEncoder.decode(BitString.of("11"))); + Assertions.assertEquals(1, decode("11")); } @Test public void testDecode2() throws DecodingException { - Assertions.assertEquals(2, FibonacciIntegerEncoder.decode(BitString.of("011"))); + Assertions.assertEquals(2, decode("011")); } @Test public void testDecode3() throws DecodingException { - Assertions.assertEquals(3, FibonacciIntegerEncoder.decode(BitString.of("0011"))); + Assertions.assertEquals(3, decode("0011")); } @Test public void testDecode4() throws DecodingException { - Assertions.assertEquals(4, FibonacciIntegerEncoder.decode(BitString.of("1011"))); + Assertions.assertEquals(4, decode("1011")); } @Test public void testDecode5() throws DecodingException { - Assertions.assertEquals(5, FibonacciIntegerEncoder.decode(BitString.of("00011"))); + Assertions.assertEquals(5, decode("00011")); } @Test public void testDecode6() throws DecodingException { - Assertions.assertEquals(6, FibonacciIntegerEncoder.decode(BitString.of("10011"))); + Assertions.assertEquals(6, decode("10011")); } @Test public void testDecode7() throws DecodingException { - Assertions.assertEquals(7, FibonacciIntegerEncoder.decode(BitString.of("01011"))); - } - - @Test - public void testDecode8() { - try { - FibonacciIntegerEncoder.decode(BitString.of("110")); - Assertions.fail("DecodingException expected"); - } catch (DecodingException e) { - - } - } - - @Test - public void testDecode9() { - try { - FibonacciIntegerEncoder.decode(BitString.of("1100")); - Assertions.fail("DecodingException expected"); - } catch (DecodingException e) { - - } - } - - @Test - public void testDecode10() { - try { - FibonacciIntegerEncoder.decode(BitString.of("0110000000")); - Assertions.fail("DecodingException expected"); - } catch (DecodingException e) { - - } + Assertions.assertEquals(7, decode("01011")); } @Test public void testDecodeTooLarge() { Assertions.assertThrows(DecodingException.class, () -> - FibonacciIntegerEncoder.decode(BitString.of("0001010001000101001000001001000100001000100011"))); + decode("0001010001000101001000001001000100001000100011")); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FibonacciIntegerRangeEncoderTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FibonacciIntegerRangeEncoderTest.java index b8ad0b2f..2c71713c 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FibonacciIntegerRangeEncoderTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FibonacciIntegerRangeEncoderTest.java @@ -8,6 +8,7 @@ import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.error.DecodingException; public class FibonacciIntegerRangeEncoderTest { @@ -43,7 +44,7 @@ public void testEncode4() { @Test public void testEncode5() { BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + IntegerSet set = new IntegerSet(); set.addAll(Arrays.asList(6, 7, 2, 5)); FibonacciIntegerRangeEncoder.encode(builder, set); Assertions.assertEquals("000000000010001110011011", builder.build().toString()); @@ -62,43 +63,47 @@ public void testEncode7() { FibonacciIntegerRangeEncoder.encode(builder, Arrays.asList(2, 5, 6, 7, 8, 9, 10, 11, 12)); Assertions.assertEquals("00000000001000111001101011", builder.build().toString()); } + + private IntegerSet decode(String str) { + return FibonacciIntegerRangeEncoder.decode(new BitStringReader(BitString.of(str))); + } @Test public void testDecode1() throws DecodingException { - Assertions.assertEquals(Set.of(), FibonacciIntegerRangeEncoder.decode(BitString.of("000000000000"))); + Assertions.assertEquals(Set.of(), decode("000000000000")); } @Test public void testDecode2() throws DecodingException { - Assertions.assertEquals(Set.of(2), FibonacciIntegerRangeEncoder.decode(BitString.of("0000000000010011"))); + Assertions.assertEquals(Set.of(2), decode("0000000000010011")); } @Test public void testDecode3() throws DecodingException { - Assertions.assertEquals(Set.of(2, 3, 4, 5, 6), FibonacciIntegerRangeEncoder.decode(BitString.of("00000000000110111011"))); + Assertions.assertEquals(Set.of(2, 3, 4, 5, 6), decode("00000000000110111011")); } @Test public void testDecode4() throws DecodingException { - Assertions.assertEquals(Set.of(2, 5, 6, 7), FibonacciIntegerRangeEncoder.decode(BitString.of("000000000010001110011011"))); + Assertions.assertEquals(Set.of(2, 5, 6, 7), decode("000000000010001110011011")); } @Test public void testDecode5() throws DecodingException { Assertions.assertEquals(Set.of(3, 5, 6, 7, 8), - FibonacciIntegerRangeEncoder.decode(BitString.of("0000000000100001110110011"))); + decode("0000000000100001110110011")); } @Test public void testDecode6() throws DecodingException { Assertions.assertEquals(Set.of(2, 5, 6, 7, 8, 9, 10, 11, 12), - FibonacciIntegerRangeEncoder.decode(BitString.of("00000000001000111001101011"))); + decode("00000000001000111001101011")); } @Test public void testDecode7() { try { - FibonacciIntegerRangeEncoder.decode(BitString.of("0011")); + decode("0011"); Assertions.fail("DecodingException expected"); } catch (DecodingException e) { @@ -108,7 +113,7 @@ public void testDecode7() { @Test public void testDecode8() { try { - FibonacciIntegerRangeEncoder.decode(BitString.of("000000000002")); + decode("000000000002"); Assertions.fail("DecodingException expected"); } catch (DecodingException e) { diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedBitfieldEncoderTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedBitfieldEncoderTest.java index a0549270..23fdf263 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedBitfieldEncoderTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedBitfieldEncoderTest.java @@ -6,6 +6,7 @@ import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.error.DecodingException; public class FixedBitfieldEncoderTest { @@ -13,7 +14,7 @@ public class FixedBitfieldEncoderTest { @Test public void testEncode1() { BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + IntegerSet set = new IntegerSet(); FixedBitfieldEncoder.encode(builder, set, 2); Assertions.assertEquals("00", builder.build().toString()); } @@ -21,7 +22,7 @@ public void testEncode1() { @Test public void testEncode2() { BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + IntegerSet set = new IntegerSet(); FixedBitfieldEncoder.encode(builder, set, 1); Assertions.assertEquals("0", builder.build().toString()); } @@ -29,7 +30,7 @@ public void testEncode2() { @Test public void testEncode3() { BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + IntegerSet set = new IntegerSet(); set.add(0); FixedBitfieldEncoder.encode(builder, set, 1); Assertions.assertEquals("1", builder.build().toString()); @@ -38,7 +39,7 @@ public void testEncode3() { @Test public void testEncode4() { BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + IntegerSet set = new IntegerSet(); FixedBitfieldEncoder.encode(builder, set, 2); Assertions.assertEquals("00", builder.build().toString()); } @@ -46,7 +47,7 @@ public void testEncode4() { @Test public void testEncode5() { BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + IntegerSet set = new IntegerSet(); set.addInt(1); FixedBitfieldEncoder.encode(builder, set, 2); Assertions.assertEquals("01", builder.build().toString()); @@ -55,7 +56,7 @@ public void testEncode5() { @Test public void testEncode6() { BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + IntegerSet set = new IntegerSet(); set.addInt(0); FixedBitfieldEncoder.encode(builder, set, 2); Assertions.assertEquals("10", builder.build().toString()); @@ -64,7 +65,7 @@ public void testEncode6() { @Test public void testEncode7() { BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + IntegerSet set = new IntegerSet(); set.addInt(0); set.addInt(1); FixedBitfieldEncoder.encode(builder, set, 2); @@ -73,7 +74,7 @@ public void testEncode7() { @Test public void testEncode8() { - IntegerSet set = new IntegerBitSet(5); + IntegerSet set = new IntegerSet(5); for(int i = 0; i <= 10; i++) { set.addInt(i); } @@ -82,50 +83,54 @@ public void testEncode8() { @Test public void testEncode9() { - IntegerBitSet set = new IntegerBitSet(5); + IntegerSet set = new IntegerSet(5); set.addRange(0,10); Assertions.assertEquals(Set.of(0,1,2,3,4), set); } + private IntegerSet decode(String str) { + return new BitStringReader(BitString.of(str)).readIntegerSet(str.length()); + } + @Test public void testDecode1() { - Assertions.assertEquals(Set.of(), FixedBitfieldEncoder.decode(BitString.of(""))); + Assertions.assertEquals(Set.of(), decode("")); } @Test public void testDecode2() { - Assertions.assertEquals(Set.of(), FixedBitfieldEncoder.decode(BitString.of("0"))); + Assertions.assertEquals(Set.of(), decode("0")); } @Test public void testDecode3() { - Assertions.assertEquals(Set.of(1), FixedBitfieldEncoder.decode(BitString.of("1"))); + Assertions.assertEquals(Set.of(1), decode("1")); } @Test public void testDecode4() { - Assertions.assertEquals(Set.of(), FixedBitfieldEncoder.decode(BitString.of("00"))); + Assertions.assertEquals(Set.of(), decode("00")); } @Test public void testDecode5() { - Assertions.assertEquals(Set.of(2), FixedBitfieldEncoder.decode(BitString.of("01"))); + Assertions.assertEquals(Set.of(2), decode("01")); } @Test public void testDecode6() { - Assertions.assertEquals(Set.of(1), FixedBitfieldEncoder.decode(BitString.of("10"))); + Assertions.assertEquals(Set.of(1), decode("10")); } @Test public void testDecode7() { - Assertions.assertEquals(Set.of(1, 2), FixedBitfieldEncoder.decode(BitString.of("11"))); + Assertions.assertEquals(Set.of(1, 2), decode("11")); } @Test public void testDecode8() { try { - FixedBitfieldEncoder.decode(BitString.of("2")); + decode("2"); Assertions.fail("DecodingException expected"); } catch (DecodingException e) { diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerEncoderTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerEncoderTest.java index 676c46e6..c4d75447 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerEncoderTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerEncoderTest.java @@ -5,6 +5,7 @@ import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; @@ -56,38 +57,42 @@ public void testEncode6() { } } + private int decode(String str) { + return new BitStringReader(BitString.of(str)).readInt(str.length()); + } + @Test public void testDecode1() throws DecodingException { - Assertions.assertEquals(0, FixedIntegerEncoder.decode(BitString.of(""))); + Assertions.assertEquals(0, decode("")); } @Test public void testDecode2() throws DecodingException { - Assertions.assertEquals(0, FixedIntegerEncoder.decode(BitString.of("0"))); + Assertions.assertEquals(0, decode("0")); } @Test public void testDecode3() throws DecodingException { - Assertions.assertEquals(0, FixedIntegerEncoder.decode(BitString.of("000000"))); + Assertions.assertEquals(0, decode("000000")); } @Test public void testDecode4() throws DecodingException { - Assertions.assertEquals(1, FixedIntegerEncoder.decode(BitString.of("1"))); + Assertions.assertEquals(1, decode("1")); } @Test public void testDecode5() throws DecodingException { - Assertions.assertEquals(1, FixedIntegerEncoder.decode(BitString.of("000001"))); + Assertions.assertEquals(1, decode("000001")); } @Test public void testDecode6() throws DecodingException { - Assertions.assertEquals(8, FixedIntegerEncoder.decode(BitString.of("1000"))); + Assertions.assertEquals(8, decode("1000")); } @Test public void testDecode7() throws DecodingException { - Assertions.assertEquals(8, FixedIntegerEncoder.decode(BitString.of("0000001000"))); + Assertions.assertEquals(8, decode("0000001000")); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerListEncoderTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerListEncoderTest.java index 16a70ff4..2144dbe5 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerListEncoderTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerListEncoderTest.java @@ -7,6 +7,8 @@ import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; +import com.iab.gpp.encoder.datatype.FixedIntegerList; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; @@ -148,106 +150,97 @@ public void testEncode19() { } } - - @Test - public void testDecode1() { - Assertions.assertEquals(Arrays.asList(0, 0), FixedIntegerListEncoder.decode(BitString.of(""), 2, 2)); + + private FixedIntegerList decode(String str) { + FixedIntegerList out = new FixedIntegerList(2); + FixedIntegerListEncoder.decode(out, new BitStringReader(BitString.of(str)), 2); + return out; } @Test public void testDecode2() { - Assertions.assertEquals(Arrays.asList(0, 0), FixedIntegerListEncoder.decode(BitString.of("0000"), 2, 2)); + Assertions.assertEquals(Arrays.asList(0, 0), decode("0000")); } @Test public void testDecode3() { - Assertions.assertEquals(Arrays.asList(0, 1), FixedIntegerListEncoder.decode(BitString.of("0001"), 2, 2)); + Assertions.assertEquals(Arrays.asList(0, 1), decode("0001")); } @Test public void testDecode4() { - Assertions.assertEquals(Arrays.asList(0, 2), FixedIntegerListEncoder.decode(BitString.of("0010"), 2, 2)); + Assertions.assertEquals(Arrays.asList(0, 2), decode("0010")); } @Test public void testDecode5() { - Assertions.assertEquals(Arrays.asList(0, 3), FixedIntegerListEncoder.decode(BitString.of("0011"), 2, 2)); + Assertions.assertEquals(Arrays.asList(0, 3), decode("0011")); } @Test public void testDecode6() { - Assertions.assertEquals(Arrays.asList(1, 0), FixedIntegerListEncoder.decode(BitString.of("0100"), 2, 2)); + Assertions.assertEquals(Arrays.asList(1, 0), decode("0100")); } @Test public void testDecode7() { - Assertions.assertEquals(Arrays.asList(1, 1), FixedIntegerListEncoder.decode(BitString.of("0101"), 2, 2)); + Assertions.assertEquals(Arrays.asList(1, 1), decode("0101")); } @Test public void testDecode8() { - Assertions.assertEquals(Arrays.asList(1, 2), FixedIntegerListEncoder.decode(BitString.of("0110"), 2, 2)); + Assertions.assertEquals(Arrays.asList(1, 2), decode("0110")); } @Test public void testDecode9() { - Assertions.assertEquals(Arrays.asList(1, 3), FixedIntegerListEncoder.decode(BitString.of("0111"), 2, 2)); + Assertions.assertEquals(Arrays.asList(1, 3), decode("0111")); } @Test public void testDecode10() { - Assertions.assertEquals(Arrays.asList(2, 0), FixedIntegerListEncoder.decode(BitString.of("1000"), 2, 2)); + Assertions.assertEquals(Arrays.asList(2, 0), decode("1000")); } @Test public void testDecode11() { - Assertions.assertEquals(Arrays.asList(2, 1), FixedIntegerListEncoder.decode(BitString.of("1001"), 2, 2)); + Assertions.assertEquals(Arrays.asList(2, 1), decode("1001")); } @Test public void testDecode12() { - Assertions.assertEquals(Arrays.asList(2, 2), FixedIntegerListEncoder.decode(BitString.of("1010"), 2, 2)); + Assertions.assertEquals(Arrays.asList(2, 2), decode("1010")); } @Test public void testDecode13() { - Assertions.assertEquals(Arrays.asList(2, 3), FixedIntegerListEncoder.decode(BitString.of("1011"), 2, 2)); + Assertions.assertEquals(Arrays.asList(2, 3), decode("1011")); } @Test public void testDecode14() { - Assertions.assertEquals(Arrays.asList(3, 0), FixedIntegerListEncoder.decode(BitString.of("1100"), 2, 2)); + Assertions.assertEquals(Arrays.asList(3, 0), decode("1100")); } @Test public void testDecode15() { - Assertions.assertEquals(Arrays.asList(3, 1), FixedIntegerListEncoder.decode(BitString.of("1101"), 2, 2)); + Assertions.assertEquals(Arrays.asList(3, 1), decode("1101")); } @Test public void testDecode16() { - Assertions.assertEquals(Arrays.asList(3, 2), FixedIntegerListEncoder.decode(BitString.of("1110"), 2, 2)); + Assertions.assertEquals(Arrays.asList(3, 2), decode("1110")); } @Test public void testDecode17() { - Assertions.assertEquals(Arrays.asList(3, 3), FixedIntegerListEncoder.decode(BitString.of("1111"), 2, 2)); - } - - @Test - public void testDecode18() { - try { - FixedIntegerListEncoder.decode(BitString.of("111111"), 2, 2); - Assertions.fail("DecodingException expected"); - } catch (DecodingException e) { - - } + Assertions.assertEquals(Arrays.asList(3, 3), decode("1111")); } @Test public void testDecode19() { try { - FixedIntegerListEncoder.decode(BitString.of("2"), 2, 2); + decode("2"); Assertions.fail("DecodingException expected"); } catch (DecodingException e) { @@ -257,7 +250,7 @@ public void testDecode19() { @Test public void testDecode20() { try { - FixedIntegerListEncoder.decode(BitString.of("111"), 2, 2); + decode("111"); Assertions.fail("DecodingException expected"); } catch (DecodingException e) { diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerRangeEncoderTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerRangeEncoderTest.java index 7fe4db47..da47b3a5 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerRangeEncoderTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerRangeEncoderTest.java @@ -8,6 +8,7 @@ import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.error.DecodingException; public class FixedIntegerRangeEncoderTest { @@ -45,7 +46,7 @@ public void testEncode4() { @Test public void testEncode5() { BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + IntegerSet set = new IntegerSet(); set.addAll(Arrays.asList(6, 7, 2, 5)); FixedIntegerRangeEncoder.encode(builder, set); Assertions.assertEquals("00000000001000000000000000010100000000000001010000000000000111", @@ -85,56 +86,59 @@ public void testEncode9() { builder.build().toString()); } + private IntegerSet decode(String str) { + return FixedIntegerRangeEncoder.decode(new BitStringReader(BitString.of(str))); + } + @Test public void testDecode1() throws DecodingException { - Assertions.assertEquals(Set.of(), FixedIntegerRangeEncoder.decode(BitString.of("000000000000"))); + Assertions.assertEquals(Set.of(), decode("000000000000")); } @Test public void testDecode2() throws DecodingException { - Assertions.assertEquals(Set.of(2), FixedIntegerRangeEncoder.decode(BitString.of("00000000000100000000000000010"))); + Assertions.assertEquals(Set.of(2), decode("00000000000100000000000000010")); } @Test public void testDecode3() throws DecodingException { Assertions.assertEquals(Set.of(2, 3, 4, 5, 6), - FixedIntegerRangeEncoder.decode(BitString.of("000000000001100000000000000100000000000000110"))); + decode("000000000001100000000000000100000000000000110")); } @Test public void testDecode4() throws DecodingException { Assertions.assertEquals(Set.of(2, 5, 6, 7), - FixedIntegerRangeEncoder.decode(BitString.of("00000000001000000000000000010100000000000001010000000000000111"))); + decode("00000000001000000000000000010100000000000001010000000000000111")); } @Test public void testDecode5() throws DecodingException { Assertions.assertEquals(Set.of(3, 5, 6, 7, 8), - FixedIntegerRangeEncoder.decode(BitString.of("00000000001000000000000000011100000000000001010000000000001000"))); + decode("00000000001000000000000000011100000000000001010000000000001000")); } @Test public void testDecode6() throws DecodingException { Assertions.assertEquals(Set.of(12, 24, 48), - FixedIntegerRangeEncoder.decode(BitString.of("000000000011000000000000011000000000000001100000000000000110000"))); + decode("000000000011000000000000011000000000000001100000000000000110000")); } @Test public void testDecode7() throws DecodingException { - Assertions.assertEquals(Set.of(12, 24, 48, 49), FixedIntegerRangeEncoder - .decode(BitString.of("0000000000110000000000000110000000000000011000100000000001100000000000000110001"))); + Assertions.assertEquals(Set.of(12, 24, 48, 49), decode("0000000000110000000000000110000000000000011000100000000001100000000000000110001")); } @Test public void testDecode8() throws DecodingException { - Assertions.assertEquals(Set.of(2, 6, 8, 12, 18, 23, 24, 25, 37, 42), FixedIntegerRangeEncoder.decode( - BitString.of("00000000100000000000000000010000000000000001100000000000000100000000000000001100000000000000100101000000000001011100000000000110010000000000010010100000000000101010"))); + Assertions.assertEquals(Set.of(2, 6, 8, 12, 18, 23, 24, 25, 37, 42), decode( + "00000000100000000000000000010000000000000001100000000000000100000000000000001100000000000000100101000000000001011100000000000110010000000000010010100000000000101010")); } @Test public void testDecode9() { try { - FixedIntegerRangeEncoder.decode(BitString.of("0011")); + decode("0011"); Assertions.fail("DecodingException expected"); } catch (DecodingException e) { @@ -144,7 +148,7 @@ public void testDecode9() { @Test public void testDecode10() { try { - FixedIntegerRangeEncoder.decode(BitString.of("000000000002")); + decode("000000000002"); Assertions.fail("DecodingException expected"); } catch (DecodingException e) { diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedLongEncoderTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedLongEncoderTest.java index 653e5066..fc1fde0a 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedLongEncoderTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedLongEncoderTest.java @@ -5,6 +5,7 @@ import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; @@ -64,43 +65,47 @@ public void testEncode7() { } } + private long decode(String str) { + return new BitStringReader(BitString.of(str)).readLong(str.length()); + } + @Test public void testDecode1() throws DecodingException { - Assertions.assertEquals(0, FixedLongEncoder.decode(BitString.of(""))); + Assertions.assertEquals(0, decode("")); } @Test public void testDecode2() throws DecodingException { - Assertions.assertEquals(0, FixedLongEncoder.decode(BitString.of("0"))); + Assertions.assertEquals(0, decode("0")); } @Test public void testDecode3() throws DecodingException { - Assertions.assertEquals(0, FixedLongEncoder.decode(BitString.of("000000"))); + Assertions.assertEquals(0, decode("000000")); } @Test public void testDecode4() throws DecodingException { - Assertions.assertEquals(1, FixedLongEncoder.decode(BitString.of("1"))); + Assertions.assertEquals(1, decode("1")); } @Test public void testDecode5() throws DecodingException { - Assertions.assertEquals(1, FixedLongEncoder.decode(BitString.of("000001"))); + Assertions.assertEquals(1, decode("000001")); } @Test public void testDecode6() throws DecodingException { - Assertions.assertEquals(16630898421L, FixedLongEncoder.decode(BitString.of("001111011111010001110101111011110101"))); + Assertions.assertEquals(16630898421L, decode("001111011111010001110101111011110101")); } @Test public void testDecode7() throws DecodingException { - Assertions.assertEquals(8, FixedLongEncoder.decode(BitString.of("1000"))); + Assertions.assertEquals(8, decode("1000")); } @Test public void testDecode8() throws DecodingException { - Assertions.assertEquals(8, FixedLongEncoder.decode(BitString.of("0000001000"))); + Assertions.assertEquals(8, decode("0000001000")); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedStringEncoderTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedStringEncoderTest.java index bc904371..970c99bc 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedStringEncoderTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedStringEncoderTest.java @@ -5,6 +5,7 @@ import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitStringReader; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; @@ -35,20 +36,24 @@ public void testEncode3() { } } + private String decode(String str) { + return FixedStringEncoder.decode(new BitStringReader(BitString.of(str)), str.length() / 6); + } + @Test public void testDecode1() { - Assertions.assertEquals("AB", FixedStringEncoder.decode(BitString.of("000000000001"))); + Assertions.assertEquals("AB", decode("000000000001")); } @Test public void testDecode2() { - Assertions.assertEquals("a", FixedStringEncoder.decode(BitString.of("100000111111"))); + Assertions.assertEquals("a", decode("100000111111")); } @Test public void testDecode3() { try { - FixedStringEncoder.decode(BitString.of("2")); + decode("2"); Assertions.fail("DecodingException expected"); } catch (DecodingException e) { diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/IntegerSetTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/IntegerSetTest.java new file mode 100644 index 00000000..7d4cdb3c --- /dev/null +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/IntegerSetTest.java @@ -0,0 +1,50 @@ +package com.iab.gpp.encoder.datatype.encoder; + +import static org.junit.jupiter.api.Assertions.*; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import org.junit.jupiter.api.Test; + +class IntegerSetTest { + + @Test + void test() { + IntegerSet set = new IntegerSet(5); + assertFalse(set.isDirty()); + assertTrue(set.isEmpty()); + set.add(0); + set.add(2); + set.add(3); + assertEquals(Set.of(0,2,3), set); + assertTrue(set.isDirty()); + assertFalse(set.isEmpty()); + assertEquals(3, set.size()); + assertFalse(set.remove(1)); + assertTrue(set.remove(2)); + assertEquals(2, set.size()); + set.addAll(List.of(3,4)); + assertEquals(Set.of(0,3,4), set); + List out = new ArrayList<>(); + Iterator it = set.iterator(); + it.forEachRemaining(out::add); + assertEquals(List.of(0,3,4), out); + assertFalse(set.contains(2)); + assertTrue(set.contains(3)); + assertTrue(set.isDirty()); + set.setDirty(false); + assertFalse(set.isDirty()); + set.retainAll(Set.of(1,2,3)); + assertEquals(Set.of(3), set); + assertTrue(set.addAll(List.of(1,3,4))); + assertFalse(set.addAll(List.of(1,3,4))); + assertTrue(set.removeAll(List.of(3,4))); + assertEquals(Set.of(1), set); + set.clear(); + assertTrue(set.isEmpty()); + set.addRange(1, 3); + assertEquals(Set.of(1,2), set); + } + +} diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/HeaderV1Test.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/HeaderV1Test.java index 4eb5806e..94bb60c7 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/HeaderV1Test.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/HeaderV1Test.java @@ -6,27 +6,28 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import com.iab.gpp.encoder.error.DecodingException; +import com.iab.gpp.encoder.field.HeaderV1Field; public class HeaderV1Test { @Test public void testEncode1() { HeaderV1 headerV1 = new HeaderV1(); - headerV1.setFieldValue("SectionIds", new ArrayList<>()); + headerV1.setFieldValue(HeaderV1Field.SECTION_IDS, new ArrayList<>()); Assertions.assertEquals("DBAA", headerV1.encode()); } @Test public void testEncode2() { HeaderV1 headerV1 = new HeaderV1(); - headerV1.setFieldValue("SectionIds", Arrays.asList(2)); + headerV1.setFieldValue(HeaderV1Field.SECTION_IDS, Arrays.asList(2)); Assertions.assertEquals("DBABMA", headerV1.encode()); } @Test public void testEncode3() { HeaderV1 headerV1 = new HeaderV1(); - headerV1.setFieldValue("SectionIds", Arrays.asList(2, 6)); + headerV1.setFieldValue(HeaderV1Field.SECTION_IDS, Arrays.asList(2, 6)); Assertions.assertEquals("DBACNYA", headerV1.encode()); } @@ -34,27 +35,27 @@ public void testEncode3() { public void testDecode1() { HeaderV1 headerV1 = new HeaderV1(); headerV1.decode("DBAA"); - Assertions.assertEquals(Set.of(), headerV1.getFieldValue("SectionIds")); - Assertions.assertEquals(headerV1.getFieldValue("Version"), headerV1.getVersion()); - Assertions.assertEquals(headerV1.getFieldValue("SectionIds"), headerV1.getSectionsIds()); + Assertions.assertEquals(Set.of(), headerV1.getFieldValue(HeaderV1Field.SECTION_IDS)); + Assertions.assertEquals(headerV1.getFieldValue(HeaderV1Field.VERSION), headerV1.getVersion()); + Assertions.assertEquals(headerV1.getFieldValue(HeaderV1Field.SECTION_IDS), headerV1.getSectionsIds()); } @Test public void testDecode2() { HeaderV1 headerV1 = new HeaderV1(); headerV1.decode("DBABMA"); - Assertions.assertEquals(Set.of(2), headerV1.getFieldValue("SectionIds")); - Assertions.assertEquals(headerV1.getFieldValue("Version"), headerV1.getVersion()); - Assertions.assertEquals(headerV1.getFieldValue("SectionIds"), headerV1.getSectionsIds()); + Assertions.assertEquals(Set.of(2), headerV1.getFieldValue(HeaderV1Field.SECTION_IDS)); + Assertions.assertEquals(headerV1.getFieldValue(HeaderV1Field.VERSION), headerV1.getVersion()); + Assertions.assertEquals(headerV1.getFieldValue(HeaderV1Field.SECTION_IDS), headerV1.getSectionsIds()); } @Test public void testDecode3() { HeaderV1 headerV1 = new HeaderV1(); headerV1.decode("DBACNYA"); - Assertions.assertEquals(Set.of(2, 6), headerV1.getFieldValue("SectionIds")); - Assertions.assertEquals(headerV1.getFieldValue("Version"), headerV1.getVersion()); - Assertions.assertEquals(headerV1.getFieldValue("SectionIds"), headerV1.getSectionsIds()); + Assertions.assertEquals(Set.of(2, 6), headerV1.getFieldValue(HeaderV1Field.SECTION_IDS)); + Assertions.assertEquals(headerV1.getFieldValue(HeaderV1Field.VERSION), headerV1.getVersion()); + Assertions.assertEquals(headerV1.getFieldValue(HeaderV1Field.SECTION_IDS), headerV1.getSectionsIds()); } @Test() diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/TcfEuV2Test.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/TcfEuV2Test.java index 94bf7ba3..dda55beb 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/TcfEuV2Test.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/TcfEuV2Test.java @@ -148,22 +148,22 @@ public void testDecode3() { "CPcqBNJPcqBNJNwAAAENAwCAAAAAAAAAAAAAAAAAAAAA.YAAAAAAAAAA.QGLtV_T9fb2vj-_Z99_tkeYwf95y3p-wzhheMs-8NyZeH_B4Wv2MyvBX4JiQKGRgksjLBAQdtHGlcTQgBwIlViTLMYk2MjzNKJrJEilsbO2dYGD9Pn8HT3ZCY70-vv__7v3ff_3g.IGLtV_T9fb2vj-_Z99_tkeYwf95y3p-wzhheMs-8NyZeH_B4Wv2MyvBX4JiQKGRgksjLBAQdtHGlcTQgBwIlViTLMYk2MjzNKJrJEilsbO2dYGD9Pn8HT3ZCY70-vv__7v3ff_3g"); - Assertions.assertEquals(2, tcfEuV2.getFieldValue("Version")); - Assertions.assertEquals(880, tcfEuV2.getFieldValue("CmpId")); - Assertions.assertEquals(0, tcfEuV2.getFieldValue("CmpVersion")); - Assertions.assertEquals(0, tcfEuV2.getFieldValue("ConsentScreen")); - Assertions.assertEquals("EN", tcfEuV2.getFieldValue("ConsentLanguage")); - Assertions.assertEquals(48, tcfEuV2.getFieldValue("VendorListVersion")); - Assertions.assertEquals(2, tcfEuV2.getFieldValue("PolicyVersion")); - Assertions.assertEquals(false, tcfEuV2.getFieldValue("IsServiceSpecific")); - Assertions.assertEquals(false, tcfEuV2.getFieldValue("UseNonStandardStacks")); - Assertions.assertEquals(false, tcfEuV2.getFieldValue("PurposeOneTreatment")); - Assertions.assertEquals("AA", tcfEuV2.getFieldValue("PublisherCountryCode")); - - Assertions.assertEquals(3, tcfEuV2.getFieldValue("PublisherPurposesSegmentType")); - - Assertions.assertEquals(2, tcfEuV2.getFieldValue("VendorsAllowedSegmentType")); - List vendorsAllowed = new ArrayList<>((IntegerSet) tcfEuV2.getFieldValue("VendorsAllowed")); + Assertions.assertEquals(2, tcfEuV2.getFieldValue(TcfEuV2Field.VERSION)); + Assertions.assertEquals(880, tcfEuV2.getFieldValue(TcfEuV2Field.CMP_ID)); + Assertions.assertEquals(0, tcfEuV2.getFieldValue(TcfEuV2Field.CMP_VERSION)); + Assertions.assertEquals(0, tcfEuV2.getFieldValue(TcfEuV2Field.CONSENT_SCREEN)); + Assertions.assertEquals("EN", tcfEuV2.getFieldValue(TcfEuV2Field.CONSENT_LANGUAGE)); + Assertions.assertEquals(48, tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_LIST_VERSION)); + Assertions.assertEquals(2, tcfEuV2.getFieldValue(TcfEuV2Field.POLICY_VERSION)); + Assertions.assertEquals(false, tcfEuV2.getFieldValue(TcfEuV2Field.IS_SERVICE_SPECIFIC)); + Assertions.assertEquals(false, tcfEuV2.getFieldValue(TcfEuV2Field.USE_NON_STANDARD_STACKS)); + Assertions.assertEquals(false, tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_ONE_TREATMENT)); + Assertions.assertEquals("AA", tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); + + Assertions.assertEquals(3, tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_PURPOSES_SEGMENT_TYPE)); + + Assertions.assertEquals(2, tcfEuV2.getFieldValue(TcfEuV2Field.VENDORS_ALLOWED_SEGMENT_TYPE)); + List vendorsAllowed = new ArrayList<>((IntegerSet) tcfEuV2.getFieldValue(TcfEuV2Field.VENDORS_ALLOWED)); Assertions.assertEquals(434, vendorsAllowed.size()); Assertions.assertEquals(1, vendorsAllowed.get(0)); Assertions.assertEquals(2, vendorsAllowed.get(1)); @@ -185,8 +185,8 @@ public void testDecode3() { Assertions.assertEquals(790, vendorsAllowed.get(vendorsAllowed.size() - 2)); Assertions.assertEquals(791, vendorsAllowed.get(vendorsAllowed.size() - 1)); - Assertions.assertEquals(1, tcfEuV2.getFieldValue("VendorsDisclosedSegmentType")); - List vendorsDisclosed = new ArrayList<>((IntegerSet) tcfEuV2.getFieldValue("VendorsDisclosed")); + Assertions.assertEquals(1, tcfEuV2.getFieldValue(TcfEuV2Field.VENDORS_DISCLOSED_SEGMENT_TYPE)); + List vendorsDisclosed = new ArrayList<>((IntegerSet) tcfEuV2.getFieldValue(TcfEuV2Field.VENDORS_DISCLOSED)); Assertions.assertEquals(434, vendorsDisclosed.size()); Assertions.assertEquals(1, vendorsDisclosed.get(0)); Assertions.assertEquals(2, vendorsDisclosed.get(1)); @@ -208,40 +208,40 @@ public void testDecode3() { Assertions.assertEquals(790, vendorsDisclosed.get(vendorsDisclosed.size() - 2)); Assertions.assertEquals(791, vendorsDisclosed.get(vendorsDisclosed.size() - 1)); - Assertions.assertEquals(tcfEuV2.getFieldValue("Version"), tcfEuV2.getVersion()); - Assertions.assertEquals(tcfEuV2.getFieldValue("Created"), tcfEuV2.getCreated()); - Assertions.assertEquals(tcfEuV2.getFieldValue("LastUpdated"), tcfEuV2.getLastUpdated()); - Assertions.assertEquals(tcfEuV2.getFieldValue("CmpId"), tcfEuV2.getCmpId()); - Assertions.assertEquals(tcfEuV2.getFieldValue("CmpVersion"), tcfEuV2.getCmpVersion()); - Assertions.assertEquals(tcfEuV2.getFieldValue("ConsentScreen"), tcfEuV2.getConsentScreen()); - Assertions.assertEquals(tcfEuV2.getFieldValue("ConsentLanguage"), tcfEuV2.getConsentLanguage()); - Assertions.assertEquals(tcfEuV2.getFieldValue("VendorListVersion"), tcfEuV2.getVendorListVersion()); - Assertions.assertEquals(tcfEuV2.getFieldValue("PolicyVersion"), tcfEuV2.getPolicyVersion()); - Assertions.assertEquals(tcfEuV2.getFieldValue("IsServiceSpecific"), tcfEuV2.getIsServiceSpecific()); - Assertions.assertEquals(tcfEuV2.getFieldValue("UseNonStandardStacks"), tcfEuV2.getUseNonStandardStacks()); - Assertions.assertEquals(tcfEuV2.getFieldValue("SpecialFeatureOptins"), tcfEuV2.getSpecialFeatureOptins()); - Assertions.assertEquals(tcfEuV2.getFieldValue("PurposeConsents"), tcfEuV2.getPurposeConsents()); - Assertions.assertEquals(tcfEuV2.getFieldValue("PurposeLegitimateInterests"), + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.VERSION), tcfEuV2.getVersion()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.CREATED), tcfEuV2.getCreated()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.LAST_UPDATED), tcfEuV2.getLastUpdated()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.CMP_ID), tcfEuV2.getCmpId()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.CMP_VERSION), tcfEuV2.getCmpVersion()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.CONSENT_SCREEN), tcfEuV2.getConsentScreen()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.CONSENT_LANGUAGE), tcfEuV2.getConsentLanguage()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_LIST_VERSION), tcfEuV2.getVendorListVersion()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.POLICY_VERSION), tcfEuV2.getPolicyVersion()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.IS_SERVICE_SPECIFIC), tcfEuV2.getIsServiceSpecific()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.USE_NON_STANDARD_STACKS), tcfEuV2.getUseNonStandardStacks()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.SPECIAL_FEATURE_OPTINS), tcfEuV2.getSpecialFeatureOptins()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_CONSENTS), tcfEuV2.getPurposeConsents()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_LEGITIMATE_INTERESTS), tcfEuV2.getPurposeLegitimateInterests()); - Assertions.assertEquals(tcfEuV2.getFieldValue("PurposeOneTreatment"), tcfEuV2.getPurposeOneTreatment()); - Assertions.assertEquals(tcfEuV2.getFieldValue("PublisherCountryCode"), tcfEuV2.getPublisherCountryCode()); - Assertions.assertEquals(tcfEuV2.getFieldValue("VendorConsents"), tcfEuV2.getVendorConsents()); - Assertions.assertEquals(tcfEuV2.getFieldValue("VendorLegitimateInterests"), tcfEuV2.getVendorLegitimateInterests()); - Assertions.assertEquals(tcfEuV2.getFieldValue("PublisherRestrictions"), tcfEuV2.getPublisherRestrictions()); - Assertions.assertEquals(tcfEuV2.getFieldValue("PublisherPurposesSegmentType"), + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_ONE_TREATMENT), tcfEuV2.getPurposeOneTreatment()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_COUNTRY_CODE), tcfEuV2.getPublisherCountryCode()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_CONSENTS), tcfEuV2.getVendorConsents()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_LEGITIMATE_INTERESTS), tcfEuV2.getVendorLegitimateInterests()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_RESTRICTIONS), tcfEuV2.getPublisherRestrictions()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_PURPOSES_SEGMENT_TYPE), tcfEuV2.getPublisherPurposesSegmentType()); - Assertions.assertEquals(tcfEuV2.getFieldValue("PublisherConsents"), tcfEuV2.getPublisherConsents()); - Assertions.assertEquals(tcfEuV2.getFieldValue("PublisherLegitimateInterests"), + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_CONSENTS), tcfEuV2.getPublisherConsents()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_LEGITIMATE_INTERESTS), tcfEuV2.getPublisherLegitimateInterests()); - Assertions.assertEquals(tcfEuV2.getFieldValue("NumCustomPurposes"), tcfEuV2.getNumCustomPurposes()); - Assertions.assertEquals(tcfEuV2.getFieldValue("PublisherCustomConsents"), tcfEuV2.getPublisherCustomConsents()); - Assertions.assertEquals(tcfEuV2.getFieldValue("PublisherCustomLegitimateInterests"), + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.NUM_CUSTOM_PURPOSES), tcfEuV2.getNumCustomPurposes()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_CUSTOM_CONSENTS), tcfEuV2.getPublisherCustomConsents()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_CUSTOM_LEGITIMATE_INTERESTS), tcfEuV2.getPublisherCustomLegitimateInterests()); - Assertions.assertEquals(tcfEuV2.getFieldValue("VendorsAllowedSegmentType"), tcfEuV2.getVendorsAllowedSegmentType()); - Assertions.assertEquals(tcfEuV2.getFieldValue("VendorsAllowed"), tcfEuV2.getVendorsAllowed()); - Assertions.assertEquals(tcfEuV2.getFieldValue("VendorsDisclosedSegmentType"), + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.VENDORS_ALLOWED_SEGMENT_TYPE), tcfEuV2.getVendorsAllowedSegmentType()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.VENDORS_ALLOWED), tcfEuV2.getVendorsAllowed()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.VENDORS_DISCLOSED_SEGMENT_TYPE), tcfEuV2.getVendorsDisclosedSegmentType()); - Assertions.assertEquals(tcfEuV2.getFieldValue("VendorsDisclosed"), tcfEuV2.getVendorsDisclosed()); + Assertions.assertEquals(tcfEuV2.getFieldValue(TcfEuV2Field.VENDORS_DISCLOSED), tcfEuV2.getVendorsDisclosed()); } @Test @@ -249,33 +249,33 @@ public void testDecode4() { TcfEuV2 tcfEuV2 = new TcfEuV2( "CPi8wgAPi8wgAAOACBENCuCoAP_AAEfAACiQJHNd_H__bX9n-f7_6ft0eY1f9_r37uQzDhfNk-8F3L_W_LwX_2E7NF36tq4KmR4ku1LBIUNtHMnUDUmxaokVrzHsak2cpzNKJ_BkknsZe2dYGF9vm5tj-QKZ7_5_d3f52T_9_9v-39z33913v3d93-_13LjdV5_9H_v9fR_b8_Kf9_5-_4v8_____3_e______8AEEggCTDVuIAuxLHAm0DCKBECMKwkKoFABBQDC0QGADg4KdlYBPrCBAAgFAEYEQIcAUYEAgAAAgCQiACQIsEAAAIgEAAIAEQiEABAwCCgAsDAIAAQDQMUQoABAkIMiAiKUwICIEggJbKhBKC6Q0wgCrLACgkRsFAAiAAAUgACAsHAMESAlYsECTFG-QAjBCgFEqFaAGGgAwABBI4RABgACCRwqADAAEEjgA"); - Assertions.assertEquals(2, tcfEuV2.getFieldValue("Version")); - Assertions.assertEquals(14, tcfEuV2.getFieldValue("CmpId")); - Assertions.assertEquals(2, tcfEuV2.getFieldValue("CmpVersion")); - Assertions.assertEquals(1, tcfEuV2.getFieldValue("ConsentScreen")); - Assertions.assertEquals("EN", tcfEuV2.getFieldValue("ConsentLanguage")); - Assertions.assertEquals(174, tcfEuV2.getFieldValue("VendorListVersion")); - Assertions.assertEquals(2, tcfEuV2.getFieldValue("PolicyVersion")); - Assertions.assertEquals(true, tcfEuV2.getFieldValue("IsServiceSpecific")); - Assertions.assertEquals(false, tcfEuV2.getFieldValue("UseNonStandardStacks")); + Assertions.assertEquals(2, tcfEuV2.getFieldValue(TcfEuV2Field.VERSION)); + Assertions.assertEquals(14, tcfEuV2.getFieldValue(TcfEuV2Field.CMP_ID)); + Assertions.assertEquals(2, tcfEuV2.getFieldValue(TcfEuV2Field.CMP_VERSION)); + Assertions.assertEquals(1, tcfEuV2.getFieldValue(TcfEuV2Field.CONSENT_SCREEN)); + Assertions.assertEquals("EN", tcfEuV2.getFieldValue(TcfEuV2Field.CONSENT_LANGUAGE)); + Assertions.assertEquals(174, tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_LIST_VERSION)); + Assertions.assertEquals(2, tcfEuV2.getFieldValue(TcfEuV2Field.POLICY_VERSION)); + Assertions.assertEquals(true, tcfEuV2.getFieldValue(TcfEuV2Field.IS_SERVICE_SPECIFIC)); + Assertions.assertEquals(false, tcfEuV2.getFieldValue(TcfEuV2Field.USE_NON_STANDARD_STACKS)); Assertions.assertEquals( Set.of(1), - tcfEuV2.getFieldValue("SpecialFeatureOptins")); + tcfEuV2.getFieldValue(TcfEuV2Field.SPECIAL_FEATURE_OPTINS)); Assertions .assertEquals( Set.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), - tcfEuV2.getFieldValue("PurposeConsents")); + tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_CONSENTS)); Assertions.assertEquals( Set.of(2, 6, 7, 8, 9, 10), - tcfEuV2.getFieldValue("PurposeLegitimateInterests")); + tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_LEGITIMATE_INTERESTS)); - Assertions.assertEquals(false, tcfEuV2.getFieldValue("PurposeOneTreatment")); - Assertions.assertEquals("US", tcfEuV2.getFieldValue("PublisherCountryCode")); + Assertions.assertEquals(false, tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_ONE_TREATMENT)); + Assertions.assertEquals("US", tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); - Assertions.assertEquals(772, ((IntegerSet) tcfEuV2.getFieldValue("VendorConsents")).size()); + Assertions.assertEquals(772, ((IntegerSet) tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_CONSENTS)).size()); - Assertions.assertEquals(280, ((IntegerSet) tcfEuV2.getFieldValue("VendorLegitimateInterests")).size()); + Assertions.assertEquals(280, ((IntegerSet) tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_LEGITIMATE_INTERESTS)).size()); } @Test @@ -283,67 +283,67 @@ public void testDecode5() { TcfEuV2 tcfEuV2 = new TcfEuV2( "CPgA5EAPgA5EAAOACBENCuCoAP_AAEfAACiQI0Nd_H__bX9n-f7_6Pt0cY1f9_r3ruQzDhfFk-8F3L_W3LwX32E7NF36pq4KmR4ku1LBIQFtHMnUDUmxaokVrzHsak2cpyNKI7BkknsZe2dYGF9Pm5lD-QKZ7_5_d3f52T_9_9v-39z339V3v3d93-_12PjdV599H_v9fR_b8_Kf9_5-_4v8___4IQAAAAQQ_AJMNW4gC7EscCbQMIoAQIwrCQqAUAEFAMLRAYAODgpmVgEusIEACAUARgRAhxBRgQCAAACAJCIAJAiwQAIAiAQAAgARAIQAEDAIKACwMAgABANAxACgAECQgyICIpTAgIgSCAlsqEEoKpDTCAKssAKARGwUACIAABSAAICwcAwRICViwQJMUbwAw0AGAAIJHCIAMAAQSOFQAYAAgkcA"); - Assertions.assertEquals(2, tcfEuV2.getFieldValue("Version")); - Assertions.assertEquals(14, tcfEuV2.getFieldValue("CmpId")); - Assertions.assertEquals(2, tcfEuV2.getFieldValue("CmpVersion")); - Assertions.assertEquals(1, tcfEuV2.getFieldValue("ConsentScreen")); - Assertions.assertEquals("EN", tcfEuV2.getFieldValue("ConsentLanguage")); - Assertions.assertEquals(174, tcfEuV2.getFieldValue("VendorListVersion")); - Assertions.assertEquals(2, tcfEuV2.getFieldValue("PolicyVersion")); - Assertions.assertEquals(true, tcfEuV2.getFieldValue("IsServiceSpecific")); - Assertions.assertEquals(false, tcfEuV2.getFieldValue("UseNonStandardStacks")); + Assertions.assertEquals(2, tcfEuV2.getFieldValue(TcfEuV2Field.VERSION)); + Assertions.assertEquals(14, tcfEuV2.getFieldValue(TcfEuV2Field.CMP_ID)); + Assertions.assertEquals(2, tcfEuV2.getFieldValue(TcfEuV2Field.CMP_VERSION)); + Assertions.assertEquals(1, tcfEuV2.getFieldValue(TcfEuV2Field.CONSENT_SCREEN)); + Assertions.assertEquals("EN", tcfEuV2.getFieldValue(TcfEuV2Field.CONSENT_LANGUAGE)); + Assertions.assertEquals(174, tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_LIST_VERSION)); + Assertions.assertEquals(2, tcfEuV2.getFieldValue(TcfEuV2Field.POLICY_VERSION)); + Assertions.assertEquals(true, tcfEuV2.getFieldValue(TcfEuV2Field.IS_SERVICE_SPECIFIC)); + Assertions.assertEquals(false, tcfEuV2.getFieldValue(TcfEuV2Field.USE_NON_STANDARD_STACKS)); Assertions.assertEquals( Set.of(1), - tcfEuV2.getFieldValue("SpecialFeatureOptins")); + tcfEuV2.getFieldValue(TcfEuV2Field.SPECIAL_FEATURE_OPTINS)); Assertions .assertEquals( Set.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), - tcfEuV2.getFieldValue("PurposeConsents")); + tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_CONSENTS)); Assertions.assertEquals( Set.of(2, 6, 7, 8, 9, 10), - tcfEuV2.getFieldValue("PurposeLegitimateInterests")); + tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_LEGITIMATE_INTERESTS)); - Assertions.assertEquals(false, tcfEuV2.getFieldValue("PurposeOneTreatment")); - Assertions.assertEquals("US", tcfEuV2.getFieldValue("PublisherCountryCode")); + Assertions.assertEquals(false, tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_ONE_TREATMENT)); + Assertions.assertEquals("US", tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); - Assertions.assertEquals(693, ((IntegerSet) tcfEuV2.getFieldValue("VendorConsents")).size()); + Assertions.assertEquals(693, ((IntegerSet) tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_CONSENTS)).size()); - Assertions.assertEquals(254, ((IntegerSet) tcfEuV2.getFieldValue("VendorLegitimateInterests")).size()); + Assertions.assertEquals(254, ((IntegerSet) tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_LEGITIMATE_INTERESTS)).size()); } @Test public void testDecode6() { TcfEuV2 tcfEuV2 = new TcfEuV2("COv_eg6Ov_eg6AOADBENAaCgAP_AAH_AACiQAVEUQQoAIQAqIoghAAQgAA.YAAAAAAAAAAAAAAAAAA"); - Assertions.assertEquals(2, tcfEuV2.getFieldValue("Version")); - Assertions.assertEquals(14, tcfEuV2.getFieldValue("CmpId")); - Assertions.assertEquals(3, tcfEuV2.getFieldValue("CmpVersion")); - Assertions.assertEquals(1, tcfEuV2.getFieldValue("ConsentScreen")); - Assertions.assertEquals("EN", tcfEuV2.getFieldValue("ConsentLanguage")); - Assertions.assertEquals(26, tcfEuV2.getFieldValue("VendorListVersion")); - Assertions.assertEquals(2, tcfEuV2.getFieldValue("PolicyVersion")); - Assertions.assertEquals(true, tcfEuV2.getFieldValue("IsServiceSpecific")); - Assertions.assertEquals(false, tcfEuV2.getFieldValue("UseNonStandardStacks")); + Assertions.assertEquals(2, tcfEuV2.getFieldValue(TcfEuV2Field.VERSION)); + Assertions.assertEquals(14, tcfEuV2.getFieldValue(TcfEuV2Field.CMP_ID)); + Assertions.assertEquals(3, tcfEuV2.getFieldValue(TcfEuV2Field.CMP_VERSION)); + Assertions.assertEquals(1, tcfEuV2.getFieldValue(TcfEuV2Field.CONSENT_SCREEN)); + Assertions.assertEquals("EN", tcfEuV2.getFieldValue(TcfEuV2Field.CONSENT_LANGUAGE)); + Assertions.assertEquals(26, tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_LIST_VERSION)); + Assertions.assertEquals(2, tcfEuV2.getFieldValue(TcfEuV2Field.POLICY_VERSION)); + Assertions.assertEquals(true, tcfEuV2.getFieldValue(TcfEuV2Field.IS_SERVICE_SPECIFIC)); + Assertions.assertEquals(false, tcfEuV2.getFieldValue(TcfEuV2Field.USE_NON_STANDARD_STACKS)); Assertions.assertEquals( Set.of(), - tcfEuV2.getFieldValue("SpecialFeatureOptins")); + tcfEuV2.getFieldValue(TcfEuV2Field.SPECIAL_FEATURE_OPTINS)); Assertions .assertEquals( Set.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), - tcfEuV2.getFieldValue("PurposeConsents")); + tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_CONSENTS)); Assertions.assertEquals( Set.of(2, 3, 4, 5, 6, 7, 8, 9, 10), - tcfEuV2.getFieldValue("PurposeLegitimateInterests")); + tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_LEGITIMATE_INTERESTS)); - Assertions.assertEquals(false, tcfEuV2.getFieldValue("PurposeOneTreatment")); - Assertions.assertEquals("US", tcfEuV2.getFieldValue("PublisherCountryCode")); + Assertions.assertEquals(false, tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_ONE_TREATMENT)); + Assertions.assertEquals("US", tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); - Assertions.assertEquals(Set.of(2, 6, 8, 12, 18, 23, 25, 37, 42), tcfEuV2.getFieldValue("VendorConsents")); + Assertions.assertEquals(Set.of(2, 6, 8, 12, 18, 23, 25, 37, 42), tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_CONSENTS)); Assertions.assertEquals(Set.of(2, 6, 8, 12, 18, 23, 37, 42), - tcfEuV2.getFieldValue("VendorLegitimateInterests")); + tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_LEGITIMATE_INTERESTS)); } @SuppressWarnings("unchecked") @@ -351,38 +351,38 @@ public void testDecode6() { public void testDecode7() throws DecodingException { TcfEuV2 tcfEuV2 = new TcfEuV2("COoC-kUOoC-kUAHABAENAwCoAIAAAELAAAwIF5wAoAAgAGAvMACX_ABBAAQAFA"); - Assertions.assertEquals(2, tcfEuV2.getFieldValue("Version")); - Assertions.assertEquals("2019-10-07T05:17:54Z", tcfEuV2.getFieldValue("Created").toString()); - Assertions.assertEquals("2019-10-07T05:17:54Z", tcfEuV2.getFieldValue("LastUpdated").toString()); - Assertions.assertEquals(7, tcfEuV2.getFieldValue("CmpId")); - Assertions.assertEquals(1, tcfEuV2.getFieldValue("CmpVersion")); - Assertions.assertEquals(0, tcfEuV2.getFieldValue("ConsentScreen")); - Assertions.assertEquals("EN", tcfEuV2.getFieldValue("ConsentLanguage")); - Assertions.assertEquals(48, tcfEuV2.getFieldValue("VendorListVersion")); - Assertions.assertEquals(2, tcfEuV2.getFieldValue("PolicyVersion")); - Assertions.assertEquals(true, tcfEuV2.getFieldValue("IsServiceSpecific")); - Assertions.assertEquals(false, tcfEuV2.getFieldValue("UseNonStandardStacks")); + Assertions.assertEquals(2, tcfEuV2.getFieldValue(TcfEuV2Field.VERSION)); + Assertions.assertEquals("2019-10-07T05:17:54Z", tcfEuV2.getFieldValue(TcfEuV2Field.CREATED).toString()); + Assertions.assertEquals("2019-10-07T05:17:54Z", tcfEuV2.getFieldValue(TcfEuV2Field.LAST_UPDATED).toString()); + Assertions.assertEquals(7, tcfEuV2.getFieldValue(TcfEuV2Field.CMP_ID)); + Assertions.assertEquals(1, tcfEuV2.getFieldValue(TcfEuV2Field.CMP_VERSION)); + Assertions.assertEquals(0, tcfEuV2.getFieldValue(TcfEuV2Field.CONSENT_SCREEN)); + Assertions.assertEquals("EN", tcfEuV2.getFieldValue(TcfEuV2Field.CONSENT_LANGUAGE)); + Assertions.assertEquals(48, tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_LIST_VERSION)); + Assertions.assertEquals(2, tcfEuV2.getFieldValue(TcfEuV2Field.POLICY_VERSION)); + Assertions.assertEquals(true, tcfEuV2.getFieldValue(TcfEuV2Field.IS_SERVICE_SPECIFIC)); + Assertions.assertEquals(false, tcfEuV2.getFieldValue(TcfEuV2Field.USE_NON_STANDARD_STACKS)); Assertions.assertEquals( Set.of(1), - tcfEuV2.getFieldValue("SpecialFeatureOptins")); + tcfEuV2.getFieldValue(TcfEuV2Field.SPECIAL_FEATURE_OPTINS)); Assertions.assertEquals( Set.of(1), - tcfEuV2.getFieldValue("PurposeConsents")); + tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_CONSENTS)); Assertions.assertEquals( Set.of(2, 7, 9, 10), - tcfEuV2.getFieldValue("PurposeLegitimateInterests")); + tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_LEGITIMATE_INTERESTS)); - Assertions.assertEquals(false, tcfEuV2.getFieldValue("PurposeOneTreatment")); - Assertions.assertEquals("GB", tcfEuV2.getFieldValue("PublisherCountryCode")); + Assertions.assertEquals(false, tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_ONE_TREATMENT)); + Assertions.assertEquals("GB", tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); - Assertions.assertEquals(Set.of(1, 2, 3, 755), tcfEuV2.getFieldValue("VendorConsents")); + Assertions.assertEquals(Set.of(1, 2, 3, 755), tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_CONSENTS)); Assertions.assertEquals(Set.of(1, 2, 3, 4, 5, 6, 7, 8, 9), - tcfEuV2.getFieldValue("VendorLegitimateInterests")); + tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_LEGITIMATE_INTERESTS)); - Assertions.assertEquals(1, ((List)tcfEuV2.getFieldValue("PublisherRestrictions")).size()); - RangeEntry rangeEntry = ((List)tcfEuV2.getFieldValue("PublisherRestrictions")).get(0); + Assertions.assertEquals(1, ((List)tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_RESTRICTIONS)).size()); + RangeEntry rangeEntry = ((List)tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_RESTRICTIONS)).get(0); Assertions.assertEquals(1, rangeEntry.getKey()); Assertions.assertEquals(0, rangeEntry.getType()); Assertions.assertEquals(Set.of(10), rangeEntry.getIds()); diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UspV1Test.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UspV1Test.java index ffc7e741..126b9b57 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UspV1Test.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UspV1Test.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.InvalidFieldException; +import com.iab.gpp.encoder.field.UspV1Field; public class UspV1Test { @@ -16,9 +17,9 @@ public void testEncode1() { @Test public void testEncode2() { UspV1 uspv1 = new UspV1(); - uspv1.setFieldValue("Notice", 'Y'); - uspv1.setFieldValue("OptOutSale", 'N'); - uspv1.setFieldValue("LspaCovered", 'N'); + uspv1.setFieldValue(UspV1Field.NOTICE, 'Y'); + uspv1.setFieldValue(UspV1Field.OPT_OUT_SALE, 'N'); + uspv1.setFieldValue(UspV1Field.LSPA_COVERED, 'N'); Assertions.assertEquals("1YNN", uspv1.encode()); } @@ -26,10 +27,10 @@ public void testEncode2() { @Test public void testEncode3() { UspV1 uspv1 = new UspV1(); - uspv1.setFieldValue("Version", 2); - uspv1.setFieldValue("Notice", 'N'); - uspv1.setFieldValue("OptOutSale", 'Y'); - uspv1.setFieldValue("LspaCovered", 'Y'); + uspv1.setFieldValue(UspV1Field.VERSION, 2); + uspv1.setFieldValue(UspV1Field.NOTICE, 'N'); + uspv1.setFieldValue(UspV1Field.OPT_OUT_SALE, 'Y'); + uspv1.setFieldValue(UspV1Field.LSPA_COVERED, 'Y'); Assertions.assertEquals("2NYY", uspv1.encode()); } @@ -37,29 +38,29 @@ public void testEncode3() { @Test public void testDecode1() throws DecodingException, InvalidFieldException { UspV1 uspv1 = new UspV1("1NYN"); - Assertions.assertEquals(1, uspv1.getFieldValue("Version")); - Assertions.assertEquals('N', uspv1.getFieldValue("Notice")); - Assertions.assertEquals('Y', uspv1.getFieldValue("OptOutSale")); - Assertions.assertEquals('N', uspv1.getFieldValue("LspaCovered")); + Assertions.assertEquals(1, uspv1.getFieldValue(UspV1Field.VERSION)); + Assertions.assertEquals('N', uspv1.getFieldValue(UspV1Field.NOTICE)); + Assertions.assertEquals('Y', uspv1.getFieldValue(UspV1Field.OPT_OUT_SALE)); + Assertions.assertEquals('N', uspv1.getFieldValue(UspV1Field.LSPA_COVERED)); - Assertions.assertEquals(uspv1.getFieldValue("Version"), uspv1.getVersion()); - Assertions.assertEquals(uspv1.getFieldValue("Notice"), uspv1.getNotice()); - Assertions.assertEquals(uspv1.getFieldValue("OptOutSale"), uspv1.getOptOutSale()); - Assertions.assertEquals(uspv1.getFieldValue("LspaCovered"), uspv1.getLspaCovered()); + Assertions.assertEquals(uspv1.getFieldValue(UspV1Field.VERSION), uspv1.getVersion()); + Assertions.assertEquals(uspv1.getFieldValue(UspV1Field.NOTICE), uspv1.getNotice()); + Assertions.assertEquals(uspv1.getFieldValue(UspV1Field.OPT_OUT_SALE), uspv1.getOptOutSale()); + Assertions.assertEquals(uspv1.getFieldValue(UspV1Field.LSPA_COVERED), uspv1.getLspaCovered()); } @Test public void testDecode2() throws DecodingException, InvalidFieldException { UspV1 uspv1 = new UspV1("1YNY"); - Assertions.assertEquals(1, uspv1.getFieldValue("Version")); - Assertions.assertEquals('Y', uspv1.getFieldValue("Notice")); - Assertions.assertEquals('N', uspv1.getFieldValue("OptOutSale")); - Assertions.assertEquals('Y', uspv1.getFieldValue("LspaCovered")); + Assertions.assertEquals(1, uspv1.getFieldValue(UspV1Field.VERSION)); + Assertions.assertEquals('Y', uspv1.getFieldValue(UspV1Field.NOTICE)); + Assertions.assertEquals('N', uspv1.getFieldValue(UspV1Field.OPT_OUT_SALE)); + Assertions.assertEquals('Y', uspv1.getFieldValue(UspV1Field.LSPA_COVERED)); - Assertions.assertEquals(uspv1.getFieldValue("Version"), uspv1.getVersion()); - Assertions.assertEquals(uspv1.getFieldValue("Notice"), uspv1.getNotice()); - Assertions.assertEquals(uspv1.getFieldValue("OptOutSale"), uspv1.getOptOutSale()); - Assertions.assertEquals(uspv1.getFieldValue("LspaCovered"), uspv1.getLspaCovered()); + Assertions.assertEquals(uspv1.getFieldValue(UspV1Field.VERSION), uspv1.getVersion()); + Assertions.assertEquals(uspv1.getFieldValue(UspV1Field.NOTICE), uspv1.getNotice()); + Assertions.assertEquals(uspv1.getFieldValue(UspV1Field.OPT_OUT_SALE), uspv1.getOptOutSale()); + Assertions.assertEquals(uspv1.getFieldValue(UspV1Field.LSPA_COVERED), uspv1.getLspaCovered()); } }