diff --git a/README.md b/README.md index b4c3ee2b..ff5e524b 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ The official iabgpp java library is distributed through maven central. Please [s #### Decoding -``` +```xml com.iabgpp iabgpp-encoder @@ -37,7 +37,7 @@ Integer uspV1Notice = uspV1Section.getNotice(); #### Encoding -``` +```xml com.iabgpp iabgpp-encoder @@ -45,7 +45,7 @@ Integer uspV1Notice = uspV1Section.getNotice(); ``` -``` +```java import com.iab.gpp.encoder.GppModel; import com.iab.gpp.encoder.section.TcfEuV2; import com.iab.gpp.encoder.section.UspV1; @@ -76,7 +76,7 @@ String gppString = gppModel.encode(); The `iabgpp-extras` and `iabgpp-extras-jackson` libraries provides an interface and ability to parse the GVL and CMP List respectively. The `iabgpp-extras-jackson` library uses Jackson 2.10.3 to parse the GVL and CMP List JSON. -``` +```xml com.iabgpp iabgpp-extras @@ -93,7 +93,7 @@ List respectively. The `iabgpp-extras-jackson` library uses Jackson 2.10.3 to pa Example of parsing the GVL, -``` +```java import com.iab.gpp.extras.jackson.Loader; import com.iab.gpp.extras.gvl.Gvl; @@ -104,7 +104,7 @@ Gvl gvl = loader.globalVendorList(gvlContent); Example of parsing the CMP List, -``` +```java import com.iab.gpp.extras.jackson.Loader; import com.iab.gpp.extras.cmp.CmpList; @@ -113,153 +113,6 @@ Loader loader = new Loader(); CmpList cmpList = loader.cmpList(cmpListContent); ``` -### Fields - -|Section Name|Section ID|Field|Data Type/Value| -|------------|----------|-----|---------------| -|tcfeuv2|2|Version|6 bit int. Value is 2.| -|tcfeuv2|2|Created|Datetime. Updated when fields are set| -|tcfeuv2|2|LastUpdated|Datetime. Updated when fields are set| -|tcfeuv2|2|CmpId|12 bit int| -|tcfeuv2|2|CmpVersion|12 bit int| -|tcfeuv2|2|ConsentScreen|6 bit int| -|tcfeuv2|2|ConsentLanguage|2 character country code| -|tcfeuv2|2|VendorListVersion|12 bit int| -|tcfeuv2|2|PolicyVersion|6 bit int. Value is 2| -|tcfeuv2|2|IsServiceSpecific|Boolean| -|tcfeuv2|2|UseNonStandardStacks|Boolean| -|tcfeuv2|2|SpecialFeatureOptins|Boolean list of size 12| -|tcfeuv2|2|PurposeConsents|Boolean list of size 24| -|tcfeuv2|2|PurposeLegitimateInterests|Boolean list of size 24| -|tcfeuv2|2|PurposeOneTreatment|Boolean| -|tcfeuv2|2|PublisherCountryCode|2 character country code| -|tcfeuv2|2|VendorConsents|Integer list of variable size| -|tcfeuv2|2|VendorLegitimateInterests|Integer list of variable size| -|tcfeuv2|2|PublisherRestrictions|Integer list of variable size| -|tcfeuv2|2|PublisherPurposesSegmentType|3 bit int. Value is 3| -|tcfeuv2|2|PublisherConsents|Boolean list of size 24| -|tcfeuv2|2|PublisherLegitimateInterests|Boolean list of size 24| -|tcfeuv2|2|NumCustomPurposes|6 bit int| -|tcfeuv2|2|PublisherCustomConsents|Boolean list where size is set by the NumCustomPurposes field| -|tcfeuv2|2|PublisherCustomLegitimateInterests|Boolean list where size is set by the NumCustomPurposes field| -|tcfeuv2|2|VendorsAllowedSegmentType|3 bit int. Value is 2| -|tcfeuv2|2|VendorsAllowed|Integer list of variable size| -|tcfeuv2|2|VendorsDisclosedSegmentType|3 bit int. Value is 1| -|tcfeuv2|2|VendorsDisclosed|Integer list of variable size| -|tcfcav1|5|Version|6 bit int. Value is 2.| -|tcfcav1|5|Created|Datetime. Updated when any fields are set| -|tcfcav1|5|LastUpdated|Datetime. Updated when any fields are set| -|tcfcav1|5|CmpId|12 bit int| -|tcfcav1|5|CmpVersion|12 bit int| -|tcfcav1|5|ConsentScreen|6 bit int| -|tcfcav1|5|ConsentLanguage|2 character country code| -|tcfcav1|5|VendorListVersion|12 bit int| -|tcfcav1|5|TcfPolicyVersion|6 bit int. Value is 2.| -|tcfcav1|5|UseNonStandardStacks|Boolean| -|tcfcav1|5|SpecialFeatureExpressConsent|Boolean list of size 12| -|tcfcav1|5|PurposesExpressConsent|Boolean list of size 24| -|tcfcav1|5|PurposesImpliedConsent|Boolean list of size 24| -|tcfcav1|5|VendorExpressConsent|Integer list of variable size| -|tcfcav1|5|VendorImpliedConsent|Integer list of variable size| -|tcfcav1|5|PubRestrictions|RangeEntry list of variable size| -|tcfcav1|5|PubPurposesSegmentType|3 bit int. Value is 3| -|tcfcav1|5|PubPurposesExpressConsent|Boolean list of size 24| -|tcfcav1|5|PubPurposesImpliedConsent|Boolean list of size 24| -|tcfcav1|5|NumCustomPurposes|6 bit int| -|tcfcav1|5|CustomPurposesExpressConsent|Boolean list where size is set by the NumCustomPurposes field| -|tcfcav1|5|CustomPurposesImpliedConsent|Boolean list where size is set by the NumCustomPurposes field| -|tcfcav1|5|DisclosedVendorsSegmentType|3 bit int. Value is 1| -|tcfcav1|5|DisclosedVendors|Integer list of variable size| -|uspv1|6|Version|6 bit int. Value is 1| -|uspv1|6|Notice|2 bit int| -|uspv1|6|OptOutSale|2 bit int| -|uspv1|6|LspaCovered|2 bit int| -|usnat|7|Version|6 bit int. Value is 1| -|usnat|7|SharingNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usnat|7|SaleOptOutNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usnat|7|SharingOptOutNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usnat|7|TargetedAdvertisingOptOutNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usnat|7|SensitiveDataProcessingOptOutNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usnat|7|SensitiveDataLimitUseNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usnat|7|SaleOptOut|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usnat|7|SharingOptOut|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usnat|7|TargetedAdvertisingOptOut|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usnat|7|SensitiveDataProcessing|2 bit int list of size 12. 0=Not applicable, 1=Yes, 2=No| -|usnat|7|KnownChildSensitiveDataConsents|2 bit int list of size 2. 0=Not applicable, 1=Yes, 2=No| -|usnat|7|PersonalDataConsents|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usnat|7|MspaCoveredTransaction|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usnat|7|MspaOptOutOptionMode|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usnat|7|MspaServiceProviderMode|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usnat|7|GpcSegmentType|2 bit int. Value is 1| -|usnat|7|GpcSegmentIncluded|Boolean. Default value is true| -|usnat|7|Gpc|Boolean| -|usca|8|Version|6 bit int. Value is 1| -|usca|8|SaleOptOutNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usca|8|SharingOptOutNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usca|8|SensitiveDataLimitUseNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usca|8|SaleOptOut|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usca|8|SharingOptOut|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usca|8|SensitiveDataProcessing|2 bit int list of size 9. 0=Not applicable, 1=Yes, 2=No| -|usca|8|KnownChildSensitiveDataConsents|2 bit int list of size 2. 0=Not applicable, 1=Yes, 2=No| -|usca|8|PersonalDataConsents|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usca|8|MspaCoveredTransaction|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usca|8|MspaOptOutOptionMode|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usca|8|MspaServiceProviderMode|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usca|8|GpcSegmentType|2 bit int. Value is 1| -|usca|8|GpcSegmentIncluded|Boolean. Default value is true| -|usca|8|Gpc|Boolean| -|usva|9|Version|6 bit int. Value is 1| -|usva|9|SharingNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usva|9|SaleOptOutNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usva|9|TargetedAdvertisingOptOutNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usva|9|SaleOptOut|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usva|9|TargetedAdvertisingOptOut|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usva|9|SensitiveDataProcessing|2 bit int list of size 8. 0=Not applicable, 1=Yes, 2=No| -|usva|9|KnownChildSensitiveDataConsents|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usva|9|MspaCoveredTransaction|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usva|9|MspaOptOutOptionMode|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usva|9|MspaServiceProviderMode|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usco|10|Version|6 bit int. Value is 1| -|usco|10|SharingNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usco|10|SaleOptOutNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usco|10|TargetedAdvertisingOptOutNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usco|10|SaleOptOut|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usco|10|TargetedAdvertisingOptOut|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usco|10|SensitiveDataProcessing|2 bit int list of size 7. 0=Not applicable, 1=Yes, 2=No| -|usco|10|KnownChildSensitiveDataConsents|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usco|10|MspaCoveredTransaction|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usco|10|MspaOptOutOptionMode|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usco|10|MspaServiceProviderMode|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usco|10|GpcSegmentType|2 bit int. Value is 1| -|usco|10|GpcSegmentIncluded|Boolean. Default value is true| -|usco|10|Gpc|Boolean| -|usut|11|Version|6 bit int. Value is 1| -|usut|11|SharingNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usut|11|SaleOptOutNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usut|11|TargetedAdvertisingOptOutNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usut|11|SensitiveDataProcessingOptOutNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usut|11|SaleOptOut|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usut|11|TargetedAdvertisingOptOut|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usut|11|SensitiveDataProcessing|2 bit int list of size 8. 0=Not applicable, 1=Yes, 2=No| -|usut|11|KnownChildSensitiveDataConsents|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usut|11|MspaCoveredTransaction|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usut|11|MspaOptOutOptionMode|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usut|11|MspaServiceProviderMode|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usct|12|Version|6 bit int. Value is 1| -|usct|12|SharingNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usct|12|SaleOptOutNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usct|12|TargetedAdvertisingOptOutNotice|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usct|12|SaleOptOut|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usct|12|TargetedAdvertisingOptOut|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usct|12|SensitiveDataProcessing|2 bit int list of size 8. 0=Not applicable, 1=Yes, 2=No| -|usct|12|KnownChildSensitiveDataConsents|2 bit int list of size 3. 0=Not applicable, 1=Yes, 2=No| -|usct|12|MspaCoveredTransaction|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usct|12|MspaOptOutOptionMode|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usct|12|MspaServiceProviderMode|2 bit int. 0=Not applicable, 1=Yes, 2=No| -|usct|12|GpcSegmentType|2 bit int. Value is 1| -|usct|12|GpcSegmentIncluded|Boolean. Default value is true| -|usct|12|Gpc|Boolean| - ## Contributing Here you can find the [contributing guide](CONTRIBUTING.md) to help maintain and update the library. This library is managed by the Code Libraries Subgroup of the Global Privacy Working Group at the IAB Tech Lab. To join the group, please reach out to support@iabtechlab.com. diff --git a/iabgpp-encoder/pom.xml b/iabgpp-encoder/pom.xml index 07caf281..be21aca1 100644 --- a/iabgpp-encoder/pom.xml +++ b/iabgpp-encoder/pom.xml @@ -7,7 +7,7 @@ com.iabgpp iabgpp-core - 4.0.0-RC1 + 4.0.0-SNAPSHOT iabgpp-encoder @@ -26,7 +26,22 @@ maven-surefire-plugin - 2.22.2 + + + org.jacoco + jacoco-maven-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.apache.maven.plugins + maven-source-plugin + + + com.diffplug.spotless + spotless-maven-plugin @@ -36,14 +51,6 @@ release - - org.apache.maven.plugins - maven-source-plugin - - - org.apache.maven.plugins - maven-javadoc-plugin - org.apache.maven.plugins maven-gpg-plugin 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..0a2f2941 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,11 @@ 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 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; @@ -22,6 +15,7 @@ import com.iab.gpp.encoder.section.UsDe; import com.iab.gpp.encoder.section.UsFl; import com.iab.gpp.encoder.section.UsIa; +import com.iab.gpp.encoder.section.UsMn; import com.iab.gpp.encoder.section.UsMt; import com.iab.gpp.encoder.section.UsNat; import com.iab.gpp.encoder.section.UsNe; @@ -33,122 +27,99 @@ import com.iab.gpp.encoder.section.UsUt; import com.iab.gpp.encoder.section.UsVa; import com.iab.gpp.encoder.section.UspV1; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.PrimitiveIterator; +import java.util.function.Supplier; + +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); + constructors.add(UsMn::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); + } + } -public class GppModel { - private Map sections = new HashMap<>(); - - private String encodedString; - - private boolean dirty = false; - private boolean decoded = true; + private final HashMap> sections; + private final HeaderV1 header; public GppModel() { - + // empirically, most gpp strings have around 2 sections, so pad for more + this.sections = new HashMap<>(4); + 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 +127,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,292 +140,186 @@ 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() { - return (TcfCaV1) getSection(TcfCaV1.NAME); + return (TcfCaV1) getSection(TcfCaV1.ID); } public TcfEuV2 getTcfEuV2Section() { - return (TcfEuV2) getSection(TcfEuV2.NAME); + return (TcfEuV2) getSection(TcfEuV2.ID); } public UspV1 getUspV1Section() { - return (UspV1) getSection(UspV1.NAME); + return (UspV1) getSection(UspV1.ID); } public UsNat getUsNatSection() { - return (UsNat) getSection(UsNat.NAME); + return (UsNat) getSection(UsNat.ID); } public UsCa getUsCaSection() { - return (UsCa) getSection(UsCa.NAME); + return (UsCa) getSection(UsCa.ID); } public UsVa getUsVaSection() { - return (UsVa) getSection(UsVa.NAME); + return (UsVa) getSection(UsVa.ID); } public UsCo getUsCoSection() { - return (UsCo) getSection(UsCo.NAME); + return (UsCo) getSection(UsCo.ID); } public UsUt getUsUtSection() { - return (UsUt) getSection(UsUt.NAME); + return (UsUt) getSection(UsUt.ID); } public UsCt getUsCtSection() { - return (UsCt) getSection(UsCt.NAME); + return (UsCt) getSection(UsCt.ID); } public UsFl getUsFlSection() { - return (UsFl) getSection(UsFl.NAME); + return (UsFl) getSection(UsFl.ID); } public UsMt getUsMtSection() { - return (UsMt) getSection(UsMt.NAME); + return (UsMt) getSection(UsMt.ID); } public UsOr getUsOrSection() { - return (UsOr) getSection(UsOr.NAME); + return (UsOr) getSection(UsOr.ID); } public UsTx getUsTxSection() { - return (UsTx) getSection(UsTx.NAME); + return (UsTx) getSection(UsTx.ID); } public UsDe getUsDeSection() { - return (UsDe) getSection(UsDe.NAME); + return (UsDe) getSection(UsDe.ID); } public UsIa getUsIaSection() { - return (UsIa) getSection(UsIa.NAME); + return (UsIa) getSection(UsIa.ID); } public UsNe getUsNeSection() { - return (UsNe) getSection(UsNe.NAME); + return (UsNe) getSection(UsNe.ID); } public UsNh getUsNhSection() { - return (UsNh) getSection(UsNh.NAME); + return (UsNh) getSection(UsNh.ID); } public UsNj getUsNjSection() { - return (UsNj) getSection(UsNj.NAME); + return (UsNj) getSection(UsNj.ID); } public UsTn getUsTnSection() { - return (UsTn) getSection(UsTn.NAME); + return (UsTn) getSection(UsTn.ID); } - 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; + public UsMn getUsMnSection() { + return (UsMn) getSection(UsMn.ID); } - 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()); - } - } + public List getSectionIds() { + ensureDecode(); + return new ArrayList<>(header.getSectionsIds()); + } - 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()) { + 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 +327,52 @@ 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..7e2f413f 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,66 +1,97 @@ package com.iab.gpp.encoder.base64; +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; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; +import java.util.Arrays; public abstract class AbstractBase64UrlEncoder { - protected abstract void pad(BitStringBuilder bitString); + protected abstract void pad(BitString 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 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(); + REVERSE_DICT[DICT.charAt(i)] = i; } } - public StringBuilder encode(BitStringBuilder bitStringBuilder) { - pad(bitStringBuilder); - BitString bitString = bitStringBuilder.build(); + public StringBuilder encode(BitString bitString) { + pad(bitString); int length = bitString.length(); StringBuilder str = new StringBuilder(length / BASE64_BITS); - - int index = 0; - while (index <= length - BASE64_BITS) { + while (bitString.hasRemaining()) { try { - int n = FixedIntegerEncoder.decode(bitString, index, BASE64_BITS); + int n = bitString.readInt(BASE64_BITS); str.append(DICT.charAt(n)); - index += BASE64_BITS; } catch (DecodingException e) { throw new EncodingException("Unencodable Base64Url '" + bitString + "'"); } } - return str; } 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 = b1 << 18 | b2 << 12 | b3 << 6 | b4; + words[dst++] = (byte) (bits0 >> 16); + words[dst++] = (byte) (bits0 >> 8); + words[dst++] = (byte) (bits0); } - 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 = b1 << 18 | b2 << 12 | b3 << 6 | b4; + words[dst++] = (byte) (bits0 >> 16); + words[dst++] = (byte) (bits0 >> 8); + words[dst++] = (byte) (bits0); } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/base64/CompressedBase64UrlEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/base64/CompressedBase64UrlEncoder.java index f94ceb3a..cdeff122 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/base64/CompressedBase64UrlEncoder.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/base64/CompressedBase64UrlEncoder.java @@ -1,36 +1,33 @@ package com.iab.gpp.encoder.base64; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitString; public final class CompressedBase64UrlEncoder extends AbstractBase64UrlEncoder { private static final CompressedBase64UrlEncoder instance = new CompressedBase64UrlEncoder(); - private CompressedBase64UrlEncoder() { - - } + private CompressedBase64UrlEncoder() {} public static CompressedBase64UrlEncoder getInstance() { return instance; } @Override - protected void pad(BitStringBuilder bitString) { + protected void pad(BitString bitString) { int remainder = bitString.length() % 8; - if(remainder > 0) { + if (remainder > 0) { int padding = 8 - remainder; for (int i = 0; i < padding; i++) { - bitString.append(false); + bitString.writeBoolean(false); } } remainder = bitString.length() % 6; - if(remainder > 0) { + if (remainder > 0) { int padding = 6 - remainder; for (int i = 0; i < padding; i++) { - bitString.append(false); + bitString.writeBoolean(false); } } } - } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/base64/TraditionalBase64UrlEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/base64/TraditionalBase64UrlEncoder.java index 43c8e866..a234b2b4 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/base64/TraditionalBase64UrlEncoder.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/base64/TraditionalBase64UrlEncoder.java @@ -1,28 +1,25 @@ package com.iab.gpp.encoder.base64; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; +import com.iab.gpp.encoder.bitstring.BitString; public final class TraditionalBase64UrlEncoder extends AbstractBase64UrlEncoder { private static final TraditionalBase64UrlEncoder instance = new TraditionalBase64UrlEncoder(); - private TraditionalBase64UrlEncoder() { - - } + private TraditionalBase64UrlEncoder() {} public static TraditionalBase64UrlEncoder getInstance() { return instance; } @Override - protected void pad(BitStringBuilder bitString) { + protected void pad(BitString bitString) { int remainder = bitString.length() % 24; if (remainder > 0) { int padding = 24 - remainder; for (int i = 0; i < padding; i++) { - bitString.append(false); + bitString.writeBoolean(false); } } } - } 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..4f3b6b63 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitSet.java @@ -0,0 +1,171 @@ +package com.iab.gpp.encoder.bitstring; + +import com.iab.gpp.encoder.error.DecodingException; +import java.util.Arrays; + +// a thin version of java.util.BitSet +public final class BitSet { + + private static final byte[] EMPTY = new byte[0]; + private static final int ADDRESS_BITS_PER_WORD = 3; + private static final int BITS_PER_WORD = 1 << ADDRESS_BITS_PER_WORD; + private static final int MASK = 1 << (BITS_PER_WORD - 1); + private static final int MODULO = BITS_PER_WORD - 1; + private static final int CORRECTION = Integer.SIZE - BITS_PER_WORD; + private static final int WORD_MASK = 0xff; + + private byte[] words; + + public BitSet(byte[] words) { + this.words = words; + } + + public BitSet(int initialCapacity) { + this(new byte[wordIndex(initialCapacity) + 1]); + } + + public BitSet() { + this(EMPTY); + } + + private static int wordIndex(int index) { + if (index < 0) { + throw new DecodingException("got negative word index"); + } + return index >> ADDRESS_BITS_PER_WORD; + } + + private static int wordMask(int index) { + int bit = index & MODULO; + return MASK >> bit; + } + + 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; + return (wordIndex < words.length) && (words[wordIndex] & wordMask(bitIndex)) != 0; + } + + 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) { + words[wordIndex] &= ~wordMask(bitIndex); + } + } + + 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 & MODULO; + int word = words[u] & (WORD_MASK >>> bit); + + while (true) { + word &= WORD_MASK; + if (word != 0) { + return (u * BITS_PER_WORD) + Integer.numberOfLeadingZeros(word) - CORRECTION; + } + 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); + words[wordIndex] |= wordMask(bitIndex); + } + + public boolean set(int bitIndex, boolean value) { + int wordIndex = wordIndex(bitIndex); + int wordMask = wordMask(bitIndex); + byte[] words = ensureIndex(wordIndex); + boolean prior = (words[wordIndex] & wordMask) != 0; + if (prior != value) { + if (value) { + words[wordIndex] |= wordMask; + } else { + words[wordIndex] &= ~wordMask; + } + } + return prior; + } + + public int readInt(int from, int to) { + int startWordIndex = wordIndex(from); + int startBit = from & MODULO; + int endWordIndex = wordIndex(to); + int endBit = to & MODULO; + // TODO: is this needed if the caller checks range? + byte[] words = ensureIndex(endWordIndex); + int out = 0; + for (int wordIndex = startWordIndex; wordIndex <= endWordIndex; wordIndex++) { + int word = words[wordIndex] & WORD_MASK; + if (wordIndex == startWordIndex) { + word &= WORD_MASK >>> startBit; + } + if (wordIndex == endWordIndex) { + word &= ~(WORD_MASK >> endBit); + out |= word >>> (BITS_PER_WORD - endBit); + break; + } + int remaining = to - ((wordIndex + 1) << ADDRESS_BITS_PER_WORD); + out |= word << remaining; + } + return out; + } + + public long readLong(int from, int to) { + int startWordIndex = wordIndex(from); + int startBit = from & MODULO; + int endWordIndex = wordIndex(to); + int endBit = to & MODULO; + // TODO: is this needed if the caller checks range? + byte[] words = ensureIndex(endWordIndex); + long out = 0; + for (int wordIndex = startWordIndex; wordIndex <= endWordIndex; wordIndex++) { + long word = words[wordIndex] & WORD_MASK; + if (wordIndex == startWordIndex) { + word &= (WORD_MASK >>> startBit); + } + if (wordIndex == endWordIndex) { + word &= ~(WORD_MASK >> endBit); + out |= word >>> (BITS_PER_WORD - endBit); + break; + } + int remaining = to - ((wordIndex + 1) << ADDRESS_BITS_PER_WORD); + out |= word << remaining; + } + return out; + } +} 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..f876bd04 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,98 +1,222 @@ 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.datatype.FixedIntegerList; +import com.iab.gpp.encoder.datatype.IntegerSet; +import com.iab.gpp.encoder.datatype.encoder.FibonacciIntegerEncoder; import com.iab.gpp.encoder.error.DecodingException; +import com.iab.gpp.encoder.error.EncodingException; public final class BitString { public static final char TRUE = '1'; 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 int readIndex; + private int writeIndex; - BitString(BitSet bitSet, int from, int to) { + public BitString(BitSet bitSet, int length) { this.bitSet = bitSet; - this.from = from; - this.to = to; + this.writeIndex = length; } - public static final BitString empty(int size) { - if (size == 0) { - return EMPTY; - } - return new BitString(new BitSet(size), 0, size); + public BitString() { + this(new BitSet(), 0); } public static final BitString of(String str) { int length = str.length(); - BitStringBuilder builder = new BitStringBuilder(length); + BitString out = new BitString(new BitSet(length), 0); for (int i = 0; i < length; i++) { char c = str.charAt(i); if (c == TRUE) { - builder.append(true); + out.writeBoolean(true); } else if (c == FALSE) { - builder.append(false); + out.writeBoolean(false); } else { throw new DecodingException("Invalid bit string"); } } - return builder.build(); - } - - public IntegerSet toIntegerSet() { - return new IntegerBitSet(bitSet, from, to, 1); + return out; } @Override public String toString() { StringBuilder sb = new StringBuilder(length()); - for (int i = from; i < to; i++) { + for (int i = 0; i < writeIndex; i++) { sb.append(bitSet.get(i) ? TRUE : FALSE); } return sb.toString(); } - public boolean getValue(int i) { - return bitSet.get(from + i); + private boolean getValue(int i) { + if (i >= writeIndex) { + throw new DecodingException("Bit string access out of range"); + } + return bitSet.get(i); } public int length() { - return to - from; + return writeIndex; + } + + public boolean hasRemaining() { + return readIndex < writeIndex; + } + + public void writeEmpty(int length) { + this.writeIndex += length; + } + + public void writeInt(int value, int length) { + int mask = 1 << length; + if (value >= mask) { + throw new EncodingException( + "Numeric value '" + value + "' is too large for a bit string length of '" + length + "'"); + } + for (int i = 0; i < length; i++) { + mask >>= 1; + writeBoolean((mask & value) != 0); + } + } + + public void writeLong(long value, int length) { + long mask = 1L << length; + if (value >= mask) { + throw new EncodingException( + "Numeric value '" + value + "' is too large for a bit string length of '" + length + "'"); + } + for (int i = 0; i < length; i++) { + mask >>= 1; + writeBoolean((mask & value) != 0); + } + } + + public void writeBoolean(boolean value) { + int idx = writeIndex++; + if (value) { + bitSet.set(idx); + } + } + + public void writeFibonacci(int value) { + int largestIndex = 0; + for (int i = 0; i < FibonacciIntegerEncoder.FIBONACCI_LIMIT; i++) { + if (value >= FibonacciIntegerEncoder.FIBONACCI_NUMBERS[i]) { + largestIndex++; + } else { + break; + } + } + if (largestIndex == FibonacciIntegerEncoder.FIBONACCI_LIMIT) { + throw new EncodingException("Unencodable FibonacciInteger " + value); + } + + int out = 1; + int mask = 1; + for (int i = largestIndex - 1; i >= 0; i--) { + mask <<= 1; + int f = FibonacciIntegerEncoder.FIBONACCI_NUMBERS[i]; + if (value >= f) { + out |= mask; + value -= f; + } + } + writeInt(out, largestIndex + 1); + } + + public void write(BitString other, int from, int to) { + for (int i = from; i < to; i++) { + writeBoolean(other.getValue(i)); + } + } + + public void write(BitString other) { + int otherLength = other.length(); + for (int i = 0; i < otherLength; i++) { + writeBoolean(other.bitSet.get(i)); + } + } + + public int readInt(int length) { + int from = readIndex; + int to = from + length; + if (from >= writeIndex) { + throw new DecodingException("Bit string access out of range"); + } + readIndex = to; + return bitSet.readInt(from, to); } - public BitString substring(int i) { - return substring(i, length()); + // used for usnat v1 to v2 conversion, see note in UsNatCoreSegment + public int peekInt(int length) { + return bitSet.readInt(0, 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"); + // used for usnat v1 to v2 conversion, see note in UsNatCoreSegment + public void putInt(int value, int length) { + int mask = 1 << length; + if (value >= mask) { + throw new EncodingException( + "Numeric value '" + value + "' is too large for a bit string length of '" + length + "'"); + } + for (int i = 0; i < length; i++) { + mask >>= 1; + bitSet.set(i, (mask & value) != 0); } - int oldFrom = this.from; - return new BitString(bitSet, oldFrom + newFrom, oldFrom + newTo); } - public BitString expandTo(int target) { - int needed = target - length(); - if (needed == 0) { - return this; + public long readLong(int length) { + int from = readIndex; + int to = from + length; + if (from >= writeIndex) { + throw new DecodingException("Bit string access out of range"); } - if (needed < 0) { - return substring(0, target); + readIndex = to; + return bitSet.readLong(from, to); + } + + public boolean readBoolean() { + return getValue(readIndex++); + } + + public int readFibonacci() { + int value = 0; + int readIndex = this.readIndex; + for (int i = 0; i < FibonacciIntegerEncoder.FIBONACCI_LIMIT; i++) { + if (getValue(readIndex + i)) { + // 1X + value += FibonacciIntegerEncoder.FIBONACCI_NUMBERS[i]; + i++; + int next = readIndex + i; + if (getValue(next)) { + // 11 + this.readIndex = next + 1; + return value; + } + } } - BitStringBuilder sb = new BitStringBuilder(target); - sb.append(this); - for (int i = 0; i < needed; i++) { - sb.append(false); + throw new DecodingException("Invalid FibonacciInteger"); + } + + public IntegerSet readIntegerSet(int length) { + int newReadIndex = readIndex + length; + if (newReadIndex > writeIndex) { + throw new DecodingException("Bit string access out of range"); } - return sb.build(); + IntegerSet out = new IntegerSet(bitSet, readIndex, newReadIndex, 1); + readIndex = newReadIndex; + return out; } + public FixedIntegerList readFixedIntegerList(int elementLength, int length) { + int newReadIndex = readIndex + elementLength * length; + if (newReadIndex > writeIndex) { + throw new DecodingException("Bit string access out of range"); + } + FixedIntegerList out = new FixedIntegerList(bitSet, readIndex, elementLength, length); + readIndex = newReadIndex; + return out; + } } 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 deleted file mode 100644 index 88d0ffaa..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitStringBuilder.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.iab.gpp.encoder.bitstring; - -import java.util.BitSet; - -public final class BitStringBuilder { - private final BitSet bitSet; - private int length; - - public BitStringBuilder(int initialCapacity) { - this.bitSet = new BitSet(initialCapacity); - } - - public BitStringBuilder() { - this.bitSet = new BitSet(); - } - - public BitString build() { - return new BitString(bitSet, 0, length); - } - - public BitStringBuilder append(boolean value) { - int idx = length++; - if (value) { - bitSet.set(idx); - } - return this; - } - - public BitStringBuilder append(BitString other) { - int otherLength = other.length(); - for (int i = 0; i < otherLength; i++) { - append(other.getValue(i)); - } - return this; - } - - public int length() { - return length; - } - - public BitStringBuilder append(BitStringBuilder other) { - int otherLength = other.length(); - for (int i = 0; i < otherLength; i++) { - append(other.bitSet.get(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/datatype/AbstractDirtyableBitStringDataType.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/AbstractDirtyableBitStringDataType.java new file mode 100644 index 00000000..3d0c51b1 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/AbstractDirtyableBitStringDataType.java @@ -0,0 +1,30 @@ +package com.iab.gpp.encoder.datatype; + +import com.iab.gpp.encoder.field.FieldKey; +import java.util.function.Predicate; + +// This class is used to handle collection types. +// It is important that we monitor the collections we return for changes. +public abstract class AbstractDirtyableBitStringDataType< + E extends Enum & FieldKey, T extends Dirtyable> + extends AbstractEncodableBitStringDataType { + + protected AbstractDirtyableBitStringDataType(String name, Predicate validator) { + super(name, validator); + } + + @Override + public boolean isDirty(Object[] values, int index) { + T value = get(values, index); + return (value != null && value.isDirty()); + } + + @SuppressWarnings("unchecked") + @Override + public void setDirty(Object[] values, int index, boolean dirty) { + T value = (T) values[index]; + if (value != null) { + 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..1a734630 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 @@ -1,64 +1,30 @@ package com.iab.gpp.encoder.datatype; -import java.util.Collection; -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 { - //this if for backwards compatibility with the newer fields - protected boolean hardFailIfMissing = true; - protected boolean dirty = false; - protected Predicate validator = null; - protected T value; - - protected AbstractEncodableBitStringDataType(boolean hardFailIfMissing) { - this.hardFailIfMissing = hardFailIfMissing; - } - - public AbstractEncodableBitStringDataType withValidator(Predicate validator) { - this.validator = validator; - return this; - } - - public boolean hasValue() { - return this.value != null; - } - - public T getValue() { - return this.value; - } +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.segment.EncodableSegment; +import java.util.function.Predicate; - @SuppressWarnings("unchecked") - public void setValue(Object value) { - T v = (T) value; - if (validator == null || validator.test(v)) { - this.value = v; - this.dirty = true; - } else { - if (v instanceof Collection) { - throw new ValidationException("Invalid value '" - + ((Collection) v).stream().map(Object::toString).collect(Collectors.joining(",")) + "'"); - } else { - throw new ValidationException("Invalid value '" + v + "'"); - } - } +public abstract class AbstractEncodableBitStringDataType & FieldKey, T> + extends DataType { + protected AbstractEncodableBitStringDataType(String name, Predicate validator) { + super(name, validator); } - public boolean getHardFailIfMissing() { - return this.hardFailIfMissing; + @Override + public final void encode( + BitString writer, Object[] values, int index, EncodableSegment segment) { + encode(writer, get(values, index), segment); } - public abstract BitString substring(BitString bitString, int fromIndex) throws SubstringException; + protected abstract void encode(BitString writer, T value, EncodableSegment segment); - public boolean isDirty() { - return dirty; + @Override + public final void decode( + BitString reader, Object[] values, int index, EncodableSegment segment) { + values[index] = decode(reader, segment); } - public void setDirty(boolean dirty) { - this.dirty = dirty; - } + protected abstract T decode(BitString reader, EncodableSegment segment); } 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..92c6e3d0 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,85 @@ 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.bitstring.BitString; +import com.iab.gpp.encoder.error.ValidationException; +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.segment.EncodableSegment; +import java.util.Collection; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public abstract class DataType & FieldKey, T> { + + protected final String name; + private final Predicate validator; + + protected DataType(String name, Predicate validator) { + this.name = name; + this.validator = validator; + } + + public final String getName() { + return name; + } + + @Override + public String toString() { + return name + "=" + this.getClass().getSimpleName(); + } + + protected final void validate(T v) { + if (validator == null || validator.test(v)) { + return; + } else { + if (v instanceof Collection) { + throw new ValidationException( + "Invalid value '" + + ((Collection) v) + .stream().map(Object::toString).collect(Collectors.joining(",")) + + "'"); + } else { + throw new ValidationException("Invalid value '" + v + "'"); + } + } + } + + public boolean isDirty(Object[] values, int index) { + return false; + } + + public void setDirty(Object[] values, int index, boolean dirty) { + // pass + } + + public void encode(BitString writer, Object[] values, int index, EncodableSegment segment) { + throw new UnsupportedOperationException("type does not permit bit string encoding"); + } + + public void decode(BitString reader, Object[] values, int index, EncodableSegment segment) { + throw new UnsupportedOperationException("type does not permit bit string decoding"); + } + + @SuppressWarnings("unchecked") + public final T get(Object[] values, int index) { + T value = (T) values[index]; + if (value == null) { + value = initialize(); + values[index] = value; + } + return value; + } + + public final void set(Object[] values, int index, Object newValue) { + T oldValue = get(values, index); + T effectiveValue = processValue(oldValue, newValue); + validate(effectiveValue); + values[index] = effectiveValue; + } + + protected abstract T initialize(); + + @SuppressWarnings("unchecked") + protected T processValue(T oldValue, Object newValue) { + return (T) newValue; + } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/Dirtyable.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/Dirtyable.java new file mode 100644 index 00000000..ef4e5495 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/Dirtyable.java @@ -0,0 +1,7 @@ +package com.iab.gpp.encoder.datatype; + +public interface Dirtyable { + boolean isDirty(); + + void setDirty(boolean dirty); +} 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..93ca3841 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/DirtyableList.java @@ -0,0 +1,102 @@ +package com.iab.gpp.encoder.datatype; + +import java.util.AbstractList; +import java.util.ArrayList; +import java.util.Collection; + +// 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..81bccc51 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,101 +1,65 @@ 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.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; +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.segment.EncodableSegment; +import java.util.List; -public final class EncodableArrayOfFixedIntegerRanges extends AbstractEncodableBitStringDataType> { +public final class EncodableArrayOfFixedIntegerRanges & FieldKey> + extends AbstractDirtyableBitStringDataType> { - private int keyBitStringLength; - private int typeBitStringLength; + private final int keyBitStringLength; + private final int typeBitStringLength; - public EncodableArrayOfFixedIntegerRanges(int keyBitStringLength, int typeBitStringLength, boolean hardFailIfMissing) { - super(hardFailIfMissing); + public EncodableArrayOfFixedIntegerRanges( + String name, int keyBitStringLength, int typeBitStringLength) { + super(name, null); this.keyBitStringLength = keyBitStringLength; this.typeBitStringLength = typeBitStringLength; - this.value = Collections.emptyList(); } @Override - public void encode(BitStringBuilder sb) { - try { - List entries = this.value; - - FixedIntegerEncoder.encode(sb, entries.size(), 12); - for (RangeEntry entry : entries) { - FixedIntegerEncoder.encode(sb, entry.getKey(), keyBitStringLength); - FixedIntegerEncoder.encode(sb, entry.getType(), typeBitStringLength); - FixedIntegerRangeEncoder.encode(sb, entry.getIds()); - } - - } catch (Exception e) { - throw new EncodingException(e); - } + public String toString() { + return name + "=N-ArrayOfRanges(" + keyBitStringLength + "," + typeBitStringLength + ")"; } @Override - public void decode(BitString bitString) { - try { - int size = FixedIntegerEncoder.decode(bitString, 0, 12); - List entries = new ArrayList<>(size); - int index = 12; - 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)); - } + protected DirtyableList initialize() { + return new DirtyableList<>(); + } - // NOTE: this requires that updates to structure be done using the setter - this.value = Collections.unmodifiableList(entries); - } catch (Exception e) { - throw new DecodingException(e); + @Override + protected void encode( + BitString sb, DirtyableList entries, EncodableSegment segment) { + sb.writeInt(entries.size(), 12); + for (RangeEntry entry : entries) { + sb.writeInt(entry.getKey(), keyBitStringLength); + sb.writeInt(entry.getType(), typeBitStringLength); + FixedIntegerRangeEncoder.encode(sb, entry.getIds()); } } @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); + protected DirtyableList decode(BitString reader, EncodableSegment segment) { + int size = reader.readInt(12); + DirtyableList value = initialize(); + for (int i = 0; i < size; i++) { + 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); } + return value; } + @SuppressWarnings("unchecked") + @Override + protected DirtyableList processValue( + DirtyableList oldValue, Object newValue) { + oldValue.clear(); + oldValue.addAll((List) newValue); + return oldValue; + } } 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..0969538a 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,39 +1,31 @@ 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.datatype.encoder.BooleanEncoder; -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.segment.EncodableSegment; -public final class EncodableBoolean extends AbstractEncodableBitStringDataType { +public final class EncodableBoolean & FieldKey> + extends AbstractEncodableBitStringDataType { - public EncodableBoolean(Boolean value) { - super(true); - setValue(value); + private final Boolean initial; + + public EncodableBoolean(String name, Boolean initial) { + super(name, null); + this.initial = initial; } - public void encode(BitStringBuilder builder){ - try { - BooleanEncoder.encode(builder, this.value); - } catch (Exception e) { - throw new EncodingException(e); - } + @Override + protected Boolean initialize() { + return initial; } - public void decode(BitString bitString) { - try { - this.value = BooleanEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } + @Override + protected void encode(BitString builder, Boolean value, EncodableSegment segment) { + builder.writeBoolean(value); } - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - try { - return bitString.substring(fromIndex, fromIndex + 1); - } catch (Exception e) { - throw new SubstringException(e); - } + @Override + protected Boolean decode(BitString reader, EncodableSegment segment) { + return reader.readBoolean(); } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableDataType.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableDataType.java deleted file mode 100644 index 530ae121..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableDataType.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; - -public interface EncodableDataType extends DataType { - void encode(BitStringBuilder builder); - - void decode(BitString str); -} 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..f9333f57 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 @@ -1,45 +1,30 @@ package com.iab.gpp.encoder.datatype; -import java.time.Instant; - import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; import com.iab.gpp.encoder.datatype.encoder.DatetimeEncoder; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.error.EncodingException; - -public final class EncodableDatetime extends AbstractEncodableBitStringDataType { +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.segment.EncodableSegment; +import java.time.Instant; - protected EncodableDatetime() { - super(true); - } +public final class EncodableDatetime & FieldKey> + extends AbstractEncodableBitStringDataType { - public EncodableDatetime(Instant value) { - super(true); - setValue(value); + public EncodableDatetime(String name) { + super(name, null); } - public void encode(BitStringBuilder builder) { - try { - DatetimeEncoder.encode(builder, this.value); - } catch (Exception e) { - throw new EncodingException(e); - } + @Override + protected Instant initialize() { + return Instant.EPOCH; } - public void decode(BitString bitString) { - try { - this.value = DatetimeEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } + @Override + protected void encode(BitString builder, Instant value, EncodableSegment segment) { + DatetimeEncoder.encode(builder, value); } - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - try { - return bitString.substring(fromIndex, fromIndex + 36); - } catch (Exception e) { - throw new SubstringException(e); - } + @Override + protected Instant decode(BitString reader, EncodableSegment segment) { + return DatetimeEncoder.decode(reader); } } 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..3ada0870 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,53 +1,31 @@ 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.datatype.encoder.FibonacciIntegerEncoder; -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.segment.EncodableSegment; -public final class EncodableFibonacciInteger extends AbstractEncodableBitStringDataType { +public final class EncodableFibonacciInteger & FieldKey> + extends AbstractEncodableBitStringDataType { - protected EncodableFibonacciInteger() { - super(true); - } - - public EncodableFibonacciInteger(Integer value) { - super(true); - setValue(value); - } + private final Integer initial; - public EncodableFibonacciInteger(Integer value, boolean hardFailIfMissing) { - super(hardFailIfMissing); - setValue(value); + public EncodableFibonacciInteger(String name, Integer initial) { + super(name, null); + this.initial = initial; } - public void encode(BitStringBuilder builder) { - try { - FibonacciIntegerEncoder.encode(builder, this.value); - } catch (Exception e) { - throw new EncodingException(e); - } + @Override + protected Integer initialize() { + return initial; } - public void decode(BitString bitString) { - try { - this.value = FibonacciIntegerEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } + @Override + protected void encode(BitString builder, Integer value, EncodableSegment segment) { + builder.writeFibonacci(value); } - 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); - } + @Override + protected Integer decode(BitString reader, EncodableSegment segment) { + return reader.readFibonacci(); } } 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..c1d0ba79 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,65 +1,38 @@ 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.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 { +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.segment.EncodableSegment; +import java.util.Collection; - public EncodableFibonacciIntegerRange() { - super(true); - this.value = new IntegerBitSet(); - } +public final class EncodableFibonacciIntegerRange & FieldKey> + extends AbstractDirtyableBitStringDataType { - public void encode(BitStringBuilder builder) { - try { - FibonacciIntegerRangeEncoder.encode(builder, this.value); - } catch (Exception e) { - throw new EncodingException(e); - } + public EncodableFibonacciIntegerRange(String name) { + super(name, null); } - public void decode(BitString bitString) { - try { - this.value = FibonacciIntegerRangeEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } + @Override + public IntegerSet initialize() { + return new IntegerSet(); } - 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); - } + @Override + protected void encode(BitString builder, IntegerSet value, EncodableSegment segment) { + FibonacciIntegerRangeEncoder.encode(builder, value); } - @SuppressWarnings("unchecked") @Override - public void setValue(Object value) { - this.value.clear(); - this.value.addAll((Collection) value); + protected IntegerSet decode(BitString reader, EncodableSegment segment) { + return FibonacciIntegerRangeEncoder.decode(reader); } + @SuppressWarnings("unchecked") @Override - public IntegerSet getValue() { - return new ManagedIntegerSet(this, super.getValue()); + protected IntegerSet processValue(IntegerSet oldValue, Object newValue) { + oldValue.clear(); + oldValue.addAll((Collection) newValue); + return oldValue; } } 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..ffb2dda9 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,57 +1,46 @@ 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.FixedBitfieldEncoder; -import com.iab.gpp.encoder.datatype.encoder.IntegerSet; -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.segment.EncodableSegment; +import java.util.Collection; -public final class EncodableFixedBitfield extends AbstractEncodableBitStringDataType { +public final class EncodableFixedBitfield & FieldKey> + extends AbstractDirtyableBitStringDataType { private final int numElements; - public EncodableFixedBitfield(int numElements) { - super(true); + public EncodableFixedBitfield(String name, int numElements) { + super(name, null); this.numElements = numElements; - this.value = new IntegerBitSet(numElements); } - public void encode(BitStringBuilder builder) { - try { - FixedBitfieldEncoder.encode(builder, this.value, this.numElements); - } catch (Exception e) { - throw new EncodingException(e); - } + @Override + public String toString() { + return name + "=Bitfield(" + numElements + ")"; } - public void decode(BitString bitString) { - try { - this.value = FixedBitfieldEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } + @Override + protected IntegerSet initialize() { + return new IntegerSet(numElements); } - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - try { - return bitString.substring(fromIndex, fromIndex + this.numElements); - } catch (Exception e) { - throw new SubstringException(e); - } + @Override + protected void encode(BitString builder, IntegerSet value, EncodableSegment segment) { + FixedBitfieldEncoder.encode(builder, value, this.numElements); } - @SuppressWarnings("unchecked") @Override - public void setValue(Object value) { - this.value.clear(); - this.value.addAll((Collection) value); + protected IntegerSet decode(BitString reader, EncodableSegment segment) { + return reader.readIntegerSet(this.numElements); } + @SuppressWarnings("unchecked") @Override - public IntegerSet getValue() { - return new ManagedIntegerSet(this, super.getValue()); + protected IntegerSet processValue(IntegerSet oldValue, Object newValue) { + oldValue.clear(); + oldValue.addAll((Collection) newValue); + return oldValue; } } 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..6d6fc90d 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,47 +1,44 @@ 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.datatype.encoder.FixedIntegerEncoder; -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.segment.EncodableSegment; +import java.util.function.Predicate; -public final class EncodableFixedInteger extends AbstractEncodableBitStringDataType { +public final class EncodableFixedInteger & FieldKey> + extends AbstractEncodableBitStringDataType { - private int bitStringLength; + private final int bitStringLength; + private final Integer initial; - protected EncodableFixedInteger(int bitStringLength) { - super(true); + public EncodableFixedInteger( + String name, int bitStringLength, Integer initial, Predicate validator) { + super(name, validator); this.bitStringLength = bitStringLength; + this.initial = initial; } - public EncodableFixedInteger(int bitStringLength, Integer value) { - super(true); - this.bitStringLength = bitStringLength; - setValue(value); + public EncodableFixedInteger(String name, int bitStringLength, Integer initial) { + this(name, bitStringLength, initial, null); + } + + @Override + public String toString() { + return name + "=Int(" + bitStringLength + ")"; } - public void encode(BitStringBuilder builder) { - try { - FixedIntegerEncoder.encode(builder, this.value, this.bitStringLength); - } catch (Exception e) { - throw new EncodingException(e); - } + @Override + protected Integer initialize() { + return initial; } - public void decode(BitString bitString) { - try { - this.value = FixedIntegerEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } + @Override + protected void encode(BitString builder, Integer value, EncodableSegment segment) { + builder.writeInt(value, this.bitStringLength); } - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - try { - return bitString.substring(fromIndex, fromIndex + this.bitStringLength); - } catch (Exception e) { - throw new SubstringException(e); - } + @Override + protected Integer decode(BitString reader, EncodableSegment segment) { + return IntegerCache.valueOf(reader.readInt(bitStringLength)); } } 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..57d05985 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,71 +1,56 @@ 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.datatype.encoder.FixedIntegerListEncoder; -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.segment.EncodableSegment; +import java.util.List; +import java.util.function.Predicate; -public final class EncodableFixedIntegerList extends AbstractEncodableBitStringDataType> { +public final class EncodableFixedIntegerList & FieldKey> + extends AbstractDirtyableBitStringDataType { - private int elementBitStringLength; - private int numElements; + private final int elementBitStringLength; + private final int numElements; - protected EncodableFixedIntegerList(int elementBitStringLength, int numElements) { - super(true); + public EncodableFixedIntegerList( + String name, + int elementBitStringLength, + int numElements, + Predicate validator) { + super(name, validator); this.elementBitStringLength = elementBitStringLength; this.numElements = numElements; } - public EncodableFixedIntegerList(int elementBitStringLength, List value) { - super(true); - this.elementBitStringLength = elementBitStringLength; - this.numElements = value.size(); - setValue(value); + @Override + public String toString() { + return name + "=Int(" + elementBitStringLength + "," + numElements + ")"; } - public void encode(BitStringBuilder builder) { - try { - FixedIntegerListEncoder.encode(builder, this.value, this.elementBitStringLength, this.numElements); - } catch (Exception e) { - throw new EncodingException(e); - } + @Override + protected FixedIntegerList initialize() { + return new FixedIntegerList(elementBitStringLength, numElements); } - public void decode(BitString bitString) { - try { - this.value = FixedIntegerListEncoder.decode(bitString, this.elementBitStringLength, this.numElements); - } catch (Exception e) { - throw new DecodingException(e); - } + @Override + protected void encode(BitString builder, FixedIntegerList value, EncodableSegment segment) { + FixedIntegerListEncoder.encode(builder, value, this.elementBitStringLength, this.numElements); } - 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); - } + @Override + protected FixedIntegerList decode(BitString reader, EncodableSegment segment) { + return reader.readFixedIntegerList(elementBitStringLength, numElements); } @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); + protected FixedIntegerList processValue(FixedIntegerList oldValue, Object newValue) { + List list = (List) newValue; + int size = list.size(); + for (int i = 0; i < numElements; i++) { + oldValue.set(i, i < size ? list.get(i) : 0); } - super.setValue(v); - } - - @Override - public List getValue() { - return new ManagedFixedList<>(this, super.getValue()); + return oldValue; } } 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..ec844895 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,64 +1,38 @@ 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.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 { +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.segment.EncodableSegment; +import java.util.Collection; - protected EncodableFixedIntegerRange() { - super(true); - this.value = new IntegerBitSet(); - } +public final class EncodableFixedIntegerRange & FieldKey> + extends AbstractDirtyableBitStringDataType { - public void encode(BitStringBuilder builder) { - try { - FixedIntegerRangeEncoder.encode(builder, this.value); - } catch (Exception e) { - throw new EncodingException(e); - } + public EncodableFixedIntegerRange(String name) { + super(name, null); } - public void decode(BitString bitString) { - try { - this.value = FixedIntegerRangeEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } + @Override + protected IntegerSet initialize() { + return new IntegerSet(); } - 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); - } + @Override + protected void encode(BitString builder, IntegerSet value, EncodableSegment segment) { + FixedIntegerRangeEncoder.encode(builder, value); } - @SuppressWarnings("unchecked") @Override - public void setValue(Object value) { - this.value.clear(); - this.value.addAll((Collection) value); + protected IntegerSet decode(BitString reader, EncodableSegment segment) { + return FixedIntegerRangeEncoder.decode(reader); } + @SuppressWarnings("unchecked") @Override - public IntegerSet getValue() { - return new ManagedIntegerSet(this, super.getValue()); + protected IntegerSet processValue(IntegerSet oldValue, Object newValue) { + oldValue.clear(); + oldValue.addAll((Collection) newValue); + return oldValue; } } 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..82b4b56c 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,47 +1,39 @@ 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.datatype.encoder.FixedStringEncoder; -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.segment.EncodableSegment; -public final class EncodableFixedString extends AbstractEncodableBitStringDataType { +public final class EncodableFixedString & FieldKey> + extends AbstractEncodableBitStringDataType { - private int stringLength; + private final int stringLength; + private final String initial; - protected EncodableFixedString(int stringLength) { - super(true); + public EncodableFixedString(String name, int stringLength, String initial) { + super(name, null); this.stringLength = stringLength; + this.initial = initial; } - public EncodableFixedString(int stringLength, String value) { - super(true); - this.stringLength = stringLength; - setValue(value); + @Override + public String toString() { + return name + "=String(" + stringLength + ")"; } - public void encode(BitStringBuilder builder) { - try { - FixedStringEncoder.encode(builder, this.value, this.stringLength); - } catch (Exception e) { - throw new EncodingException(e); - } + @Override + protected String initialize() { + return initial; } - public void decode(BitString bitString) { - try { - this.value = FixedStringEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } + @Override + protected void encode(BitString builder, String value, EncodableSegment segment) { + FixedStringEncoder.encode(builder, value, this.stringLength); } - 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); - } + @Override + protected String decode(BitString reader, EncodableSegment segment) { + return FixedStringEncoder.decode(reader, this.stringLength); } } 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..88b7118b 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 @@ -1,59 +1,42 @@ package com.iab.gpp.encoder.datatype; -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.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 { +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.segment.EncodableSegment; +import com.iab.gpp.encoder.segment.SegmentValueProvider; +import java.util.Collection; - private IntSupplier getLengthSupplier; +public final class EncodableFlexibleBitfield & FieldKey> + extends AbstractDirtyableBitStringDataType { - public EncodableFlexibleBitfield(IntSupplier getLengthSupplier) { - super(true); - this.getLengthSupplier = getLengthSupplier; - this.value = new IntegerBitSet(); - } + private final SegmentValueProvider getLengthSupplier; - public void encode(BitStringBuilder builder) { - try { - FixedBitfieldEncoder.encode(builder, this.value, this.getLengthSupplier.getAsInt()); - } catch (Exception e) { - throw new EncodingException(e); - } + public EncodableFlexibleBitfield(String name, E key) { + super(name, null); + this.getLengthSupplier = new SegmentValueProvider<>(key); } - public void decode(BitString bitString) { - try { - this.value = FixedBitfieldEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } + @Override + protected IntegerSet initialize() { + return new IntegerSet(); } - 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); - } + @Override + protected void encode(BitString builder, IntegerSet value, EncodableSegment segment) { + FixedBitfieldEncoder.encode(builder, value, this.getLengthSupplier.extract(segment)); } - @SuppressWarnings("unchecked") @Override - public void setValue(Object value) { - this.value.clear(); - this.value.addAll((Collection) value); + protected IntegerSet decode(BitString reader, EncodableSegment segment) { + return reader.readIntegerSet(getLengthSupplier.extract(segment)); } + @SuppressWarnings("unchecked") @Override - public IntegerSet getValue() { - return new ManagedIntegerSet(this, super.getValue()); + protected IntegerSet processValue(IntegerSet oldValue, Object newValue) { + oldValue.clear(); + oldValue.addAll((Collection) newValue); + return oldValue; } } 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..90a3ed92 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,64 +1,38 @@ 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.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 { +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.segment.EncodableSegment; +import java.util.Collection; - public EncodableOptimizedFixedRange() { - super(true); - this.value = new IntegerBitSet(); - } +public final class EncodableOptimizedFixedRange & FieldKey> + extends AbstractDirtyableBitStringDataType { - public void encode(BitStringBuilder builder) { - try { - OptimizedFixedRangeEncoder.encode(builder, this.value); - } catch (Exception e) { - throw new EncodingException(e); - } + public EncodableOptimizedFixedRange(String name) { + super(name, null); } - public void decode(BitString bitString) { - try { - this.value = OptimizedFixedRangeEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } + @Override + protected IntegerSet initialize() { + return new IntegerSet(); } - 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); - } + @Override + protected void encode(BitString builder, IntegerSet value, EncodableSegment segment) { + OptimizedFixedRangeEncoder.encode(builder, value); } - @SuppressWarnings("unchecked") @Override - public void setValue(Object value) { - this.value.clear(); - this.value.addAll((Collection) value); + protected IntegerSet decode(BitString reader, EncodableSegment segment) { + return OptimizedFixedRangeEncoder.decode(reader); } + @SuppressWarnings("unchecked") @Override - public IntegerSet getValue() { - return new ManagedIntegerSet(this, super.getValue()); + protected IntegerSet processValue(IntegerSet oldValue, Object newValue) { + oldValue.clear(); + oldValue.addAll((Collection) newValue); + return oldValue; } } 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..36486cb1 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/FixedIntegerList.java @@ -0,0 +1,91 @@ +package com.iab.gpp.encoder.datatype; + +import com.iab.gpp.encoder.bitstring.BitSet; +import java.util.AbstractList; + +/** + * 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 BitSet bitSet; + private final int offset; + private final int elementBitStringLength; + private final int numElements; + + public FixedIntegerList(BitSet bitSet, int offset, int elementBitStringLength, int numElements) { + this.bitSet = bitSet; + this.offset = offset; + this.elementBitStringLength = elementBitStringLength; + this.numElements = numElements; + } + + public FixedIntegerList(int elementBitStringLength, int numElements) { + this(new BitSet(elementBitStringLength * numElements), 0, elementBitStringLength, numElements); + } + + @Override + public int size() { + return numElements; + } + + @Override + public Integer get(int index) { + return getInt(index); + } + + public int getInt(int index) { + int length = elementBitStringLength; + int mask = 1 << length; + int from = offset + index * length; + int to = from + length; + int value = 0; + for (int i = from; i < to; i++) { + mask >>= 1; + if (bitSet.get(i)) { + value |= mask; + } + } + return value; + } + + @Override + public Integer set(int index, Integer value) { + return setInt(index, value); + } + + public int setInt(int index, int value) { + int length = elementBitStringLength; + int mask = 1 << length; + if (value < 0 || value >= mask) { + throw new IllegalArgumentException( + "Numeric value '" + + value + + "' is too large for a bit string length of '" + + elementBitStringLength + + "'"); + } + int from = offset + index * length; + int to = from + length; + for (int i = from; i < to; i++) { + mask >>= 1; + if (bitSet.set(i, (value & mask) != 0)) { + value |= mask; + } + } + dirty = true; + return value; + } + + @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/encoder/IntegerCache.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/IntegerCache.java similarity index 63% rename from iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/IntegerCache.java rename to iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/IntegerCache.java index d92823e5..79b9aa8b 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/IntegerCache.java @@ -1,10 +1,12 @@ -package com.iab.gpp.encoder.datatype.encoder; +package com.iab.gpp.encoder.datatype; -import static com.iab.gpp.encoder.datatype.encoder.IntegerBitSet.MAX_COLLECTION_SIZE; +import static com.iab.gpp.encoder.datatype.IntegerSet.MAX_COLLECTION_SIZE; final class IntegerCache { private IntegerCache() {} + private static final Integer[] CACHE = new Integer[MAX_COLLECTION_SIZE]; + static { for (int i = 0; i < MAX_COLLECTION_SIZE; i++) { CACHE[i] = i; @@ -12,10 +14,9 @@ private IntegerCache() {} } static Integer valueOf(int i) { - if (i >=0 && i < MAX_COLLECTION_SIZE) { + if (i >= 0 && i < MAX_COLLECTION_SIZE) { return CACHE[i]; } return i; } - } 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/IntegerSet.java similarity index 56% rename from iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/IntegerBitSet.java rename to iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/IntegerSet.java index 7ff3483d..32341097 100644 --- 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/IntegerSet.java @@ -1,37 +1,45 @@ -package com.iab.gpp.encoder.datatype.encoder; +package com.iab.gpp.encoder.datatype; -import java.util.BitSet; +import com.iab.gpp.encoder.bitstring.BitSet; +import java.util.AbstractSet; +import java.util.Collection; import java.util.NoSuchElementException; +import java.util.PrimitiveIterator.OfInt; 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()); +/** + * 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()); static final int MAX_COLLECTION_SIZE = 8192; - protected final BitSet bitSet; - protected final int from; - protected final int to; + private boolean dirty; + private final BitSet bitSet; + private final int from; + private final int to; private final int adjustment; - public IntegerBitSet(BitSet bitSet, int from, int to, 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 IntegerBitSet(int limit) { - this(new BitSet(0), 0, limit, 0); + public IntegerSet(int limit) { + this(new BitSet(limit), 0, limit, 0); } - public IntegerBitSet() { - this(MAX_COLLECTION_SIZE); + public IntegerSet() { + this(new BitSet(), 0, MAX_COLLECTION_SIZE, 0); } @Override @@ -46,7 +54,7 @@ public int size() { } private int getOffset(int value) { - int offset = from - adjustment + value; + int offset = from - adjustment + value; if (offset < from) { throw new IndexOutOfBoundsException("Negative index provided"); } @@ -55,6 +63,7 @@ private int getOffset(int value) { @Override public void clear() { + dirty = true; bitSet.clear(from, to); } @@ -63,7 +72,6 @@ public boolean isEmpty() { return bitSet.nextSetBit(from) == -1; } - @Override public boolean containsInt(int value) { int offset = getOffset(value); return offset < to && bitSet.get(offset); @@ -97,19 +105,18 @@ public int nextInt() { } @Override - public Spliterator.OfInt spliterator(){ + 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); + LOGGER.warning("Exceeding IntegerBitSet.MAX_COLLECTION_SIZE: " + value); } public void addRange(int start, int end) { @@ -126,6 +133,7 @@ public void addRange(int start, int end) { logOutOfRange(end); realEnd = to; } + dirty = true; bitSet.set(realStart, realEnd); } @@ -135,12 +143,9 @@ public boolean addInt(int value) { logOutOfRange(value); return false; } - boolean present = bitSet.get(offset); - if (present) { - return false; - } - bitSet.set(offset, true); - return true; + boolean present = !bitSet.set(offset, true); + dirty = true; + return present; } public boolean removeInt(int value) { @@ -149,11 +154,66 @@ public boolean removeInt(int value) { logOutOfRange(value); return false; } - boolean present = bitSet.get(offset); - if (!present) { + boolean present = bitSet.set(offset, false); + dirty = true; + return present; + } + + @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; } - bitSet.set(offset, false); - return true; + 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; + } + + @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..c30f40f5 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,35 @@ 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.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 +38,7 @@ public int getType() { } public void setType(int type) { + this.dirty = true; this.type = type; } @@ -40,8 +47,19 @@ 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..62d3af2f 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,28 +1,31 @@ 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.field.FieldKey; +import com.iab.gpp.encoder.segment.EncodableSegment; -public final class UnencodableBoolean extends AbstractEncodableBitStringDataType { +public final class UnencodableBoolean & FieldKey> + extends AbstractEncodableBitStringDataType { - protected UnencodableBoolean() { - super(true); - } + private final Boolean initial; - public UnencodableBoolean(Boolean value) { - super(true); - setValue(value); + public UnencodableBoolean(String name, Boolean initial) { + super(name, null); + this.initial = initial; } - public void encode(BitStringBuilder builder){ - // pass + @Override + protected Boolean initialize() { + return initial; } - public void decode(BitString bitString) { + @Override + protected void encode(BitString writer, Boolean value, EncodableSegment segment) { // pass } - public BitString substring(BitString bitString, int fromIndex) throws SubstringException { - return BitString.empty(0); + @Override + protected Boolean decode(BitString reader, EncodableSegment segment) { + return Boolean.FALSE; } } 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..d0379fc6 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 @@ -1,61 +1,20 @@ package com.iab.gpp.encoder.datatype; +import com.iab.gpp.encoder.field.FieldKey; import java.util.function.Predicate; -import com.iab.gpp.encoder.error.ValidationException; -public final class UnencodableCharacter implements DataType { +public final class UnencodableCharacter & FieldKey> + extends DataType { - private boolean dirty = false; - private Predicate validator; - private Character value = null; + private final Character initial; - public UnencodableCharacter() { - this.validator = v -> true; - } - - public UnencodableCharacter(Character value) { - this.validator = v -> true; - setValue(value); - } - - public UnencodableCharacter(Character value, Predicate validator) { - this.validator = validator; - setValue(value); - } - - public void setValidator(Predicate validator) { - this.validator = validator; + public UnencodableCharacter(String name, Character initial, Predicate validator) { + super(name, validator); + this.initial = initial; } @Override - public boolean hasValue() { - return this.value != null; + protected Character initialize() { + return initial; } - - @Override - public Character getValue() { - return this.value; - } - - @Override - public void setValue(Object value) { - Character c = (Character)value.toString().charAt(0); - if(validator.test(c)) { - this.value = c; - this.dirty = true; - } else { - throw new ValidationException("Invalid value '" + c + "'"); - } - } - - @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/UnencodableInteger.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/UnencodableInteger.java index 1b40a247..ac863667 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 @@ -1,60 +1,18 @@ package com.iab.gpp.encoder.datatype; -import java.util.function.Predicate; -import com.iab.gpp.encoder.error.ValidationException; +import com.iab.gpp.encoder.field.FieldKey; -public final class UnencodableInteger implements DataType { +public final class UnencodableInteger & FieldKey> extends DataType { - private boolean dirty; - private Predicate validator; - private Integer value = null; + private final Integer initial; - public UnencodableInteger() { - this.validator = v -> true; - } - - public UnencodableInteger(Integer value) { - this.validator = v -> true; - setValue(value); - } - - public UnencodableInteger(Integer value, Predicate validator) { - this.validator = validator; - setValue(value); - } - - public void setValidator(Predicate validator) { - this.validator = validator; - } - - @Override - public boolean hasValue() { - return this.value != null; - } - - @Override - public Integer getValue() { - return this.value; - } - - @Override - public void setValue(Object value) { - Integer i = (Integer)value; - if(validator.test(i)) { - this.value = i; - this.dirty = true; - } else { - throw new ValidationException("Invalid value '" + i + "'"); - } - } - - @Override - public boolean isDirty() { - return dirty; + public UnencodableInteger(String name, Integer initial) { + super(name, null); + this.initial = initial; } @Override - public void setDirty(boolean dirty) { - this.dirty = dirty; + protected Integer initialize() { + return initial; } } 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/BooleanEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/BooleanEncoder.java deleted file mode 100644 index 8787b4f9..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/BooleanEncoder.java +++ /dev/null @@ -1,27 +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 BooleanEncoder { - private BooleanEncoder() {} - public static void encode(BitStringBuilder builder, Boolean value) { - if (value == null) { - throw new EncodingException("Unencodable Boolean '" + value + "'"); - } - builder.append(value); - } - - public static boolean decode(BitString bitString) { - return decode(bitString, 0, bitString.length()); - } - - public static boolean decode(BitString bitString, int fromIndex, int length) { - if (length != 1) { - throw new DecodingException("Undecodable Boolean '" + bitString + "'"); - } - return bitString.getValue(fromIndex); - } -} 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..243aebbe 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 @@ -1,28 +1,22 @@ package com.iab.gpp.encoder.datatype.encoder; -import java.time.Instant; - import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; import com.iab.gpp.encoder.error.DecodingException; +import java.time.Instant; public class DatetimeEncoder { private DatetimeEncoder() {} - public static void encode(BitStringBuilder builder, Instant value) { + public static void encode(BitString builder, Instant value) { if (value != null) { - FixedLongEncoder.encode(builder, value.toEpochMilli() / 100, 36); + builder.writeLong(value.toEpochMilli() / 100, 36); } else { - FixedLongEncoder.encode(builder, 0, 36); + builder.writeLong(0, 36); } } - 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(BitString reader) throws DecodingException { + return Instant.ofEpochMilli(reader.readLong(36) * 100L); } } 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..f333c1c2 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,17 +1,13 @@ 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 { 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) { @@ -23,72 +19,4 @@ private FibonacciIntegerEncoder() {} } } } - - public static void encode(BitStringBuilder builder, int value) { - int largestIndex = 0; - for (int i = 0; i < FIBONACCI_LIMIT; i++) { - if (value >= FIBONACCI_NUMBERS[i]) { - largestIndex++; - } else { - break; - } - } - if (largestIndex == FIBONACCI_LIMIT) { - throw new EncodingException("Unencodable FibonacciInteger " + value); - } - - int out = 1; - int mask = 1; - for (int i = largestIndex - 1; i >= 0; i--) { - mask <<= 1; - int f = FIBONACCI_NUMBERS[i]; - if (value >= f) { - out |= mask; - value -= f; - } - } - 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..d1888cae 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,15 +1,15 @@ 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.datatype.IntegerSet; import com.iab.gpp.encoder.error.DecodingException; +import java.util.Collection; public class FibonacciIntegerRangeEncoder { private FibonacciIntegerRangeEncoder() {} - public static int encode(BitStringBuilder builder, Collection value) { - BitStringBuilder rangeBuilder = new BitStringBuilder(); + public static int encode(BitString builder, Collection value) { + BitString rangeBuilder = new BitString(); int groupStart = -1; int last = Integer.MIN_VALUE; int offset = 0; @@ -29,59 +29,42 @@ public static int encode(BitStringBuilder builder, Collection value) { groupCount++; writeGroup(rangeBuilder, groupStart, last, offset); } - FixedIntegerEncoder.encode(builder,groupCount, 12); - builder.append(rangeBuilder); + builder.writeInt(groupCount, 12); + builder.write(rangeBuilder); return last; } - private static void writeGroup(BitStringBuilder builder, int groupStart, int last, int offset) { + private static void writeGroup(BitString builder, int groupStart, int last, int offset) { int base = groupStart - offset; int span = last - groupStart; if (span == 0) { - builder.append(false); - FibonacciIntegerEncoder.encode(builder, base); + builder.writeBoolean(false); + builder.writeFibonacci(base); } else { - builder.append(true); - FibonacciIntegerEncoder.encode(builder, base); - FibonacciIntegerEncoder.encode(builder, span); + builder.writeBoolean(true); + builder.writeFibonacci(base); + builder.writeFibonacci(span); } } - 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(BitString 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.readBoolean(); 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..cb1e14aa 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,18 +1,14 @@ 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.datatype.IntegerSet; public class FixedBitfieldEncoder { private FixedBitfieldEncoder() {} - public static void encode(BitStringBuilder builder, IntegerSet value, int bitStringLength) { + public static void encode(BitString builder, IntegerSet value, int bitStringLength) { for (int i = 0; i < bitStringLength; i++) { - BooleanEncoder.encode(builder, value.containsInt(i)); + builder.writeBoolean(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 deleted file mode 100644 index 6b7105ed..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerEncoder.java +++ /dev/null @@ -1,55 +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 FixedIntegerEncoder { - private FixedIntegerEncoder() {} - - public static void encode(BitStringBuilder builder, int value, int bitStringLength) { - int mask = 1 << bitStringLength; - if (value >= mask) { - throw new EncodingException( - "Numeric value '" + value + "' is too large for a bit string length of '" + bitStringLength + "'"); - } - for (int i = 0; i < bitStringLength; i++) { - mask >>= 1; - builder.append((value & mask) > 0); - } - } - - 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 value = 0; - - int base = fromIndex + length - 1; - for (int i = 0; i < length; i++) { - if (bitString.getValue(base - i)) { - value += 1 << i; - } - } - - return value; - } - - public static int decode(String bitString, int fromIndex, int length) throws DecodingException { - int value = 0; - - int base = fromIndex + length - 1; - for (int i = 0; i < length; i++) { - char c = bitString.charAt(base - i); - if (c == BitString.TRUE) { - value += 1 << i; - } else if (c != BitString.FALSE) { - throw new DecodingException("Unencodable Base64Url '" + bitString + "'"); - } - } - - return value; - } -} 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..bb886ed6 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,17 +1,14 @@ 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.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; +import java.util.List; public class FixedIntegerListEncoder { private FixedIntegerListEncoder() {} - public static void encode(BitStringBuilder builder, List value, int elementBitStringLength, int numElements) { + public static void encode( + BitString builder, List value, int elementBitStringLength, int numElements) { int length = value.size(); if (length > numElements) { throw new EncodingException("Too many values '" + value.size() + "'"); @@ -19,38 +16,12 @@ public static void encode(BitStringBuilder builder, List value, int ele for (int i = 0; i < numElements; i++) { if (i < length) { - FixedIntegerEncoder.encode(builder, value.get(i), elementBitStringLength); + builder.writeInt(value.get(i), elementBitStringLength); } else { for (int j = 0; j < elementBitStringLength; j++) { - builder.append(false); + builder.writeBoolean(false); } } } } - - public static List decode(BitString bitString, int elementBitStringLength, int numElements) - throws DecodingException { - int length = bitString.length(); - if (length > elementBitStringLength * numElements) { - throw new DecodingException("Undecodable FixedIntegerList '" + bitString + "'"); - } - - 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..85432eca 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,15 +1,15 @@ 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.datatype.IntegerSet; import com.iab.gpp.encoder.error.DecodingException; +import java.util.Collection; public class FixedIntegerRangeEncoder { private FixedIntegerRangeEncoder() {} - public static int encode(BitStringBuilder builder, Collection value) { - BitStringBuilder rangeBuilder = new BitStringBuilder(); + public static int encode(BitString builder, Collection value) { + BitString rangeBuilder = new BitString(); int groupStart = -1; int last = Integer.MIN_VALUE; int groupCount = 0; @@ -27,49 +27,35 @@ public static int encode(BitStringBuilder builder, Collection value) { groupCount++; writeGroup(rangeBuilder, groupStart, last); } - FixedIntegerEncoder.encode(builder,groupCount, 12); - builder.append(rangeBuilder); + builder.writeInt(groupCount, 12); + builder.write(rangeBuilder); return last; } - private static void writeGroup(BitStringBuilder builder, int groupStart, int last) { + private static void writeGroup(BitString builder, int groupStart, int last) { if (groupStart == last) { - builder.append(false); - FixedIntegerEncoder.encode(builder, groupStart, 16); + builder.writeBoolean(false); + builder.writeInt(groupStart, 16); } else { - builder.append(true); - FixedIntegerEncoder.encode(builder, groupStart, 16); - FixedIntegerEncoder.encode(builder, last, 16); + builder.writeBoolean(true); + builder.writeInt(groupStart, 16); + builder.writeInt(last, 16); } } - 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(BitString 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.readBoolean(); 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 deleted file mode 100644 index 9f0dba27..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedLongEncoder.java +++ /dev/null @@ -1,35 +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 FixedLongEncoder { - private FixedLongEncoder() {} - - public static void encode(BitStringBuilder builder, long value, int bitStringLength) { - long mask = 1L << bitStringLength; - if (value >= mask) { - throw new EncodingException( - "Numeric value '" + value + "' is too large for a bit string length of '" + bitStringLength + "'"); - } - for (int i = 0; i < bitStringLength; i++) { - mask >>= 1; - builder.append((value & mask) > 0); - } - } - - public static long decode(BitString bitString) throws DecodingException { - long value = 0; - - int length = bitString.length(); - for (int i = 0; i < length; i++) { - if (bitString.getValue(length - (i + 1))) { - value += 1L << i; - } - } - - return value; - } -} 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..ea2d970c 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,15 +1,14 @@ 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 FixedStringEncoder { private FixedStringEncoder() {} + private static final char SPACE = ' '; - public static void encode(BitStringBuilder builder, String value, int stringLength) { + public static void encode(BitString builder, String value, int stringLength) { int length = value.length(); for (int i = 0; i < stringLength; i++) { int code = SPACE; @@ -17,25 +16,19 @@ public static void encode(BitStringBuilder builder, String value, int stringLeng code = value.charAt(i); } if (code == SPACE) { - FixedIntegerEncoder.encode(builder, 63, 6); + builder.writeInt(63, 6); } else if (code >= 65) { - FixedIntegerEncoder.encode(builder, ((int) value.charAt(i)) - 65, 6); + builder.writeInt(((int) value.charAt(i)) - 65, 6); } else { throw new EncodingException("Unencodable FixedString '" + value + "'"); } } } - public static String decode(BitString bitString) { - int length = bitString.length(); - if (length % 6 != 0) { - throw new DecodingException("Undecodable FixedString '" + bitString + "'"); - } - + public static String decode(BitString 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/IntegerSet.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/IntegerSet.java deleted file mode 100644 index bc9aa3f7..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/IntegerSet.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.iab.gpp.encoder.datatype.encoder; - -import java.util.Collection; -import java.util.PrimitiveIterator; -import java.util.Set; -import java.util.stream.IntStream; - -public interface IntegerSet extends Set { - boolean containsInt(int value); - - default boolean containsAny(Collection c) { - for (Object e : c) { - if (!contains(e)) { - return false; - } - } - return true; - } - - boolean addInt(int value); - - boolean removeInt(int value); - - IntStream intStream(); - - @Override - PrimitiveIterator.OfInt iterator(); -} 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..a7656e0c 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,49 +1,39 @@ 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.datatype.IntegerSet; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; public class OptimizedFixedRangeEncoder { - public static void encode(BitStringBuilder builder, IntegerSet value) throws EncodingException { + public static void encode(BitString 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(); + BitString rangeBitString = new BitString(); int max = FixedIntegerRangeEncoder.encode(rangeBitString, value); int rangeLength = rangeBitString.length(); int bitFieldLength = max; if (rangeLength <= bitFieldLength) { - FixedIntegerEncoder.encode(builder, max, 16); - builder.append(true).append(rangeBitString); + builder.writeInt(max, 16); + builder.writeBoolean(true); + builder.write(rangeBitString); } else { - FixedIntegerEncoder.encode(builder, max, 16); - builder.append(false); + builder.writeInt(max, 16); + builder.writeBoolean(false); for (int i = 0; i < max; i++) { - builder.append(value.containsInt(i + 1)); + builder.writeBoolean(value.containsInt(i + 1)); } } } - 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(BitString reader) throws DecodingException { + int size = reader.readInt(16); + if (reader.readBoolean()) { + 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..291be775 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/FieldKey.java @@ -0,0 +1,23 @@ +package com.iab.gpp.encoder.field; + +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.FixedIntegerList; +import java.util.function.Predicate; + +public interface FieldKey { + DataType getType(); + + public static final Predicate VALIDATOR_012 = (n -> n >= 0 && n <= 2); + public static final Predicate VALIDATOR_12 = (n -> n >= 1 && n <= 2); + public static final Predicate VALIDATOR_LIST_012 = + (l -> { + int size = l.size(); + for (int i = 0; i < size; i++) { + int n = l.getInt(i); + if (n < 0 || n > 2) { + return false; + } + } + return true; + }); +} 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..249c411d 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,50 @@ package com.iab.gpp.encoder.field; +import com.iab.gpp.encoder.datatype.DataType; 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 LinkedHashMap map; + private final Integer[] indices; + private final DataType[] types; - FieldNames(String... names) { - this.list = Collections.unmodifiableList(Arrays.asList(names)); + @SafeVarargs + FieldNames(E... 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]; + this.types = new DataType[keys.length]; + for (int i = 0; i < keys.length; i++) { + E key = keys[i]; + this.map.put(key, key); + this.indices[key.ordinal()] = i; + this.types[i] = key.getType(); } } - public boolean contains(String name) { - return map.containsKey(name); + public int size() { + return types.length; } - static final FieldNames of(String... names) { - return new FieldNames(names); + @SuppressWarnings("unchecked") + public DataType get(int i) { + return (DataType) types[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); } + + @Override + public String toString() { + return Arrays.toString(types); + } } 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..ebe11eba 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,19 +1,26 @@ package com.iab.gpp.encoder.field; -public final class HeaderV1Field { - private HeaderV1Field() {} +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableFibonacciIntegerRange; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.section.HeaderV1; - public static final String ID = "Id"; - public static final String VERSION = "Version"; - public static final String SECTION_IDS = "SectionIds"; +public enum HeaderV1Field implements FieldKey { + ID(new EncodableFixedInteger<>("Id", 6, HeaderV1.ID)), + VERSION(new EncodableFixedInteger<>("Version", 6, HeaderV1.VERSION)), + SECTION_IDS(new EncodableFibonacciIntegerRange<>("SectionIds")); - //@formatter:off - public static final FieldNames HEADER_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - HeaderV1Field.ID, - HeaderV1Field.VERSION, - HeaderV1Field.SECTION_IDS - ); - //@formatter:on + private final DataType type; + HeaderV1Field(DataType type) { + this.type = type; + } + @Override + public DataType getType() { + return type; + } + + 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..6f264b7d 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,71 +1,87 @@ package com.iab.gpp.encoder.field; -public final class TcfCaV1Field { - private TcfCaV1Field() {} +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableArrayOfFixedIntegerRanges; +import com.iab.gpp.encoder.datatype.EncodableBoolean; +import com.iab.gpp.encoder.datatype.EncodableDatetime; +import com.iab.gpp.encoder.datatype.EncodableFixedBitfield; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedString; +import com.iab.gpp.encoder.datatype.EncodableFlexibleBitfield; +import com.iab.gpp.encoder.datatype.EncodableOptimizedFixedRange; +import com.iab.gpp.encoder.section.TcfCaV1; - 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"; +public enum TcfCaV1Field implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, TcfCaV1.VERSION)), + CREATED(new EncodableDatetime<>("Created")), + LAST_UPDATED(new EncodableDatetime<>("LastUpdated")), + CMP_ID(new EncodableFixedInteger<>("CmpId", 12, 0)), + CMP_VERSION(new EncodableFixedInteger<>("CmpVersion", 12, 0)), + CONSENT_SCREEN(new EncodableFixedInteger<>("ConsentScreen", 6, 0)), + CONSENT_LANGUAGE(new EncodableFixedString<>("ConsentLanguage", 2, "EN")), + VENDOR_LIST_VERSION(new EncodableFixedInteger<>("VendorListVersion", 12, 0)), + TCF_POLICY_VERSION(new EncodableFixedInteger<>("TcfPolicyVersion", 6, 2)), + USE_NON_STANDARD_STACKS(new EncodableBoolean<>("UseNonStandardStacks", false)), + SPECIAL_FEATURE_EXPRESS_CONSENT(new EncodableFixedBitfield<>("SpecialFeatureExpressConsent", 12)), + PURPOSES_EXPRESS_CONSENT(new EncodableFixedBitfield<>("PurposesExpressConsent", 24)), + PURPOSES_IMPLIED_CONSENT(new EncodableFixedBitfield<>("PurposesImpliedConsent", 24)), + VENDOR_EXPRESS_CONSENT(new EncodableOptimizedFixedRange<>("VendorExpressConsent")), + VENDOR_IMPLIED_CONSENT(new EncodableOptimizedFixedRange<>("VendorImpliedConsent")), + PUB_RESTRICTIONS(new EncodableArrayOfFixedIntegerRanges<>("PubRestrictions", 6, 2)), - 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"; + PUB_PURPOSES_SEGMENT_TYPE(new EncodableFixedInteger<>("PubPurposesSegmentType", 3, 3)), + PUB_PURPOSES_EXPRESS_CONSENT(new EncodableFixedBitfield<>("PubPurposesExpressConsent", 24)), + PUB_PURPOSES_IMPLIED_CONSENT(new EncodableFixedBitfield<>("PubPurposesImpliedConsent", 24)), + NUM_CUSTOM_PURPOSES(new EncodableFixedInteger<>("NumCustomPurposes", 6, 0)), + CUSTOM_PURPOSES_EXPRESS_CONSENT( + new EncodableFlexibleBitfield<>( + "CustomPurposesExpressConsent", TcfCaV1Field.NUM_CUSTOM_PURPOSES)), + CUSTOM_PURPOSES_IMPLIED_CONSENT( + new EncodableFlexibleBitfield<>( + "CustomPurposesImpliedConsent", TcfCaV1Field.NUM_CUSTOM_PURPOSES)), - public static final String DISCLOSED_VENDORS_SEGMENT_TYPE = "DisclosedVendorsSegmentType"; - public static final String DISCLOSED_VENDORS = "DisclosedVendors"; + DISCLOSED_VENDORS_SEGMENT_TYPE(new EncodableFixedInteger<>("DisclosedVendorsSegmentType", 3, 1)), + DISCLOSED_VENDORS(new EncodableOptimizedFixedRange<>("DisclosedVendors")); - //@formatter:off - public static final FieldNames TCFCAV1_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - TcfCaV1Field.VERSION, - TcfCaV1Field.CREATED, - TcfCaV1Field.LAST_UPDATED, - TcfCaV1Field.CMP_ID, - TcfCaV1Field.CMP_VERSION, - TcfCaV1Field.CONSENT_SCREEN, - TcfCaV1Field.CONSENT_LANGUAGE, - TcfCaV1Field.VENDOR_LIST_VERSION, - TcfCaV1Field.TCF_POLICY_VERSION, - TcfCaV1Field.USE_NON_STANDARD_STACKS, - TcfCaV1Field.SPECIAL_FEATURE_EXPRESS_CONSENT, - TcfCaV1Field.PURPOSES_EXPRESS_CONSENT, - TcfCaV1Field.PURPOSES_IMPLIED_CONSENT, - TcfCaV1Field.VENDOR_EXPRESS_CONSENT, - TcfCaV1Field.VENDOR_IMPLIED_CONSENT, - TcfCaV1Field.PUB_RESTRICTIONS - ); - //@formatter:on + private final DataType type; - //@formatter:off - public static final FieldNames TCFCAV1_PUBLISHER_PURPOSES_SEGMENT_FIELD_NAMES = FieldNames.of( - TcfCaV1Field.PUB_PURPOSES_SEGMENT_TYPE, - TcfCaV1Field.PUB_PURPOSES_EXPRESS_CONSENT, - TcfCaV1Field.PUB_PURPOSES_IMPLIED_CONSENT, - TcfCaV1Field.NUM_CUSTOM_PURPOSES, - TcfCaV1Field.CUSTOM_PURPOSES_EXPRESS_CONSENT, - TcfCaV1Field.CUSTOM_PURPOSES_IMPLIED_CONSENT - ); - //@formatter:on + TcfCaV1Field(DataType type) { + this.type = type; + } - //@formatter:off - public static final FieldNames TCFCAV1_DISCLOSED_VENDORS_SEGMENT_FIELD_NAMES = FieldNames.of( - TcfCaV1Field.DISCLOSED_VENDORS_SEGMENT_TYPE, - TcfCaV1Field.DISCLOSED_VENDORS - ); - //@formatter:on + @Override + public DataType getType() { + return type; + } + + public static final FieldNames TCFCAV1_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + TcfCaV1Field.VERSION, + TcfCaV1Field.CREATED, + TcfCaV1Field.LAST_UPDATED, + TcfCaV1Field.CMP_ID, + TcfCaV1Field.CMP_VERSION, + TcfCaV1Field.CONSENT_SCREEN, + TcfCaV1Field.CONSENT_LANGUAGE, + TcfCaV1Field.VENDOR_LIST_VERSION, + TcfCaV1Field.TCF_POLICY_VERSION, + TcfCaV1Field.USE_NON_STANDARD_STACKS, + TcfCaV1Field.SPECIAL_FEATURE_EXPRESS_CONSENT, + TcfCaV1Field.PURPOSES_EXPRESS_CONSENT, + TcfCaV1Field.PURPOSES_IMPLIED_CONSENT, + TcfCaV1Field.VENDOR_EXPRESS_CONSENT, + TcfCaV1Field.VENDOR_IMPLIED_CONSENT, + TcfCaV1Field.PUB_RESTRICTIONS); + + 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, + TcfCaV1Field.NUM_CUSTOM_PURPOSES, + TcfCaV1Field.CUSTOM_PURPOSES_EXPRESS_CONSENT, + TcfCaV1Field.CUSTOM_PURPOSES_IMPLIED_CONSENT); + + 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..45046e73 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,84 +1,96 @@ package com.iab.gpp.encoder.field; -public final class TcfEuV2Field { - private TcfEuV2Field() {} +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableArrayOfFixedIntegerRanges; +import com.iab.gpp.encoder.datatype.EncodableBoolean; +import com.iab.gpp.encoder.datatype.EncodableDatetime; +import com.iab.gpp.encoder.datatype.EncodableFixedBitfield; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedString; +import com.iab.gpp.encoder.datatype.EncodableFlexibleBitfield; +import com.iab.gpp.encoder.datatype.EncodableOptimizedFixedRange; +import com.iab.gpp.encoder.section.TcfEuV2; - 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"; +public enum TcfEuV2Field implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, TcfEuV2.VERSION)), + CREATED(new EncodableDatetime<>("Created")), + LAST_UPDATED(new EncodableDatetime<>("LastUpdated")), + CMP_ID(new EncodableFixedInteger<>("CmpId", 12, 0)), + CMP_VERSION(new EncodableFixedInteger<>("CmpVersion", 12, 0)), + CONSENT_SCREEN(new EncodableFixedInteger<>("ConsentScreen", 6, 0)), + CONSENT_LANGUAGE(new EncodableFixedString<>("ConsentLanguage", 2, "EN")), + VENDOR_LIST_VERSION(new EncodableFixedInteger<>("VendorListVersion", 12, 0)), + POLICY_VERSION(new EncodableFixedInteger<>("PolicyVersion", 6, 2)), + IS_SERVICE_SPECIFIC(new EncodableBoolean<>("IsServiceSpecific", false)), + USE_NON_STANDARD_STACKS(new EncodableBoolean<>("UseNonStandardStacks", false)), + SPECIAL_FEATURE_OPTINS(new EncodableFixedBitfield<>("SpecialFeatureOptins", 12)), + PURPOSE_CONSENTS(new EncodableFixedBitfield<>("PurposeConsents", 24)), + PURPOSE_LEGITIMATE_INTERESTS(new EncodableFixedBitfield<>("PurposeLegitimateInterests", 24)), + PURPOSE_ONE_TREATMENT(new EncodableBoolean<>("PurposeOneTreatment", false)), + PUBLISHER_COUNTRY_CODE(new EncodableFixedString<>("PublisherCountryCode", 2, "AA")), + VENDOR_CONSENTS(new EncodableOptimizedFixedRange<>("VendorConsents")), + VENDOR_LEGITIMATE_INTERESTS(new EncodableOptimizedFixedRange<>("VendorLegitimateInterests")), + PUBLISHER_RESTRICTIONS(new EncodableArrayOfFixedIntegerRanges<>("PublisherRestrictions", 6, 2)), + PUBLISHER_PURPOSES_SEGMENT_TYPE( + new EncodableFixedInteger<>("PublisherPurposesSegmentType", 3, 3)), + PUBLISHER_CONSENTS(new EncodableFixedBitfield<>("PublisherConsents", 24)), + PUBLISHER_LEGITIMATE_INTERESTS(new EncodableFixedBitfield<>("PublisherLegitimateInterests", 24)), + NUM_CUSTOM_PURPOSES(new EncodableFixedInteger<>("NumCustomPurposes", 6, 0)), + PUBLISHER_CUSTOM_CONSENTS( + new EncodableFlexibleBitfield<>("PublisherCustomConsents", TcfEuV2Field.NUM_CUSTOM_PURPOSES)), + PUBLISHER_CUSTOM_LEGITIMATE_INTERESTS( + new EncodableFlexibleBitfield<>( + "PublisherCustomLegitimateInterests", TcfEuV2Field.NUM_CUSTOM_PURPOSES)), + VENDORS_ALLOWED_SEGMENT_TYPE(new EncodableFixedInteger<>("VendorsAllowedSegmentType", 3, 2)), + VENDORS_ALLOWED(new EncodableOptimizedFixedRange<>("VendorsAllowed")), + VENDORS_DISCLOSED_SEGMENT_TYPE(new EncodableFixedInteger<>("VendorsDisclosedSegmentType", 3, 1)), + VENDORS_DISCLOSED(new EncodableOptimizedFixedRange<>("VendorsDisclosed")); - //@formatter:off - public static final FieldNames TCFEUV2_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - TcfEuV2Field.VERSION, - TcfEuV2Field.CREATED, - TcfEuV2Field.LAST_UPDATED, - TcfEuV2Field.CMP_ID, - TcfEuV2Field.CMP_VERSION, - TcfEuV2Field.CONSENT_SCREEN, - TcfEuV2Field.CONSENT_LANGUAGE, - TcfEuV2Field.VENDOR_LIST_VERSION, - TcfEuV2Field.POLICY_VERSION, - TcfEuV2Field.IS_SERVICE_SPECIFIC, - TcfEuV2Field.USE_NON_STANDARD_STACKS, - TcfEuV2Field.SPECIAL_FEATURE_OPTINS, - TcfEuV2Field.PURPOSE_CONSENTS, - TcfEuV2Field.PURPOSE_LEGITIMATE_INTERESTS, - TcfEuV2Field.PURPOSE_ONE_TREATMENT, - TcfEuV2Field.PUBLISHER_COUNTRY_CODE, - TcfEuV2Field.VENDOR_CONSENTS, - TcfEuV2Field.VENDOR_LEGITIMATE_INTERESTS, - TcfEuV2Field.PUBLISHER_RESTRICTIONS - ); - //@formatter:on + private final DataType type; - //@formatter:off - public static final FieldNames TCFEUV2_PUBLISHER_PURPOSES_SEGMENT_FIELD_NAMES = FieldNames.of( - TcfEuV2Field.PUBLISHER_PURPOSES_SEGMENT_TYPE, - TcfEuV2Field.PUBLISHER_CONSENTS, - TcfEuV2Field.PUBLISHER_LEGITIMATE_INTERESTS, - TcfEuV2Field.NUM_CUSTOM_PURPOSES, - TcfEuV2Field.PUBLISHER_CUSTOM_CONSENTS, - TcfEuV2Field.PUBLISHER_CUSTOM_LEGITIMATE_INTERESTS - ); - //@formatter:on + TcfEuV2Field(DataType type) { + this.type = type; + } - //@formatter:off - public static final FieldNames TCFEUV2_VENDORS_ALLOWED_SEGMENT_FIELD_NAMES = FieldNames.of( - TcfEuV2Field.VENDORS_ALLOWED_SEGMENT_TYPE, - TcfEuV2Field.VENDORS_ALLOWED - ); - //@formatter:on + @Override + public DataType getType() { + return type; + } - //@formatter:off - public static final FieldNames TCFEUV2_VENDORS_DISCLOSED_SEGMENT_FIELD_NAMES = FieldNames.of( - TcfEuV2Field.VENDORS_DISCLOSED_SEGMENT_TYPE, - TcfEuV2Field.VENDORS_DISCLOSED - ); - //@formatter:on + public static final FieldNames TCFEUV2_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + TcfEuV2Field.VERSION, + TcfEuV2Field.CREATED, + TcfEuV2Field.LAST_UPDATED, + TcfEuV2Field.CMP_ID, + TcfEuV2Field.CMP_VERSION, + TcfEuV2Field.CONSENT_SCREEN, + TcfEuV2Field.CONSENT_LANGUAGE, + TcfEuV2Field.VENDOR_LIST_VERSION, + TcfEuV2Field.POLICY_VERSION, + TcfEuV2Field.IS_SERVICE_SPECIFIC, + TcfEuV2Field.USE_NON_STANDARD_STACKS, + TcfEuV2Field.SPECIAL_FEATURE_OPTINS, + TcfEuV2Field.PURPOSE_CONSENTS, + TcfEuV2Field.PURPOSE_LEGITIMATE_INTERESTS, + TcfEuV2Field.PURPOSE_ONE_TREATMENT, + TcfEuV2Field.PUBLISHER_COUNTRY_CODE, + TcfEuV2Field.VENDOR_CONSENTS, + TcfEuV2Field.VENDOR_LEGITIMATE_INTERESTS, + TcfEuV2Field.PUBLISHER_RESTRICTIONS); + + public static final FieldNames TCFEUV2_PUBLISHER_PURPOSES_SEGMENT_FIELD_NAMES = + new FieldNames<>( + TcfEuV2Field.PUBLISHER_PURPOSES_SEGMENT_TYPE, + TcfEuV2Field.PUBLISHER_CONSENTS, + TcfEuV2Field.PUBLISHER_LEGITIMATE_INTERESTS, + TcfEuV2Field.NUM_CUSTOM_PURPOSES, + TcfEuV2Field.PUBLISHER_CUSTOM_CONSENTS, + TcfEuV2Field.PUBLISHER_CUSTOM_LEGITIMATE_INTERESTS); + + public static final FieldNames TCFEUV2_VENDORS_ALLOWED_SEGMENT_FIELD_NAMES = + new FieldNames<>(TcfEuV2Field.VENDORS_ALLOWED_SEGMENT_TYPE, TcfEuV2Field.VENDORS_ALLOWED); + + 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..ec362cb1 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,47 +1,62 @@ package com.iab.gpp.encoder.field; -public final class UsCaField { - private UsCaField() {} - - 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"; - - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; - - //@formatter:off - public static final FieldNames USCA_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - UsCaField.VERSION, - UsCaField.SALE_OPT_OUT_NOTICE, - UsCaField.SHARING_OPT_OUT_NOTICE, - UsCaField.SENSITIVE_DATA_LIMIT_USE_NOTICE, - UsCaField.SALE_OPT_OUT, - UsCaField.SHARING_OPT_OUT, - UsCaField.SENSITIVE_DATA_PROCESSING, - UsCaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - UsCaField.PERSONAL_DATA_CONSENTS, - UsCaField.MSPA_COVERED_TRANSACTION, - UsCaField.MSPA_OPT_OUT_OPTION_MODE, - UsCaField.MSPA_SERVICE_PROVIDER_MODE - ); - //@formatter:on - - //@formatter:off - public static final FieldNames USCA_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( - UsCaField.GPC_SEGMENT_TYPE, - UsCaField.GPC_SEGMENT_INCLUDED, - UsCaField.GPC - ); - //@formatter:on +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableBoolean; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; +import com.iab.gpp.encoder.datatype.UnencodableBoolean; +import com.iab.gpp.encoder.section.UsCa; + +public enum UsCaField implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, UsCa.VERSION)), + SALE_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SaleOptOutNotice", 2, 0, VALIDATOR_012)), + SHARING_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SharingOptOutNotice", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_LIMIT_USE_NOTICE( + new EncodableFixedInteger<>("SensitiveDataLimitUseNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT(new EncodableFixedInteger<>("SaleOptOut", 2, 0, VALIDATOR_012)), + SHARING_OPT_OUT(new EncodableFixedInteger<>("SharingOptOut", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING( + new EncodableFixedIntegerList<>("SensitiveDataProcessing", 2, 9, VALIDATOR_LIST_012)), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS( + new EncodableFixedIntegerList<>("KnownChildSensitiveDataConsents", 2, 2, VALIDATOR_LIST_012)), + PERSONAL_DATA_CONSENTS(new EncodableFixedInteger<>("PersonalDataConsents", 2, 0, VALIDATOR_012)), + MSPA_COVERED_TRANSACTION( + new EncodableFixedInteger<>("MspaCoveredTransaction", 2, 1, VALIDATOR_12)), + MSPA_OPT_OUT_OPTION_MODE( + new EncodableFixedInteger<>("MspaOptOutOptionMode", 2, 0, VALIDATOR_012)), + MSPA_SERVICE_PROVIDER_MODE( + new EncodableFixedInteger<>("MspaServiceProviderMode", 2, 0, VALIDATOR_012)), + + GPC_SEGMENT_TYPE(new EncodableFixedInteger<>("GpcSegmentType", 2, 1)), + GPC_SEGMENT_INCLUDED(new UnencodableBoolean<>("GpcSegmentIncluded", true)), + GPC(new EncodableBoolean<>("Gpc", false)); + + private final DataType type; + + UsCaField(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USCA_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsCaField.VERSION, + UsCaField.SALE_OPT_OUT_NOTICE, + UsCaField.SHARING_OPT_OUT_NOTICE, + UsCaField.SENSITIVE_DATA_LIMIT_USE_NOTICE, + UsCaField.SALE_OPT_OUT, + UsCaField.SHARING_OPT_OUT, + UsCaField.SENSITIVE_DATA_PROCESSING, + UsCaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsCaField.PERSONAL_DATA_CONSENTS, + UsCaField.MSPA_COVERED_TRANSACTION, + UsCaField.MSPA_OPT_OUT_OPTION_MODE, + UsCaField.MSPA_SERVICE_PROVIDER_MODE); + + 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..4c0b6856 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,45 +1,61 @@ package com.iab.gpp.encoder.field; -public final class UsCoField { - private UsCoField() {} - - 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"; - - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; - - //@formatter:off - public static final FieldNames USCO_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - UsCoField.VERSION, - UsCoField.SHARING_NOTICE, - UsCoField.SALE_OPT_OUT_NOTICE, - UsCoField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - UsCoField.SALE_OPT_OUT, - UsCoField.TARGETED_ADVERTISING_OPT_OUT, - UsCoField.SENSITIVE_DATA_PROCESSING, - UsCoField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - UsCoField.MSPA_COVERED_TRANSACTION, - UsCoField.MSPA_OPT_OUT_OPTION_MODE, - UsCoField.MSPA_SERVICE_PROVIDER_MODE - ); - //@formatter:on - - //@formatter:off - public static final FieldNames USCO_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( - UsCoField.GPC_SEGMENT_TYPE, - UsCoField.GPC_SEGMENT_INCLUDED, - UsCoField.GPC - ); - //@formatter:on +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableBoolean; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; +import com.iab.gpp.encoder.datatype.UnencodableBoolean; +import com.iab.gpp.encoder.section.UsCo; + +public enum UsCoField implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, UsCo.VERSION)), + SHARING_NOTICE(new EncodableFixedInteger<>("SharingNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SaleOptOutNotice", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("TargetedAdvertisingOptOutNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT(new EncodableFixedInteger<>("SaleOptOut", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT( + new EncodableFixedInteger<>("TargetedAdvertisingOptOut", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING( + new EncodableFixedIntegerList<>("SensitiveDataProcessing", 2, 7, VALIDATOR_LIST_012)), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS( + new EncodableFixedInteger<>("KnownChildSensitiveDataConsents", 2, 0, VALIDATOR_012)), + MSPA_COVERED_TRANSACTION( + new EncodableFixedInteger<>("MspaCoveredTransaction", 2, 1, VALIDATOR_12)), + MSPA_OPT_OUT_OPTION_MODE( + new EncodableFixedInteger<>("MspaOptOutOptionMode", 2, 0, VALIDATOR_012)), + MSPA_SERVICE_PROVIDER_MODE( + new EncodableFixedInteger<>("MspaServiceProviderMode", 2, 0, VALIDATOR_012)), + + GPC_SEGMENT_TYPE(new EncodableFixedInteger<>("GpcSegmentType", 2, 1)), + GPC_SEGMENT_INCLUDED(new UnencodableBoolean<>("GpcSegmentIncluded", true)), + GPC(new EncodableBoolean<>("Gpc", false)); + + private final DataType type; + + UsCoField(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USCO_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsCoField.VERSION, + UsCoField.SHARING_NOTICE, + UsCoField.SALE_OPT_OUT_NOTICE, + UsCoField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsCoField.SALE_OPT_OUT, + UsCoField.TARGETED_ADVERTISING_OPT_OUT, + UsCoField.SENSITIVE_DATA_PROCESSING, + UsCoField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsCoField.MSPA_COVERED_TRANSACTION, + UsCoField.MSPA_OPT_OUT_OPTION_MODE, + UsCoField.MSPA_SERVICE_PROVIDER_MODE); + + 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..b601a6d9 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,45 +1,61 @@ package com.iab.gpp.encoder.field; -public final class UsCtField { - private UsCtField() {} - - 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"; - - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; - - //@formatter:off - public static final FieldNames USCT_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - UsCtField.VERSION, - UsCtField.SHARING_NOTICE, - UsCtField.SALE_OPT_OUT_NOTICE, - UsCtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - UsCtField.SALE_OPT_OUT, - UsCtField.TARGETED_ADVERTISING_OPT_OUT, - UsCtField.SENSITIVE_DATA_PROCESSING, - UsCtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - UsCtField.MSPA_COVERED_TRANSACTION, - UsCtField.MSPA_OPT_OUT_OPTION_MODE, - UsCtField.MSPA_SERVICE_PROVIDER_MODE - ); - //@formatter:on - - //@formatter:off - public static final FieldNames USCT_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( - UsCtField.GPC_SEGMENT_TYPE, - UsCtField.GPC_SEGMENT_INCLUDED, - UsCtField.GPC - ); - //@formatter:on +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableBoolean; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; +import com.iab.gpp.encoder.datatype.UnencodableBoolean; +import com.iab.gpp.encoder.section.UsCt; + +public enum UsCtField implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, UsCt.VERSION)), + SHARING_NOTICE(new EncodableFixedInteger<>("SharingNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SaleOptOutNotice", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("TargetedAdvertisingOptOutNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT(new EncodableFixedInteger<>("SaleOptOut", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT( + new EncodableFixedInteger<>("TargetedAdvertisingOptOut", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING( + new EncodableFixedIntegerList<>("SensitiveDataProcessing", 2, 8, VALIDATOR_LIST_012)), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS( + new EncodableFixedIntegerList<>("KnownChildSensitiveDataConsents", 2, 3, VALIDATOR_LIST_012)), + MSPA_COVERED_TRANSACTION( + new EncodableFixedInteger<>("MspaCoveredTransaction", 2, 1, VALIDATOR_12)), + MSPA_OPT_OUT_OPTION_MODE( + new EncodableFixedInteger<>("MspaOptOutOptionMode", 2, 0, VALIDATOR_012)), + MSPA_SERVICE_PROVIDER_MODE( + new EncodableFixedInteger<>("MspaServiceProviderMode", 2, 0, VALIDATOR_012)), + + GPC_SEGMENT_TYPE(new EncodableFixedInteger<>("GpcSegmentType", 2, 1)), + GPC_SEGMENT_INCLUDED(new UnencodableBoolean<>("GpcSegmentIncluded", true)), + GPC(new EncodableBoolean<>("Gpc", false)); + + private final DataType type; + + UsCtField(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USCT_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsCtField.VERSION, + UsCtField.SHARING_NOTICE, + UsCtField.SALE_OPT_OUT_NOTICE, + UsCtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsCtField.SALE_OPT_OUT, + UsCtField.TARGETED_ADVERTISING_OPT_OUT, + UsCtField.SENSITIVE_DATA_PROCESSING, + UsCtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsCtField.MSPA_COVERED_TRANSACTION, + UsCtField.MSPA_OPT_OUT_OPTION_MODE, + UsCtField.MSPA_SERVICE_PROVIDER_MODE); + + 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..addd25db 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,47 +1,64 @@ package com.iab.gpp.encoder.field; -public final class UsDeField { - private UsDeField() {} - - 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"; - - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; - - //@formatter:off - public static final FieldNames USDE_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - UsDeField.VERSION, - UsDeField.PROCESSING_NOTICE, - UsDeField.SALE_OPT_OUT_NOTICE, - UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - UsDeField.SALE_OPT_OUT, - UsDeField.TARGETED_ADVERTISING_OPT_OUT, - UsDeField.SENSITIVE_DATA_PROCESSING, - UsDeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - UsDeField.ADDITIONAL_DATA_PROCESSING_CONSENT, - UsDeField.MSPA_COVERED_TRANSACTION, - UsDeField.MSPA_OPT_OUT_OPTION_MODE, - UsDeField.MSPA_SERVICE_PROVIDER_MODE - ); - //@formatter:on - - //@formatter:off - public static final FieldNames USDE_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( - UsDeField.GPC_SEGMENT_TYPE, - UsDeField.GPC_SEGMENT_INCLUDED, - UsDeField.GPC - ); - //@formatter:on +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableBoolean; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; +import com.iab.gpp.encoder.datatype.UnencodableBoolean; +import com.iab.gpp.encoder.section.UsDe; + +public enum UsDeField implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, UsDe.VERSION)), + PROCESSING_NOTICE(new EncodableFixedInteger<>("ProcessingNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SaleOptOutNotice", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("TargetedAdvertisingOptOutNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT(new EncodableFixedInteger<>("SaleOptOut", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT( + new EncodableFixedInteger<>("TargetedAdvertisingOptOut", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING( + new EncodableFixedIntegerList<>("SensitiveDataProcessing", 2, 9, VALIDATOR_LIST_012)), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS( + new EncodableFixedIntegerList<>("KnownChildSensitiveDataConsents", 2, 5, VALIDATOR_LIST_012)), + ADDITIONAL_DATA_PROCESSING_CONSENT( + new EncodableFixedInteger<>("AdditionalDataProcessingConsent", 2, 0, VALIDATOR_012)), + MSPA_COVERED_TRANSACTION( + new EncodableFixedInteger<>("MspaCoveredTransaction", 2, 1, VALIDATOR_12)), + MSPA_OPT_OUT_OPTION_MODE( + new EncodableFixedInteger<>("MspaOptOutOptionMode", 2, 0, VALIDATOR_012)), + MSPA_SERVICE_PROVIDER_MODE( + new EncodableFixedInteger<>("MspaServiceProviderMode", 2, 0, VALIDATOR_012)), + + GPC_SEGMENT_TYPE(new EncodableFixedInteger<>("GpcSegmentType", 2, 1)), + GPC_SEGMENT_INCLUDED(new UnencodableBoolean<>("GpcSegmentIncluded", true)), + GPC(new EncodableBoolean<>("Gpc", false)); + + private final DataType type; + + UsDeField(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USDE_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsDeField.VERSION, + UsDeField.PROCESSING_NOTICE, + UsDeField.SALE_OPT_OUT_NOTICE, + UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsDeField.SALE_OPT_OUT, + UsDeField.TARGETED_ADVERTISING_OPT_OUT, + UsDeField.SENSITIVE_DATA_PROCESSING, + UsDeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsDeField.ADDITIONAL_DATA_PROCESSING_CONSENT, + UsDeField.MSPA_COVERED_TRANSACTION, + UsDeField.MSPA_OPT_OUT_OPTION_MODE, + UsDeField.MSPA_SERVICE_PROVIDER_MODE); + + 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..6edaec57 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,35 +1,55 @@ package com.iab.gpp.encoder.field; -public final class UsFlField { - private UsFlField() {} +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; +import com.iab.gpp.encoder.section.UsFl; - 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"; +public enum UsFlField implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, UsFl.VERSION)), + PROCESSING_NOTICE(new EncodableFixedInteger<>("ProcessingNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SaleOptOutNotice", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("TargetedAdvertisingOptOutNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT(new EncodableFixedInteger<>("SaleOptOut", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT( + new EncodableFixedInteger<>("TargetedAdvertisingOptOut", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING( + new EncodableFixedIntegerList<>("SensitiveDataProcessing", 2, 8, VALIDATOR_LIST_012)), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS( + new EncodableFixedIntegerList<>("KnownChildSensitiveDataConsents", 2, 3, VALIDATOR_LIST_012)), + ADDITIONAL_DATA_PROCESSING_CONSENT( + new EncodableFixedInteger<>("AdditionalDataProcessingConsent", 2, 0, VALIDATOR_012)), + MSPA_COVERED_TRANSACTION( + new EncodableFixedInteger<>("MspaCoveredTransaction", 2, 1, VALIDATOR_12)), + MSPA_OPT_OUT_OPTION_MODE( + new EncodableFixedInteger<>("MspaOptOutOptionMode", 2, 0, VALIDATOR_012)), + MSPA_SERVICE_PROVIDER_MODE( + new EncodableFixedInteger<>("MspaServiceProviderMode", 2, 0, VALIDATOR_012)); - //@formatter:off - public static final FieldNames USFL_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - UsFlField.VERSION, - UsFlField.PROCESSING_NOTICE, - UsFlField.SALE_OPT_OUT_NOTICE, - UsFlField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - UsFlField.SALE_OPT_OUT, - UsFlField.TARGETED_ADVERTISING_OPT_OUT, - UsFlField.SENSITIVE_DATA_PROCESSING, - UsFlField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - UsFlField.ADDITIONAL_DATA_PROCESSING_CONSENT, - UsFlField.MSPA_COVERED_TRANSACTION, - UsFlField.MSPA_OPT_OUT_OPTION_MODE, - UsFlField.MSPA_SERVICE_PROVIDER_MODE - ); - //@formatter:on + private final DataType type; + + UsFlField(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USFL_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsFlField.VERSION, + UsFlField.PROCESSING_NOTICE, + UsFlField.SALE_OPT_OUT_NOTICE, + UsFlField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsFlField.SALE_OPT_OUT, + UsFlField.TARGETED_ADVERTISING_OPT_OUT, + UsFlField.SENSITIVE_DATA_PROCESSING, + UsFlField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsFlField.ADDITIONAL_DATA_PROCESSING_CONSENT, + UsFlField.MSPA_COVERED_TRANSACTION, + UsFlField.MSPA_OPT_OUT_OPTION_MODE, + UsFlField.MSPA_SERVICE_PROVIDER_MODE); } 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..2936a09d 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,47 +1,64 @@ package com.iab.gpp.encoder.field; -public final class UsIaField { - private UsIaField() {} - - 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"; - - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; - - //@formatter:off - public static final FieldNames USIA_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - UsIaField.VERSION, - UsIaField.PROCESSING_NOTICE, - UsIaField.SALE_OPT_OUT_NOTICE, - UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - UsIaField.SENSITIVE_DATA_OPT_OUT_NOTICE, - UsIaField.SALE_OPT_OUT, - UsIaField.TARGETED_ADVERTISING_OPT_OUT, - UsIaField.SENSITIVE_DATA_PROCESSING, - UsIaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - UsIaField.MSPA_COVERED_TRANSACTION, - UsIaField.MSPA_OPT_OUT_OPTION_MODE, - UsIaField.MSPA_SERVICE_PROVIDER_MODE - ); - //@formatter:on - - //@formatter:off - public static final FieldNames USIA_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( - UsIaField.GPC_SEGMENT_TYPE, - UsIaField.GPC_SEGMENT_INCLUDED, - UsIaField.GPC - ); - //@formatter:on +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableBoolean; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; +import com.iab.gpp.encoder.datatype.UnencodableBoolean; +import com.iab.gpp.encoder.section.UsIa; + +public enum UsIaField implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, UsIa.VERSION)), + PROCESSING_NOTICE(new EncodableFixedInteger<>("ProcessingNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SaleOptOutNotice", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("TargetedAdvertisingOptOutNotice", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("SensitiveDataOptOutNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT(new EncodableFixedInteger<>("SaleOptOut", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT( + new EncodableFixedInteger<>("TargetedAdvertisingOptOut", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING( + new EncodableFixedIntegerList<>("SensitiveDataProcessing", 2, 8, VALIDATOR_LIST_012)), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS( + new EncodableFixedInteger<>("KnownChildSensitiveDataConsents", 2, 0, VALIDATOR_012)), + MSPA_COVERED_TRANSACTION( + new EncodableFixedInteger<>("MspaCoveredTransaction", 2, 1, VALIDATOR_12)), + MSPA_OPT_OUT_OPTION_MODE( + new EncodableFixedInteger<>("MspaOptOutOptionMode", 2, 0, VALIDATOR_012)), + MSPA_SERVICE_PROVIDER_MODE( + new EncodableFixedInteger<>("MspaServiceProviderMode", 2, 0, VALIDATOR_012)), + + GPC_SEGMENT_TYPE(new EncodableFixedInteger<>("GpcSegmentType", 2, 1)), + GPC_SEGMENT_INCLUDED(new UnencodableBoolean<>("GpcSegmentIncluded", true)), + GPC(new EncodableBoolean<>("Gpc", false)); + + private final DataType type; + + UsIaField(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USIA_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsIaField.VERSION, + UsIaField.PROCESSING_NOTICE, + UsIaField.SALE_OPT_OUT_NOTICE, + UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsIaField.SENSITIVE_DATA_OPT_OUT_NOTICE, + UsIaField.SALE_OPT_OUT, + UsIaField.TARGETED_ADVERTISING_OPT_OUT, + UsIaField.SENSITIVE_DATA_PROCESSING, + UsIaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsIaField.MSPA_COVERED_TRANSACTION, + UsIaField.MSPA_OPT_OUT_OPTION_MODE, + UsIaField.MSPA_SERVICE_PROVIDER_MODE); + + 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/UsMnField.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsMnField.java new file mode 100644 index 00000000..7c78b06e --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsMnField.java @@ -0,0 +1,64 @@ +package com.iab.gpp.encoder.field; + +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableBoolean; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; +import com.iab.gpp.encoder.datatype.UnencodableBoolean; +import com.iab.gpp.encoder.section.UsMn; + +public enum UsMnField implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, UsMn.VERSION)), + PROCESSING_NOTICE(new EncodableFixedInteger<>("ProcessingNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SaleOptOutNotice", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("TargetedAdvertisingOptOutNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT(new EncodableFixedInteger<>("SaleOptOut", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT( + new EncodableFixedInteger<>("TargetedAdvertisingOptOut", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING( + new EncodableFixedIntegerList<>("SensitiveDataProcessing", 2, 8, VALIDATOR_LIST_012)), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS( + new EncodableFixedInteger<>("KnownChildSensitiveDataConsents", 2, 0, VALIDATOR_012)), + ADDITIONAL_DATA_PROCESSING_CONSENT( + new EncodableFixedInteger<>("AdditionalDataProcessingConsent", 2, 0, VALIDATOR_012)), + MSPA_COVERED_TRANSACTION( + new EncodableFixedInteger<>("MspaCoveredTransaction", 2, 1, VALIDATOR_12)), + MSPA_OPT_OUT_OPTION_MODE( + new EncodableFixedInteger<>("MspaOptOutOptionMode", 2, 0, VALIDATOR_012)), + MSPA_SERVICE_PROVIDER_MODE( + new EncodableFixedInteger<>("MspaServiceProviderMode", 2, 0, VALIDATOR_012)), + + GPC_SEGMENT_TYPE(new EncodableFixedInteger<>("GpcSegmentType", 2, 1)), + GPC_SEGMENT_INCLUDED(new UnencodableBoolean<>("GpcSegmentIncluded", true)), + GPC(new EncodableBoolean<>("Gpc", false)); + + private final DataType type; + + UsMnField(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USMN_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsMnField.VERSION, + UsMnField.PROCESSING_NOTICE, + UsMnField.SALE_OPT_OUT_NOTICE, + UsMnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsMnField.SALE_OPT_OUT, + UsMnField.TARGETED_ADVERTISING_OPT_OUT, + UsMnField.SENSITIVE_DATA_PROCESSING, + UsMnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsMnField.ADDITIONAL_DATA_PROCESSING_CONSENT, + UsMnField.MSPA_COVERED_TRANSACTION, + UsMnField.MSPA_OPT_OUT_OPTION_MODE, + UsMnField.MSPA_SERVICE_PROVIDER_MODE); + + public static final FieldNames USMN_GPC_SEGMENT_FIELD_NAMES = + new FieldNames<>(UsMnField.GPC_SEGMENT_TYPE, UsMnField.GPC_SEGMENT_INCLUDED, UsMnField.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..df7d4f4a 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,47 +1,64 @@ package com.iab.gpp.encoder.field; -public final class UsMtField { - private UsMtField() {} - - 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"; - - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; - - //@formatter:off - public static final FieldNames USMT_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - UsMtField.VERSION, - UsMtField.SHARING_NOTICE, - UsMtField.SALE_OPT_OUT_NOTICE, - UsMtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - UsMtField.SALE_OPT_OUT, - UsMtField.TARGETED_ADVERTISING_OPT_OUT, - UsMtField.SENSITIVE_DATA_PROCESSING, - UsMtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - UsMtField.ADDITIONAL_DATA_PROCESSING_CONSENT, - UsMtField.MSPA_COVERED_TRANSACTION, - UsMtField.MSPA_OPT_OUT_OPTION_MODE, - UsMtField.MSPA_SERVICE_PROVIDER_MODE - ); - //@formatter:on - - //@formatter:off - public static FieldNames USMT_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( - UsMtField.GPC_SEGMENT_TYPE, - UsMtField.GPC_SEGMENT_INCLUDED, - UsMtField.GPC - ); - //@formatter:on +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableBoolean; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; +import com.iab.gpp.encoder.datatype.UnencodableBoolean; +import com.iab.gpp.encoder.section.UsMt; + +public enum UsMtField implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, UsMt.VERSION)), + SHARING_NOTICE(new EncodableFixedInteger<>("SharingNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SaleOptOutNotice", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("TargetedAdvertisingOptOutNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT(new EncodableFixedInteger<>("SaleOptOut", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT( + new EncodableFixedInteger<>("TargetedAdvertisingOptOut", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING( + new EncodableFixedIntegerList<>("SensitiveDataProcessing", 2, 8, VALIDATOR_LIST_012)), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS( + new EncodableFixedIntegerList<>("KnownChildSensitiveDataConsents", 2, 3, VALIDATOR_LIST_012)), + ADDITIONAL_DATA_PROCESSING_CONSENT( + new EncodableFixedInteger<>("AdditionalDataProcessingConsent", 2, 0, VALIDATOR_012)), + MSPA_COVERED_TRANSACTION( + new EncodableFixedInteger<>("MspaCoveredTransaction", 2, 1, VALIDATOR_12)), + MSPA_OPT_OUT_OPTION_MODE( + new EncodableFixedInteger<>("MspaOptOutOptionMode", 2, 0, VALIDATOR_012)), + MSPA_SERVICE_PROVIDER_MODE( + new EncodableFixedInteger<>("MspaServiceProviderMode", 2, 0, VALIDATOR_012)), + + GPC_SEGMENT_TYPE(new EncodableFixedInteger<>("GpcSegmentType", 2, 1)), + GPC_SEGMENT_INCLUDED(new UnencodableBoolean<>("GpcSegmentIncluded", true)), + GPC(new EncodableBoolean<>("Gpc", false)); + + private final DataType type; + + UsMtField(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USMT_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsMtField.VERSION, + UsMtField.SHARING_NOTICE, + UsMtField.SALE_OPT_OUT_NOTICE, + UsMtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsMtField.SALE_OPT_OUT, + UsMtField.TARGETED_ADVERTISING_OPT_OUT, + UsMtField.SENSITIVE_DATA_PROCESSING, + UsMtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsMtField.ADDITIONAL_DATA_PROCESSING_CONSENT, + UsMtField.MSPA_COVERED_TRANSACTION, + UsMtField.MSPA_OPT_OUT_OPTION_MODE, + UsMtField.MSPA_SERVICE_PROVIDER_MODE); + + 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..3826d034 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,55 +1,149 @@ package com.iab.gpp.encoder.field; -public final class UsNatField { - private UsNatField() {} - - 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"; - - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; - - //@formatter:off - public static final FieldNames USNAT_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - UsNatField.VERSION, - UsNatField.SHARING_NOTICE, - UsNatField.SALE_OPT_OUT_NOTICE, - UsNatField.SHARING_OPT_OUT_NOTICE, - UsNatField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - UsNatField.SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE, - UsNatField.SENSITIVE_DATA_LIMIT_USE_NOTICE, - UsNatField.SALE_OPT_OUT, - UsNatField.SHARING_OPT_OUT, - UsNatField.TARGETED_ADVERTISING_OPT_OUT, - UsNatField.SENSITIVE_DATA_PROCESSING, - UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - UsNatField.PERSONAL_DATA_CONSENTS, - UsNatField.MSPA_COVERED_TRANSACTION, - UsNatField.MSPA_OPT_OUT_OPTION_MODE, - UsNatField.MSPA_SERVICE_PROVIDER_MODE - ); - //@formatter:on - - //@formatter:off - public static final FieldNames USNAT_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( - UsNatField.GPC_SEGMENT_TYPE, - UsNatField.GPC_SEGMENT_INCLUDED, - UsNatField.GPC - ); - //@formatter:on +import com.iab.gpp.encoder.bitstring.BitString; +import com.iab.gpp.encoder.datatype.AbstractDirtyableBitStringDataType; +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableBoolean; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.FixedIntegerList; +import com.iab.gpp.encoder.datatype.UnencodableBoolean; +import com.iab.gpp.encoder.datatype.encoder.FixedIntegerListEncoder; +import com.iab.gpp.encoder.section.UsNat; +import com.iab.gpp.encoder.segment.EncodableSegment; +import com.iab.gpp.encoder.segment.SegmentValueProvider; +import java.util.List; +import java.util.function.Predicate; + +public enum UsNatField implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, UsNat.VERSION)), + SHARING_NOTICE(new EncodableFixedInteger<>("SharingNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SaleOptOutNotice", 2, 0, VALIDATOR_012)), + SHARING_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SharingOptOutNotice", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("TargetedAdvertisingOptOutNotice", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("SensitiveDataProcessingOptOutNotice", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_LIMIT_USE_NOTICE( + new EncodableFixedInteger<>("SensitiveDataLimitUseNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT(new EncodableFixedInteger<>("SaleOptOut", 2, 0, VALIDATOR_012)), + SHARING_OPT_OUT(new EncodableFixedInteger<>("SharingOptOut", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT( + new EncodableFixedInteger<>("TargetedAdvertisingOptOut", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING( + new EncodableFlexibleIntegerList( + "SensitiveDataProcessing", 2, new VersionedLengthProvider(12, 16), VALIDATOR_LIST_012)), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS( + new EncodableFlexibleIntegerList( + "KnownChildSensitiveDataConsents", + 2, + new VersionedLengthProvider(2, 3), + VALIDATOR_LIST_012)), + PERSONAL_DATA_CONSENTS(new EncodableFixedInteger<>("PersonalDataConsents", 2, 0, VALIDATOR_012)), + MSPA_COVERED_TRANSACTION( + new EncodableFixedInteger<>("MspaCoveredTransaction", 2, 1, VALIDATOR_12)), + MSPA_OPT_OUT_OPTION_MODE( + new EncodableFixedInteger<>("MspaOptOutOptionMode", 2, 0, VALIDATOR_012)), + MSPA_SERVICE_PROVIDER_MODE( + new EncodableFixedInteger<>("MspaServiceProviderMode", 2, 0, VALIDATOR_012)), + + GPC_SEGMENT_TYPE(new EncodableFixedInteger<>("GpcSegmentType", 2, 1)), + GPC_SEGMENT_INCLUDED(new UnencodableBoolean<>("GpcSegmentIncluded", true)), + GPC(new EncodableBoolean<>("Gpc", false)); + + private final DataType type; + + UsNatField(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USNAT_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsNatField.VERSION, + UsNatField.SHARING_NOTICE, + UsNatField.SALE_OPT_OUT_NOTICE, + UsNatField.SHARING_OPT_OUT_NOTICE, + UsNatField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsNatField.SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE, + UsNatField.SENSITIVE_DATA_LIMIT_USE_NOTICE, + UsNatField.SALE_OPT_OUT, + UsNatField.SHARING_OPT_OUT, + UsNatField.TARGETED_ADVERTISING_OPT_OUT, + UsNatField.SENSITIVE_DATA_PROCESSING, + UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsNatField.PERSONAL_DATA_CONSENTS, + UsNatField.MSPA_COVERED_TRANSACTION, + UsNatField.MSPA_OPT_OUT_OPTION_MODE, + UsNatField.MSPA_SERVICE_PROVIDER_MODE); + + public static final FieldNames USNAT_GPC_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsNatField.GPC_SEGMENT_TYPE, UsNatField.GPC_SEGMENT_INCLUDED, UsNatField.GPC); + + // used for usnat v1 to v2 conversion, see note in UsNatCoreSegment + private static final class EncodableFlexibleIntegerList + extends AbstractDirtyableBitStringDataType { + + private final int elementBitStringLength; + private final VersionedLengthProvider lengthProvider; + + public EncodableFlexibleIntegerList( + String name, + int elementBitStringLength, + VersionedLengthProvider lengthProvider, + Predicate validator) { + super(name, validator); + this.elementBitStringLength = elementBitStringLength; + + this.lengthProvider = lengthProvider; + } + + @Override + protected FixedIntegerList initialize() { + return new FixedIntegerList(elementBitStringLength, lengthProvider.v2Length); + } + + @Override + protected void encode( + BitString builder, FixedIntegerList value, EncodableSegment segment) { + FixedIntegerListEncoder.encode( + builder, value, this.elementBitStringLength, lengthProvider.extract(segment)); + } + + @Override + protected FixedIntegerList decode(BitString reader, EncodableSegment segment) { + return reader.readFixedIntegerList(elementBitStringLength, lengthProvider.extract(segment)); + } + + @SuppressWarnings("unchecked") + @Override + protected FixedIntegerList processValue(FixedIntegerList oldValue, Object newValue) { + List list = (List) newValue; + int size = list.size(); + for (int i = 0; i < oldValue.size(); i++) { + oldValue.set(i, i < size ? list.get(i) : 0); + } + return oldValue; + } + } + + private static final class VersionedLengthProvider extends SegmentValueProvider { + + private final int v1Length; + private final int v2Length; + + public VersionedLengthProvider(int v1Length, int v2Length) { + super(UsNatField.VERSION); + this.v1Length = v1Length; + this.v2Length = v2Length; + } + + public int modify(int original) { + return original == 1 ? v1Length : v2Length; + } + } } 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..909a1535 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,47 +1,64 @@ package com.iab.gpp.encoder.field; -public final class UsNeField { - private UsNeField() {} - - 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"; - - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; - - //@formatter:off - public static final FieldNames USNE_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - UsNeField.VERSION, - UsNeField.PROCESSING_NOTICE, - UsNeField.SALE_OPT_OUT_NOTICE, - UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - UsNeField.SALE_OPT_OUT, - UsNeField.TARGETED_ADVERTISING_OPT_OUT, - UsNeField.SENSITIVE_DATA_PROCESSING, - UsNeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - UsNeField.ADDITIONAL_DATA_PROCESSING_CONSENT, - UsNeField.MSPA_COVERED_TRANSACTION, - UsNeField.MSPA_OPT_OUT_OPTION_MODE, - UsNeField.MSPA_SERVICE_PROVIDER_MODE - ); - //@formatter:on - - //@formatter:off - public static final FieldNames USNE_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( - UsNeField.GPC_SEGMENT_TYPE, - UsNeField.GPC_SEGMENT_INCLUDED, - UsNeField.GPC - ); - //@formatter:on +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableBoolean; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; +import com.iab.gpp.encoder.datatype.UnencodableBoolean; +import com.iab.gpp.encoder.section.UsNe; + +public enum UsNeField implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, UsNe.VERSION)), + PROCESSING_NOTICE(new EncodableFixedInteger<>("ProcessingNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SaleOptOutNotice", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("TargetedAdvertisingOptOutNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT(new EncodableFixedInteger<>("SaleOptOut", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT( + new EncodableFixedInteger<>("TargetedAdvertisingOptOut", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING( + new EncodableFixedIntegerList<>("SensitiveDataProcessing", 2, 8, VALIDATOR_LIST_012)), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS( + new EncodableFixedInteger<>("KnownChildSensitiveDataConsents", 2, 0, VALIDATOR_012)), + ADDITIONAL_DATA_PROCESSING_CONSENT( + new EncodableFixedInteger<>("AdditionalDataProcessingConsent", 2, 0, VALIDATOR_012)), + MSPA_COVERED_TRANSACTION( + new EncodableFixedInteger<>("MspaCoveredTransaction", 2, 1, VALIDATOR_12)), + MSPA_OPT_OUT_OPTION_MODE( + new EncodableFixedInteger<>("MspaOptOutOptionMode", 2, 0, VALIDATOR_012)), + MSPA_SERVICE_PROVIDER_MODE( + new EncodableFixedInteger<>("MspaServiceProviderMode", 2, 0, VALIDATOR_012)), + + GPC_SEGMENT_TYPE(new EncodableFixedInteger<>("GpcSegmentType", 2, 1)), + GPC_SEGMENT_INCLUDED(new UnencodableBoolean<>("GpcSegmentIncluded", true)), + GPC(new EncodableBoolean<>("Gpc", false)); + + private final DataType type; + + UsNeField(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USNE_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsNeField.VERSION, + UsNeField.PROCESSING_NOTICE, + UsNeField.SALE_OPT_OUT_NOTICE, + UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsNeField.SALE_OPT_OUT, + UsNeField.TARGETED_ADVERTISING_OPT_OUT, + UsNeField.SENSITIVE_DATA_PROCESSING, + UsNeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsNeField.ADDITIONAL_DATA_PROCESSING_CONSENT, + UsNeField.MSPA_COVERED_TRANSACTION, + UsNeField.MSPA_OPT_OUT_OPTION_MODE, + UsNeField.MSPA_SERVICE_PROVIDER_MODE); + + 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..77f19359 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,47 +1,64 @@ package com.iab.gpp.encoder.field; -public final class UsNhField { - private UsNhField() {} - - 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"; - - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; - - //@formatter:off - public static final FieldNames USNH_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - UsNhField.VERSION, - UsNhField.PROCESSING_NOTICE, - UsNhField.SALE_OPT_OUT_NOTICE, - UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - UsNhField.SALE_OPT_OUT, - UsNhField.TARGETED_ADVERTISING_OPT_OUT, - UsNhField.SENSITIVE_DATA_PROCESSING, - UsNhField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - UsNhField.ADDITIONAL_DATA_PROCESSING_CONSENT, - UsNhField.MSPA_COVERED_TRANSACTION, - UsNhField.MSPA_OPT_OUT_OPTION_MODE, - UsNhField.MSPA_SERVICE_PROVIDER_MODE - ); - //@formatter:on - - //@formatter:off - public static final FieldNames USNH_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( - UsNhField.GPC_SEGMENT_TYPE, - UsNhField.GPC_SEGMENT_INCLUDED, - UsNhField.GPC - ); - //@formatter:on +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableBoolean; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; +import com.iab.gpp.encoder.datatype.UnencodableBoolean; +import com.iab.gpp.encoder.section.UsNh; + +public enum UsNhField implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, UsNh.VERSION)), + PROCESSING_NOTICE(new EncodableFixedInteger<>("ProcessingNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SaleOptOutNotice", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("TargetedAdvertisingOptOutNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT(new EncodableFixedInteger<>("SaleOptOut", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT( + new EncodableFixedInteger<>("TargetedAdvertisingOptOut", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING( + new EncodableFixedIntegerList<>("SensitiveDataProcessing", 2, 8, VALIDATOR_LIST_012)), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS( + new EncodableFixedIntegerList<>("KnownChildSensitiveDataConsents", 2, 3, VALIDATOR_LIST_012)), + ADDITIONAL_DATA_PROCESSING_CONSENT( + new EncodableFixedInteger<>("AdditionalDataProcessingConsent", 2, 0, VALIDATOR_012)), + MSPA_COVERED_TRANSACTION( + new EncodableFixedInteger<>("MspaCoveredTransaction", 2, 1, VALIDATOR_12)), + MSPA_OPT_OUT_OPTION_MODE( + new EncodableFixedInteger<>("MspaOptOutOptionMode", 2, 0, VALIDATOR_012)), + MSPA_SERVICE_PROVIDER_MODE( + new EncodableFixedInteger<>("MspaServiceProviderMode", 2, 0, VALIDATOR_012)), + + GPC_SEGMENT_TYPE(new EncodableFixedInteger<>("GpcSegmentType", 2, 1)), + GPC_SEGMENT_INCLUDED(new UnencodableBoolean<>("GpcSegmentIncluded", true)), + GPC(new EncodableBoolean<>("Gpc", false)); + + private final DataType type; + + UsNhField(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USNH_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsNhField.VERSION, + UsNhField.PROCESSING_NOTICE, + UsNhField.SALE_OPT_OUT_NOTICE, + UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsNhField.SALE_OPT_OUT, + UsNhField.TARGETED_ADVERTISING_OPT_OUT, + UsNhField.SENSITIVE_DATA_PROCESSING, + UsNhField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsNhField.ADDITIONAL_DATA_PROCESSING_CONSENT, + UsNhField.MSPA_COVERED_TRANSACTION, + UsNhField.MSPA_OPT_OUT_OPTION_MODE, + UsNhField.MSPA_SERVICE_PROVIDER_MODE); + + 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..1af14b6d 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,47 +1,64 @@ package com.iab.gpp.encoder.field; -public final class UsNjField { - private UsNjField() {} - - 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"; - - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; - - //@formatter:off - public static final FieldNames USNJ_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - UsNjField.VERSION, - UsNjField.PROCESSING_NOTICE, - UsNjField.SALE_OPT_OUT_NOTICE, - UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - UsNjField.SALE_OPT_OUT, - UsNjField.TARGETED_ADVERTISING_OPT_OUT, - UsNjField.SENSITIVE_DATA_PROCESSING, - UsNjField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - UsNjField.ADDITIONAL_DATA_PROCESSING_CONSENT, - UsNjField.MSPA_COVERED_TRANSACTION, - UsNjField.MSPA_OPT_OUT_OPTION_MODE, - UsNjField.MSPA_SERVICE_PROVIDER_MODE - ); - //@formatter:on - - //@formatter:off - public static final FieldNames USNJ_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( - UsNjField.GPC_SEGMENT_TYPE, - UsNjField.GPC_SEGMENT_INCLUDED, - UsNjField.GPC - ); - //@formatter:on +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableBoolean; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; +import com.iab.gpp.encoder.datatype.UnencodableBoolean; +import com.iab.gpp.encoder.section.UsNj; + +public enum UsNjField implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, UsNj.VERSION)), + PROCESSING_NOTICE(new EncodableFixedInteger<>("ProcessingNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SaleOptOutNotice", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("TargetedAdvertisingOptOutNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT(new EncodableFixedInteger<>("SaleOptOut", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT( + new EncodableFixedInteger<>("TargetedAdvertisingOptOut", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING( + new EncodableFixedIntegerList<>("SensitiveDataProcessing", 2, 10, VALIDATOR_LIST_012)), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS( + new EncodableFixedIntegerList<>("KnownChildSensitiveDataConsents", 2, 5, VALIDATOR_LIST_012)), + ADDITIONAL_DATA_PROCESSING_CONSENT( + new EncodableFixedInteger<>("AdditionalDataProcessingConsent", 2, 0, VALIDATOR_012)), + MSPA_COVERED_TRANSACTION( + new EncodableFixedInteger<>("MspaCoveredTransaction", 2, 1, VALIDATOR_12)), + MSPA_OPT_OUT_OPTION_MODE( + new EncodableFixedInteger<>("MspaOptOutOptionMode", 2, 0, VALIDATOR_012)), + MSPA_SERVICE_PROVIDER_MODE( + new EncodableFixedInteger<>("MspaServiceProviderMode", 2, 0, VALIDATOR_012)), + + GPC_SEGMENT_TYPE(new EncodableFixedInteger<>("GpcSegmentType", 2, 1)), + GPC_SEGMENT_INCLUDED(new UnencodableBoolean<>("GpcSegmentIncluded", true)), + GPC(new EncodableBoolean<>("Gpc", false)); + + private final DataType type; + + UsNjField(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USNJ_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsNjField.VERSION, + UsNjField.PROCESSING_NOTICE, + UsNjField.SALE_OPT_OUT_NOTICE, + UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsNjField.SALE_OPT_OUT, + UsNjField.TARGETED_ADVERTISING_OPT_OUT, + UsNjField.SENSITIVE_DATA_PROCESSING, + UsNjField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsNjField.ADDITIONAL_DATA_PROCESSING_CONSENT, + UsNjField.MSPA_COVERED_TRANSACTION, + UsNjField.MSPA_OPT_OUT_OPTION_MODE, + UsNjField.MSPA_SERVICE_PROVIDER_MODE); + + 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..b030e519 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,47 +1,64 @@ package com.iab.gpp.encoder.field; -public final class UsOrField { - private UsOrField() {} - - 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"; - - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; - - //@formatter:off - public static final FieldNames USOR_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - UsOrField.VERSION, - UsOrField.PROCESSING_NOTICE, - UsOrField.SALE_OPT_OUT_NOTICE, - UsOrField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - UsOrField.SALE_OPT_OUT, - UsOrField.TARGETED_ADVERTISING_OPT_OUT, - UsOrField.SENSITIVE_DATA_PROCESSING, - UsOrField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - UsOrField.ADDITIONAL_DATA_PROCESSING_CONSENT, - UsOrField.MSPA_COVERED_TRANSACTION, - UsOrField.MSPA_OPT_OUT_OPTION_MODE, - UsOrField.MSPA_SERVICE_PROVIDER_MODE - ); - //@formatter:on - - //@formatter:off - public static final FieldNames USOR_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( - UsOrField.GPC_SEGMENT_TYPE, - UsOrField.GPC_SEGMENT_INCLUDED, - UsOrField.GPC - ); - //@formatter:on +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableBoolean; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; +import com.iab.gpp.encoder.datatype.UnencodableBoolean; +import com.iab.gpp.encoder.section.UsOr; + +public enum UsOrField implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, UsOr.VERSION)), + PROCESSING_NOTICE(new EncodableFixedInteger<>("ProcessingNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SaleOptOutNotice", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("TargetedAdvertisingOptOutNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT(new EncodableFixedInteger<>("SaleOptOut", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT( + new EncodableFixedInteger<>("TargetedAdvertisingOptOut", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING( + new EncodableFixedIntegerList<>("SensitiveDataProcessing", 2, 11, VALIDATOR_LIST_012)), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS( + new EncodableFixedIntegerList<>("KnownChildSensitiveDataConsents", 2, 3, VALIDATOR_LIST_012)), + ADDITIONAL_DATA_PROCESSING_CONSENT( + new EncodableFixedInteger<>("AdditionalDataProcessingConsent", 2, 0, VALIDATOR_012)), + MSPA_COVERED_TRANSACTION( + new EncodableFixedInteger<>("MspaCoveredTransaction", 2, 1, VALIDATOR_12)), + MSPA_OPT_OUT_OPTION_MODE( + new EncodableFixedInteger<>("MspaOptOutOptionMode", 2, 0, VALIDATOR_012)), + MSPA_SERVICE_PROVIDER_MODE( + new EncodableFixedInteger<>("MspaServiceProviderMode", 2, 0, VALIDATOR_012)), + + GPC_SEGMENT_TYPE(new EncodableFixedInteger<>("GpcSegmentType", 2, 1)), + GPC_SEGMENT_INCLUDED(new UnencodableBoolean<>("GpcSegmentIncluded", true)), + GPC(new EncodableBoolean<>("Gpc", false)); + + private final DataType type; + + UsOrField(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USOR_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsOrField.VERSION, + UsOrField.PROCESSING_NOTICE, + UsOrField.SALE_OPT_OUT_NOTICE, + UsOrField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsOrField.SALE_OPT_OUT, + UsOrField.TARGETED_ADVERTISING_OPT_OUT, + UsOrField.SENSITIVE_DATA_PROCESSING, + UsOrField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsOrField.ADDITIONAL_DATA_PROCESSING_CONSENT, + UsOrField.MSPA_COVERED_TRANSACTION, + UsOrField.MSPA_OPT_OUT_OPTION_MODE, + UsOrField.MSPA_SERVICE_PROVIDER_MODE); + + 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..c62bd765 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,47 +1,64 @@ package com.iab.gpp.encoder.field; -public final class UsTnField { - private UsTnField() {} - - 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"; - - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; - - //@formatter:off - public static final FieldNames USTN_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - UsTnField.VERSION, - UsTnField.PROCESSING_NOTICE, - UsTnField.SALE_OPT_OUT_NOTICE, - UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - UsTnField.SALE_OPT_OUT, - UsTnField.TARGETED_ADVERTISING_OPT_OUT, - UsTnField.SENSITIVE_DATA_PROCESSING, - UsTnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - UsTnField.ADDITIONAL_DATA_PROCESSING_CONSENT, - UsTnField.MSPA_COVERED_TRANSACTION, - UsTnField.MSPA_OPT_OUT_OPTION_MODE, - UsTnField.MSPA_SERVICE_PROVIDER_MODE - ); - //@formatter:on - - //@formatter:off - public static final FieldNames USTN_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( - UsTnField.GPC_SEGMENT_TYPE, - UsTnField.GPC_SEGMENT_INCLUDED, - UsTnField.GPC - ); - //@formatter:on +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableBoolean; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; +import com.iab.gpp.encoder.datatype.UnencodableBoolean; +import com.iab.gpp.encoder.section.UsTn; + +public enum UsTnField implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, UsTn.VERSION)), + PROCESSING_NOTICE(new EncodableFixedInteger<>("ProcessingNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SaleOptOutNotice", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("TargetedAdvertisingOptOutNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT(new EncodableFixedInteger<>("SaleOptOut", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT( + new EncodableFixedInteger<>("TargetedAdvertisingOptOut", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING( + new EncodableFixedIntegerList<>("SensitiveDataProcessing", 2, 8, VALIDATOR_LIST_012)), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS( + new EncodableFixedInteger<>("KnownChildSensitiveDataConsents", 2, 0, VALIDATOR_012)), + ADDITIONAL_DATA_PROCESSING_CONSENT( + new EncodableFixedInteger<>("AdditionalDataProcessingConsent", 2, 0, VALIDATOR_012)), + MSPA_COVERED_TRANSACTION( + new EncodableFixedInteger<>("MspaCoveredTransaction", 2, 1, VALIDATOR_12)), + MSPA_OPT_OUT_OPTION_MODE( + new EncodableFixedInteger<>("MspaOptOutOptionMode", 2, 0, VALIDATOR_012)), + MSPA_SERVICE_PROVIDER_MODE( + new EncodableFixedInteger<>("MspaServiceProviderMode", 2, 0, VALIDATOR_012)), + + GPC_SEGMENT_TYPE(new EncodableFixedInteger<>("GpcSegmentType", 2, 1)), + GPC_SEGMENT_INCLUDED(new UnencodableBoolean<>("GpcSegmentIncluded", true)), + GPC(new EncodableBoolean<>("Gpc", false)); + + private final DataType type; + + UsTnField(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USTN_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsTnField.VERSION, + UsTnField.PROCESSING_NOTICE, + UsTnField.SALE_OPT_OUT_NOTICE, + UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsTnField.SALE_OPT_OUT, + UsTnField.TARGETED_ADVERTISING_OPT_OUT, + UsTnField.SENSITIVE_DATA_PROCESSING, + UsTnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsTnField.ADDITIONAL_DATA_PROCESSING_CONSENT, + UsTnField.MSPA_COVERED_TRANSACTION, + UsTnField.MSPA_OPT_OUT_OPTION_MODE, + UsTnField.MSPA_SERVICE_PROVIDER_MODE); + + 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..227e97d8 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,47 +1,64 @@ package com.iab.gpp.encoder.field; -public final class UsTxField { - private UsTxField() {} - - 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"; - - public static final String GPC_SEGMENT_TYPE = "GpcSegmentType"; - public static final String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; - public static final String GPC = "Gpc"; - - //@formatter:off - public static final FieldNames USTX_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - UsTxField.VERSION, - UsTxField.PROCESSING_NOTICE, - UsTxField.SALE_OPT_OUT_NOTICE, - UsTxField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - UsTxField.SALE_OPT_OUT, - UsTxField.TARGETED_ADVERTISING_OPT_OUT, - UsTxField.SENSITIVE_DATA_PROCESSING, - UsTxField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - UsTxField.ADDITIONAL_DATA_PROCESSING_CONSENT, - UsTxField.MSPA_COVERED_TRANSACTION, - UsTxField.MSPA_OPT_OUT_OPTION_MODE, - UsTxField.MSPA_SERVICE_PROVIDER_MODE - ); - //@formatter:on - - //@formatter:off - public static FieldNames USTX_GPC_SEGMENT_FIELD_NAMES = FieldNames.of( - UsTxField.GPC_SEGMENT_TYPE, - UsTxField.GPC_SEGMENT_INCLUDED, - UsTxField.GPC - ); - //@formatter:on +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableBoolean; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; +import com.iab.gpp.encoder.datatype.UnencodableBoolean; +import com.iab.gpp.encoder.section.UsTx; + +public enum UsTxField implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, UsTx.VERSION)), + PROCESSING_NOTICE(new EncodableFixedInteger<>("ProcessingNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SaleOptOutNotice", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("TargetedAdvertisingOptOutNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT(new EncodableFixedInteger<>("SaleOptOut", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT( + new EncodableFixedInteger<>("TargetedAdvertisingOptOut", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING( + new EncodableFixedIntegerList<>("SensitiveDataProcessing", 2, 8, VALIDATOR_LIST_012)), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS( + new EncodableFixedInteger<>("KnownChildSensitiveDataConsents", 2, 0, VALIDATOR_012)), + ADDITIONAL_DATA_PROCESSING_CONSENT( + new EncodableFixedInteger<>("AdditionalDataProcessingConsent", 2, 0, VALIDATOR_012)), + MSPA_COVERED_TRANSACTION( + new EncodableFixedInteger<>("MspaCoveredTransaction", 2, 1, VALIDATOR_12)), + MSPA_OPT_OUT_OPTION_MODE( + new EncodableFixedInteger<>("MspaOptOutOptionMode", 2, 0, VALIDATOR_012)), + MSPA_SERVICE_PROVIDER_MODE( + new EncodableFixedInteger<>("MspaServiceProviderMode", 2, 0, VALIDATOR_012)), + + GPC_SEGMENT_TYPE(new EncodableFixedInteger<>("GpcSegmentType", 2, 1)), + GPC_SEGMENT_INCLUDED(new UnencodableBoolean<>("GpcSegmentIncluded", true)), + GPC(new EncodableBoolean<>("Gpc", false)); + + private final DataType type; + + UsTxField(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USTX_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsTxField.VERSION, + UsTxField.PROCESSING_NOTICE, + UsTxField.SALE_OPT_OUT_NOTICE, + UsTxField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsTxField.SALE_OPT_OUT, + UsTxField.TARGETED_ADVERTISING_OPT_OUT, + UsTxField.SENSITIVE_DATA_PROCESSING, + UsTxField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsTxField.ADDITIONAL_DATA_PROCESSING_CONSENT, + UsTxField.MSPA_COVERED_TRANSACTION, + UsTxField.MSPA_OPT_OUT_OPTION_MODE, + UsTxField.MSPA_SERVICE_PROVIDER_MODE); + + 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..bc66fe8b 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,35 +1,55 @@ package com.iab.gpp.encoder.field; -public final class UsUtField { - private UsUtField() {} +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; +import com.iab.gpp.encoder.section.UsUt; - 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"; +public enum UsUtField implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, UsUt.VERSION)), + SHARING_NOTICE(new EncodableFixedInteger<>("SharingNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SaleOptOutNotice", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("TargetedAdvertisingOptOutNotice", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("SensitiveDataProcessingOptOutNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT(new EncodableFixedInteger<>("SaleOptOut", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT( + new EncodableFixedInteger<>("TargetedAdvertisingOptOut", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING( + new EncodableFixedIntegerList<>("SensitiveDataProcessing", 2, 8, VALIDATOR_LIST_012)), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS( + new EncodableFixedInteger<>("KnownChildSensitiveDataConsents", 2, 0, VALIDATOR_012)), + MSPA_COVERED_TRANSACTION( + new EncodableFixedInteger<>("MspaCoveredTransaction", 2, 1, VALIDATOR_12)), + MSPA_OPT_OUT_OPTION_MODE( + new EncodableFixedInteger<>("MspaOptOutOptionMode", 2, 0, VALIDATOR_012)), + MSPA_SERVICE_PROVIDER_MODE( + new EncodableFixedInteger<>("MspaServiceProviderMode", 2, 0, VALIDATOR_012)); - //@formatter:off - public static final FieldNames USUT_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - UsUtField.VERSION, - UsUtField.SHARING_NOTICE, - UsUtField.SALE_OPT_OUT_NOTICE, - UsUtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - UsUtField.SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE, - UsUtField.SALE_OPT_OUT, - UsUtField.TARGETED_ADVERTISING_OPT_OUT, - UsUtField.SENSITIVE_DATA_PROCESSING, - UsUtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - UsUtField.MSPA_COVERED_TRANSACTION, - UsUtField.MSPA_OPT_OUT_OPTION_MODE, - UsUtField.MSPA_SERVICE_PROVIDER_MODE - ); - //@formatter:on + private final DataType type; + + UsUtField(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USUT_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsUtField.VERSION, + UsUtField.SHARING_NOTICE, + UsUtField.SALE_OPT_OUT_NOTICE, + UsUtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsUtField.SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE, + UsUtField.SALE_OPT_OUT, + UsUtField.TARGETED_ADVERTISING_OPT_OUT, + UsUtField.SENSITIVE_DATA_PROCESSING, + UsUtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsUtField.MSPA_COVERED_TRANSACTION, + UsUtField.MSPA_OPT_OUT_OPTION_MODE, + UsUtField.MSPA_SERVICE_PROVIDER_MODE); } 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..459e45e8 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,33 +1,52 @@ package com.iab.gpp.encoder.field; -public final class UsVaField { - private UsVaField() {} +import com.iab.gpp.encoder.datatype.DataType; +import com.iab.gpp.encoder.datatype.EncodableFixedInteger; +import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList; +import com.iab.gpp.encoder.section.UsVa; - 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"; +public enum UsVaField implements FieldKey { + VERSION(new EncodableFixedInteger<>("Version", 6, UsVa.VERSION)), + SHARING_NOTICE(new EncodableFixedInteger<>("SharingNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT_NOTICE(new EncodableFixedInteger<>("SaleOptOutNotice", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT_NOTICE( + new EncodableFixedInteger<>("TargetedAdvertisingOptOutNotice", 2, 0, VALIDATOR_012)), + SALE_OPT_OUT(new EncodableFixedInteger<>("SaleOptOut", 2, 0, VALIDATOR_012)), + TARGETED_ADVERTISING_OPT_OUT( + new EncodableFixedInteger<>("TargetedAdvertisingOptOut", 2, 0, VALIDATOR_012)), + SENSITIVE_DATA_PROCESSING( + new EncodableFixedIntegerList<>("SensitiveDataProcessing", 2, 8, VALIDATOR_LIST_012)), + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS( + new EncodableFixedInteger<>("KnownChildSensitiveDataConsents", 2, 0, VALIDATOR_012)), + MSPA_COVERED_TRANSACTION( + new EncodableFixedInteger<>("MspaCoveredTransaction", 2, 1, VALIDATOR_12)), + MSPA_OPT_OUT_OPTION_MODE( + new EncodableFixedInteger<>("MspaOptOutOptionMode", 2, 0, VALIDATOR_012)), + MSPA_SERVICE_PROVIDER_MODE( + new EncodableFixedInteger<>("MspaServiceProviderMode", 2, 0, VALIDATOR_012)); - //@formatter:off - public static final FieldNames USVA_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - UsVaField.VERSION, - UsVaField.SHARING_NOTICE, - UsVaField.SALE_OPT_OUT_NOTICE, - UsVaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - UsVaField.SALE_OPT_OUT, - UsVaField.TARGETED_ADVERTISING_OPT_OUT, - UsVaField.SENSITIVE_DATA_PROCESSING, - UsVaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - UsVaField.MSPA_COVERED_TRANSACTION, - UsVaField.MSPA_OPT_OUT_OPTION_MODE, - UsVaField.MSPA_SERVICE_PROVIDER_MODE - ); - //@formatter:on + private final DataType type; + + UsVaField(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USVA_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UsVaField.VERSION, + UsVaField.SHARING_NOTICE, + UsVaField.SALE_OPT_OUT_NOTICE, + UsVaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsVaField.SALE_OPT_OUT, + UsVaField.TARGETED_ADVERTISING_OPT_OUT, + UsVaField.SENSITIVE_DATA_PROCESSING, + UsVaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsVaField.MSPA_COVERED_TRANSACTION, + UsVaField.MSPA_OPT_OUT_OPTION_MODE, + UsVaField.MSPA_SERVICE_PROVIDER_MODE); } 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..0888b876 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,19 +1,30 @@ package com.iab.gpp.encoder.field; -public final class UspV1Field { - private UspV1Field() {} +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.section.UspV1; - 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"; +public enum UspV1Field implements FieldKey { + VERSION(new UnencodableInteger<>("Version", UspV1.VERSION)), + NOTICE(new UnencodableCharacter<>("Notice", '-', (v -> v == 'Y' || v == 'N' || v == '-'))), + OPT_OUT_SALE( + new UnencodableCharacter<>("OptOutSale", '-', (v -> v == 'Y' || v == 'N' || v == '-'))), + LSPA_COVERED( + new UnencodableCharacter<>("LspaCovered", '-', (v -> v == 'Y' || v == 'N' || v == '-'))); - //@formatter:off - public static final FieldNames USPV1_CORE_SEGMENT_FIELD_NAMES = FieldNames.of( - UspV1Field.VERSION, - UspV1Field.NOTICE, - UspV1Field.OPT_OUT_SALE, - UspV1Field.LSPA_COVERED - ); - //@formatter:on + private final DataType type; + + UspV1Field(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + public static final FieldNames USPV1_CORE_SEGMENT_FIELD_NAMES = + new FieldNames<>( + UspV1Field.VERSION, UspV1Field.NOTICE, UspV1Field.OPT_OUT_SALE, UspV1Field.LSPA_COVERED); } 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..126dca76 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/AbstractEncodable.java @@ -0,0 +1,46 @@ +package com.iab.gpp.encoder.section; + +import com.iab.gpp.encoder.datatype.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/AbstractUsSection.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/AbstractUsSection.java new file mode 100644 index 00000000..2e25a6cd --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/AbstractUsSection.java @@ -0,0 +1,12 @@ +package com.iab.gpp.encoder.section; + +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.segment.EncodableSegment; + +public abstract class AbstractUsSection & FieldKey> extends EncodableSection { + + @SafeVarargs + protected AbstractUsSection(EncodableSegment... segments) { + super(segments); + } +} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/AbstractUsSectionWithGpc.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/AbstractUsSectionWithGpc.java new file mode 100644 index 00000000..2fce4634 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/AbstractUsSectionWithGpc.java @@ -0,0 +1,56 @@ +package com.iab.gpp.encoder.section; + +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.segment.EncodableSegment; +import java.util.ArrayList; +import java.util.List; + +public abstract class AbstractUsSectionWithGpc & FieldKey> + extends AbstractUsSection { + + protected AbstractUsSectionWithGpc( + EncodableSegment coreSegment, EncodableSegment gpcSegment) { + super(coreSegment, gpcSegment); + } + + protected abstract E getGpcSegmentIncludedKey(); + + @Override + protected final void doDecode(CharSequence encodedString) { + List encodedSegments = SlicedCharSequence.split(encodedString, '.'); + int numEncodedSegments = encodedSegments.size(); + + if (numEncodedSegments > 0) { + getSegment(0).decode(encodedSegments.get(0)); + } + + E gpcSegmentIncludedKey = getGpcSegmentIncludedKey(); + if (numEncodedSegments > 1) { + getSegment(1).setFieldValue(gpcSegmentIncludedKey, Boolean.TRUE); + getSegment(1).decode(encodedSegments.get(1)); + } else { + getSegment(1).setFieldValue(gpcSegmentIncludedKey, Boolean.FALSE); + } + } + + @Override + protected final CharSequence doEncode() { + int size = size(); + List encodedSegments = new ArrayList<>(size); + + encodedSegments.add(getSegment(0).encodeCharSequence()); + if (size >= 2 && getGpcSegmentIncluded()) { + encodedSegments.add(getSegment(1).encodeCharSequence()); + } + + return SlicedCharSequence.join('.', encodedSegments); + } + + public abstract Integer getGpcSegmentType(); + + public Boolean getGpcSegmentIncluded() { + return (Boolean) getSegment(1).getFieldValue(getGpcSegmentIncludedKey()); + } + + public abstract Boolean getGpc(); +} 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..14b5d3dc 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,182 @@ package com.iab.gpp.encoder.section; -public interface EncodableSection { +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.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(); - void decode(CharSequence encodedString); + // this is a default implementation for single segment sections + @Override + protected void doDecode(CharSequence encodedString) { + if (size() > 1) { + throw new DecodingException("too many sections to decode"); + } + getSegment(0).decode(encodedString); + } + + // this is a default implementation for single segment sections + @Override + protected CharSequence doEncode() { + if (size() > 1) { + throw new EncodingException("too many sections to encode"); + } + return getSegment(0).encodeCharSequence(); + } + + 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) { + 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.hasField(fieldName)) { + 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) { + return segment.getFieldValue(key); + } + } + + 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); + if (segment.hasField(fieldName)) { + return segment.getFieldValue(fieldName); + } + } + + 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) { + segment.setFieldValue(key, 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); + if (segment.hasField(fieldName)) { + segment.setFieldValue(fieldName, 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(); + } } 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..d6f4485a 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.datatype.IntegerSet; import com.iab.gpp.encoder.field.HeaderV1Field; -import com.iab.gpp.encoder.segment.EncodableSegment; -import com.iab.gpp.encoder.segment.HeaderV1CoreSegment; +import com.iab.gpp.encoder.segment.Base64Segment; -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 Base64Segment<>(HeaderV1Field.HEADER_CORE_SEGMENT_FIELD_NAMES)); } 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..b881e885 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 @@ -1,32 +1,55 @@ package com.iab.gpp.encoder.section; import java.util.ArrayList; +import java.util.Collections; import java.util.List; 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(); + } + List out = null; + int next = 0; + while ((next = base.indexOf(splitter, start, end)) != -1) { + if (out == null) { + // most sections/segments have less than 4 components + out = new ArrayList<>(4); } + out.add(new SlicedCharSequence(base, start, next)); + start = next + 1; + } + if (out == null) { + return Collections.singletonList(charSequence); } - out.add(new SlicedCharSequence(charSequence, start, length)); + out.add(new SlicedCharSequence(base, start, end)); return out; } @@ -50,7 +73,6 @@ public static final CharSequence join(char glue, List pieces) { return EMPTY; } - @Override public int length() { return end - start; @@ -68,7 +90,6 @@ 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..fc14c315 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 @@ -1,31 +1,29 @@ package com.iab.gpp.encoder.section; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import com.iab.gpp.encoder.datatype.IntegerSet; 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; +import com.iab.gpp.encoder.segment.Base64Segment; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; -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 Base64Segment<>(TcfCaV1Field.TCFCAV1_CORE_SEGMENT_FIELD_NAMES), + new Base64Segment<>(TcfCaV1Field.TCFCAV1_PUBLISHER_PURPOSES_SEGMENT_FIELD_NAMES), + new Base64Segment<>(TcfCaV1Field.TCFCAV1_DISCLOSED_VENDORS_SEGMENT_FIELD_NAMES)); } public TcfCaV1(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -45,73 +43,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()); - if(!this.getDisclosedVendors().isEmpty()) { - encodedSegments.add(segments.get(2).encodeCharSequence()); + encodedSegments.add(getSegment(0).encodeCharSequence()); + encodedSegments.add(getSegment(1).encodeCharSequence()); + if (!this.getDisclosedVendors().isEmpty()) { + encodedSegments.add(getSegment(2).encodeCharSequence()); } - return SlicedCharSequence.join('.', encodedSegments); + 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); } @@ -204,5 +191,4 @@ public Integer getDisclosedVendorsSegmentType() { public IntegerSet getDisclosedVendors() { return (IntegerSet) this.getFieldValue(TcfCaV1Field.DISCLOSED_VENDORS); } - } 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..dbcd95d7 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 @@ -1,32 +1,30 @@ package com.iab.gpp.encoder.section; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import com.iab.gpp.encoder.datatype.IntegerSet; 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; +import com.iab.gpp.encoder.segment.TraditionalBase64Segment; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; -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 TraditionalBase64Segment<>(TcfEuV2Field.TCFEUV2_CORE_SEGMENT_FIELD_NAMES), + new TraditionalBase64Segment<>(TcfEuV2Field.TCFEUV2_PUBLISHER_PURPOSES_SEGMENT_FIELD_NAMES), + new TraditionalBase64Segment<>(TcfEuV2Field.TCFEUV2_VENDORS_ALLOWED_SEGMENT_FIELD_NAMES), + new TraditionalBase64Segment<>(TcfEuV2Field.TCFEUV2_VENDORS_DISCLOSED_SEGMENT_FIELD_NAMES)); } public TcfEuV2(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -46,89 +44,77 @@ 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()); } } } } - return SlicedCharSequence.join('.', encodedSegments); + return SlicedCharSequence.join('.', encodedSegments); } @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); } @@ -241,6 +227,4 @@ public Integer getVendorsDisclosedSegmentType() { public IntegerSet getVendorsDisclosed() { return (IntegerSet) this.getFieldValue(TcfEuV2Field.VENDORS_DISCLOSED); } - - } 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..c51eb0da 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,23 @@ 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; +import com.iab.gpp.encoder.segment.Base64Segment; -public class UsCa extends AbstractLazilyEncodableSection { +public class UsCa extends AbstractUsSectionWithGpc { public static final int ID = 8; public static final int VERSION = 1; public static final String NAME = "usca"; public UsCa() { - super(); + super( + new Base64Segment<>(UsCaField.USCA_CORE_SEGMENT_FIELD_NAMES), + new Base64Segment<>(UsCaField.USCA_GPC_SEGMENT_FIELD_NAMES)); } public UsCa(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,45 +37,10 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsCaCoreSegment(), new UsCaGpcSegment()); + protected final UsCaField getGpcSegmentIncludedKey() { + return UsCaField.GPC_SEGMENT_INCLUDED; } - @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); - } - } - - return segments; - } - - @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()); - } - } - - return SlicedCharSequence.join('.', encodedSegments); - } - - public Integer getSaleOptOutNotice() { return (Integer) this.getFieldValue(UsCaField.SALE_OPT_OUT_NOTICE); } @@ -98,14 +61,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() { @@ -128,10 +89,6 @@ public Integer getGpcSegmentType() { return (Integer) this.getFieldValue(UsCaField.GPC_SEGMENT_TYPE); } - public Boolean getGpcSegmentIncluded() { - return (Boolean) this.getFieldValue(UsCaField.GPC_SEGMENT_INCLUDED); - } - public Boolean getGpc() { return (Boolean) this.getFieldValue(UsCaField.GPC); } 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..63f6de51 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,23 @@ 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; +import com.iab.gpp.encoder.segment.Base64Segment; -public class UsCo extends AbstractLazilyEncodableSection { +public class UsCo extends AbstractUsSectionWithGpc { public static final int ID = 10; public static final int VERSION = 1; public static final String NAME = "usco"; public UsCo() { - super(); + super( + new Base64Segment<>(UsCoField.USCO_CORE_SEGMENT_FIELD_NAMES), + new Base64Segment<>(UsCoField.USCO_GPC_SEGMENT_FIELD_NAMES)); } public UsCo(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,45 +37,10 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsCoCoreSegment(), new UsCoGpcSegment()); + protected final UsCoField getGpcSegmentIncludedKey() { + return UsCoField.GPC_SEGMENT_INCLUDED; } - @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); - } - } - - return segments; - } - - @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()); - } - } - - return SlicedCharSequence.join('.', encodedSegments); - } - - public Integer getSharingNotice() { return (Integer) this.getFieldValue(UsCoField.SHARING_NOTICE); } @@ -98,9 +61,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() { @@ -123,10 +85,6 @@ public Integer getGpcSegmentType() { return (Integer) this.getFieldValue(UsCoField.GPC_SEGMENT_TYPE); } - public Boolean getGpcSegmentIncluded() { - return (Boolean) this.getFieldValue(UsCoField.GPC_SEGMENT_INCLUDED); - } - public Boolean getGpc() { return (Boolean) this.getFieldValue(UsCoField.GPC); } 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..5d1cdddc 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,23 @@ 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; +import com.iab.gpp.encoder.segment.Base64Segment; -public class UsCt extends AbstractLazilyEncodableSection { +public class UsCt extends AbstractUsSectionWithGpc { public static final int ID = 12; public static final int VERSION = 1; public static final String NAME = "usct"; public UsCt() { - super(); + super( + new Base64Segment<>(UsCtField.USCT_CORE_SEGMENT_FIELD_NAMES), + new Base64Segment<>(UsCtField.USCT_GPC_SEGMENT_FIELD_NAMES)); } public UsCt(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,45 +37,10 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsCtCoreSegment(), new UsCtGpcSegment()); + protected final UsCtField getGpcSegmentIncludedKey() { + return UsCtField.GPC_SEGMENT_INCLUDED; } - @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); - } - } - - return segments; - } - - @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()); - } - } - - return SlicedCharSequence.join('.', encodedSegments); - } - - public Integer getSharingNotice() { return (Integer) this.getFieldValue(UsCtField.SHARING_NOTICE); } @@ -98,14 +61,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() { @@ -124,10 +85,6 @@ public Integer getGpcSegmentType() { return (Integer) this.getFieldValue(UsCtField.GPC_SEGMENT_TYPE); } - public Boolean getGpcSegmentIncluded() { - return (Boolean) this.getFieldValue(UsCtField.GPC_SEGMENT_INCLUDED); - } - public Boolean getGpc() { return (Boolean) this.getFieldValue(UsCtField.GPC); } 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..8fb0888e 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,23 @@ 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; +import com.iab.gpp.encoder.segment.Base64Segment; -public class UsDe extends AbstractLazilyEncodableSection { +public class UsDe extends AbstractUsSectionWithGpc { public static final int ID = 17; public static final int VERSION = 1; public static final String NAME = "usde"; public UsDe() { - super(); + super( + new Base64Segment<>(UsDeField.USDE_CORE_SEGMENT_FIELD_NAMES), + new Base64Segment<>(UsDeField.USDE_GPC_SEGMENT_FIELD_NAMES)); } public UsDe(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,45 +37,10 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsDeCoreSegment(), new UsDeGpcSegment()); + protected final UsDeField getGpcSegmentIncludedKey() { + return UsDeField.GPC_SEGMENT_INCLUDED; } - @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); - } - } - - return segments; - } - - @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()); - } - } - - return SlicedCharSequence.join('.', encodedSegments); - } - - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsDeField.PROCESSING_NOTICE); } @@ -98,14 +61,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() { @@ -128,10 +89,6 @@ public Integer getGpcSegmentType() { return (Integer) this.getFieldValue(UsDeField.GPC_SEGMENT_TYPE); } - public Boolean getGpcSegmentIncluded() { - return (Boolean) this.getFieldValue(UsDeField.GPC_SEGMENT_INCLUDED); - } - public Boolean getGpc() { return (Boolean) this.getFieldValue(UsDeField.GPC); } 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..c967faf7 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; +import com.iab.gpp.encoder.segment.Base64Segment; -public class UsFl extends AbstractLazilyEncodableSection { +public class UsFl extends AbstractUsSection { public static final int ID = 13; public static final int VERSION = 1; public static final String NAME = "usfl"; public UsFl() { - super(); + super(new Base64Segment<>(UsFlField.USFL_CORE_SEGMENT_FIELD_NAMES)); } 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..918066b6 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,23 @@ 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; +import com.iab.gpp.encoder.segment.Base64Segment; -public class UsIa extends AbstractLazilyEncodableSection { +public class UsIa extends AbstractUsSectionWithGpc { public static final int ID = 18; public static final int VERSION = 1; public static final String NAME = "usia"; public UsIa() { - super(); + super( + new Base64Segment<>(UsIaField.USIA_CORE_SEGMENT_FIELD_NAMES), + new Base64Segment<>(UsIaField.USIA_GPC_SEGMENT_FIELD_NAMES)); } public UsIa(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,45 +37,10 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsIaCoreSegment(), new UsIaGpcSegment()); + protected final UsIaField getGpcSegmentIncludedKey() { + return UsIaField.GPC_SEGMENT_INCLUDED; } - @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); - } - } - - return segments; - } - - @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()); - } - } - - return SlicedCharSequence.join('.', encodedSegments); - } - - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsIaField.PROCESSING_NOTICE); } @@ -102,9 +65,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() { @@ -127,10 +89,6 @@ public Integer getGpcSegmentType() { return (Integer) this.getFieldValue(UsIaField.GPC_SEGMENT_TYPE); } - public Boolean getGpcSegmentIncluded() { - return (Boolean) this.getFieldValue(UsIaField.GPC_SEGMENT_INCLUDED); - } - public Boolean getGpc() { return (Boolean) this.getFieldValue(UsIaField.GPC); } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsMn.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsMn.java new file mode 100644 index 00000000..eab08473 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsMn.java @@ -0,0 +1,95 @@ +package com.iab.gpp.encoder.section; + +import com.iab.gpp.encoder.datatype.FixedIntegerList; +import com.iab.gpp.encoder.field.UsMnField; +import com.iab.gpp.encoder.segment.Base64Segment; + +public class UsMn extends AbstractUsSectionWithGpc { + + public static final int ID = 23; + public static final int VERSION = 1; + public static final String NAME = "usmn"; + + public UsMn() { + super( + new Base64Segment<>(UsMnField.USMN_CORE_SEGMENT_FIELD_NAMES), + new Base64Segment<>(UsMnField.USMN_GPC_SEGMENT_FIELD_NAMES)); + } + + public UsMn(String encodedString) { + this(); + decode(encodedString); + } + + @Override + public int getId() { + return UsMn.ID; + } + + @Override + public String getName() { + return UsMn.NAME; + } + + @Override + public int getVersion() { + return UsMn.VERSION; + } + + @Override + protected final UsMnField getGpcSegmentIncludedKey() { + return UsMnField.GPC_SEGMENT_INCLUDED; + } + + public Integer getProcessingNotice() { + return (Integer) this.getFieldValue(UsMnField.PROCESSING_NOTICE); + } + + public Integer getSaleOptOutNotice() { + return (Integer) this.getFieldValue(UsMnField.SALE_OPT_OUT_NOTICE); + } + + public Integer getTargetedAdvertisingOptOutNotice() { + return (Integer) this.getFieldValue(UsMnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE); + } + + public Integer getSaleOptOut() { + return (Integer) this.getFieldValue(UsMnField.SALE_OPT_OUT); + } + + public Integer getTargetedAdvertisingOptOut() { + return (Integer) this.getFieldValue(UsMnField.TARGETED_ADVERTISING_OPT_OUT); + } + + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsMnField.SENSITIVE_DATA_PROCESSING); + } + + public Integer getKnownChildSensitiveDataConsents() { + return (Integer) this.getFieldValue(UsMnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); + } + + public Integer getAdditionalDataProcessingConsent() { + return (Integer) this.getFieldValue(UsMnField.ADDITIONAL_DATA_PROCESSING_CONSENT); + } + + public Integer getMspaCoveredTransaction() { + return (Integer) this.getFieldValue(UsMnField.MSPA_COVERED_TRANSACTION); + } + + public Integer getMspaOptOutOptionMode() { + return (Integer) this.getFieldValue(UsMnField.MSPA_OPT_OUT_OPTION_MODE); + } + + public Integer getMspaServiceProviderMode() { + return (Integer) this.getFieldValue(UsMnField.MSPA_SERVICE_PROVIDER_MODE); + } + + public Integer getGpcSegmentType() { + return (Integer) this.getFieldValue(UsMnField.GPC_SEGMENT_TYPE); + } + + public Boolean getGpc() { + return (Boolean) this.getFieldValue(UsMnField.GPC); + } +} 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..972f661b 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,23 @@ 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; +import com.iab.gpp.encoder.segment.Base64Segment; -public class UsMt extends AbstractLazilyEncodableSection { +public class UsMt extends AbstractUsSectionWithGpc { public static final int ID = 14; public static final int VERSION = 1; public static final String NAME = "usmt"; public UsMt() { - super(); + super( + new Base64Segment<>(UsMtField.USMT_CORE_SEGMENT_FIELD_NAMES), + new Base64Segment<>(UsMtField.USMT_GPC_SEGMENT_FIELD_NAMES)); } public UsMt(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,45 +37,10 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsMtCoreSegment(), new UsMtGpcSegment()); + protected final UsMtField getGpcSegmentIncludedKey() { + return UsMtField.GPC_SEGMENT_INCLUDED; } - @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); - } - } - - return segments; - } - - @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()); - } - } - - return SlicedCharSequence.join('.', encodedSegments); - } - - public Integer getSharingNotice() { return (Integer) this.getFieldValue(UsMtField.SHARING_NOTICE); } @@ -98,14 +61,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() { @@ -128,10 +89,6 @@ public Integer getGpcSegmentType() { return (Integer) this.getFieldValue(UsMtField.GPC_SEGMENT_TYPE); } - public Boolean getGpcSegmentIncluded() { - return (Boolean) this.getFieldValue(UsMtField.GPC_SEGMENT_INCLUDED); - } - public Boolean getGpc() { return (Boolean) this.getFieldValue(UsMtField.GPC); } 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..e6f07b17 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,23 @@ 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.Base64Segment; import com.iab.gpp.encoder.segment.UsNatCoreSegment; -import com.iab.gpp.encoder.segment.UsNatGpcSegment; -public class UsNat extends AbstractLazilyEncodableSection { +public class UsNat extends AbstractUsSectionWithGpc { public static final int ID = 7; - public static final int VERSION = 1; + public static final int VERSION = 2; public static final String NAME = "usnat"; public UsNat() { - super(); + // NOTE: the core segment has inconsistent decoding due to a version mixup + super(new UsNatCoreSegment(), new Base64Segment<>(UsNatField.USNAT_GPC_SEGMENT_FIELD_NAMES)); } public UsNat(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -35,49 +33,14 @@ public String getName() { @Override public int getVersion() { - return UsNat.VERSION; + return (Integer) this.getFieldValue(UsNatField.VERSION); } @Override - protected List initializeSegments() { - return Arrays.asList(new UsNatCoreSegment(), new UsNatGpcSegment()); + protected final UsNatField getGpcSegmentIncludedKey() { + return UsNatField.GPC_SEGMENT_INCLUDED; } - @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); - } - } - - return segments; - } - - @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()); - } - } - - return SlicedCharSequence.join('.', encodedSegments); - } - - public Integer getSharingNotice() { return (Integer) this.getFieldValue(UsNatField.SHARING_NOTICE); } @@ -114,14 +77,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() { @@ -144,10 +105,6 @@ public Integer getGpcSegmentType() { return (Integer) this.getFieldValue(UsNatField.GPC_SEGMENT_TYPE); } - public Boolean getGpcSegmentIncluded() { - return (Boolean) this.getFieldValue(UsNatField.GPC_SEGMENT_INCLUDED); - } - public Boolean getGpc() { return (Boolean) this.getFieldValue(UsNatField.GPC); } 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..5b6beb26 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,23 @@ 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; +import com.iab.gpp.encoder.segment.Base64Segment; -public class UsNe extends AbstractLazilyEncodableSection { +public class UsNe extends AbstractUsSectionWithGpc { public static final int ID = 19; public static final int VERSION = 1; public static final String NAME = "usne"; public UsNe() { - super(); + super( + new Base64Segment<>(UsNeField.USNE_CORE_SEGMENT_FIELD_NAMES), + new Base64Segment<>(UsNeField.USNE_GPC_SEGMENT_FIELD_NAMES)); } public UsNe(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,45 +37,10 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsNeCoreSegment(), new UsNeGpcSegment()); + protected final UsNeField getGpcSegmentIncludedKey() { + return UsNeField.GPC_SEGMENT_INCLUDED; } - @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); - } - } - - return segments; - } - - @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()); - } - } - - return SlicedCharSequence.join('.', encodedSegments); - } - - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsNeField.PROCESSING_NOTICE); } @@ -98,9 +61,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() { @@ -127,10 +89,6 @@ public Integer getGpcSegmentType() { return (Integer) this.getFieldValue(UsNeField.GPC_SEGMENT_TYPE); } - public Boolean getGpcSegmentIncluded() { - return (Boolean) this.getFieldValue(UsNeField.GPC_SEGMENT_INCLUDED); - } - public Boolean getGpc() { return (Boolean) this.getFieldValue(UsNeField.GPC); } 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..413357a4 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,23 @@ 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; +import com.iab.gpp.encoder.segment.Base64Segment; -public class UsNh extends AbstractLazilyEncodableSection { +public class UsNh extends AbstractUsSectionWithGpc { public static final int ID = 20; public static final int VERSION = 1; public static final String NAME = "usnh"; public UsNh() { - super(); + super( + new Base64Segment<>(UsNhField.USNH_CORE_SEGMENT_FIELD_NAMES), + new Base64Segment<>(UsNhField.USNH_GPC_SEGMENT_FIELD_NAMES)); } public UsNh(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,45 +37,10 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsNhCoreSegment(), new UsNhGpcSegment()); + protected final UsNhField getGpcSegmentIncludedKey() { + return UsNhField.GPC_SEGMENT_INCLUDED; } - @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); - } - } - - return segments; - } - - @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()); - } - } - - return SlicedCharSequence.join('.', encodedSegments); - } - - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsNhField.PROCESSING_NOTICE); } @@ -98,14 +61,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() { @@ -128,10 +89,6 @@ public Integer getGpcSegmentType() { return (Integer) this.getFieldValue(UsNhField.GPC_SEGMENT_TYPE); } - public Boolean getGpcSegmentIncluded() { - return (Boolean) this.getFieldValue(UsNhField.GPC_SEGMENT_INCLUDED); - } - public Boolean getGpc() { return (Boolean) this.getFieldValue(UsNhField.GPC); } 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..2e996507 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,23 @@ 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; +import com.iab.gpp.encoder.segment.Base64Segment; -public class UsNj extends AbstractLazilyEncodableSection { +public class UsNj extends AbstractUsSectionWithGpc { public static final int ID = 21; public static final int VERSION = 1; public static final String NAME = "usnj"; public UsNj() { - super(); + super( + new Base64Segment<>(UsNjField.USNJ_CORE_SEGMENT_FIELD_NAMES), + new Base64Segment<>(UsNjField.USNJ_GPC_SEGMENT_FIELD_NAMES)); } public UsNj(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,45 +37,10 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsNjCoreSegment(), new UsNjGpcSegment()); + protected final UsNjField getGpcSegmentIncludedKey() { + return UsNjField.GPC_SEGMENT_INCLUDED; } - @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); - } - } - - return segments; - } - - @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()); - } - } - - return SlicedCharSequence.join('.', encodedSegments); - } - - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsNjField.PROCESSING_NOTICE); } @@ -98,14 +61,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() { @@ -128,10 +89,6 @@ public Integer getGpcSegmentType() { return (Integer) this.getFieldValue(UsNjField.GPC_SEGMENT_TYPE); } - public Boolean getGpcSegmentIncluded() { - return (Boolean) this.getFieldValue(UsNjField.GPC_SEGMENT_INCLUDED); - } - public Boolean getGpc() { return (Boolean) this.getFieldValue(UsNjField.GPC); } 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..ddd2be6e 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,23 @@ 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; +import com.iab.gpp.encoder.segment.Base64Segment; -public class UsOr extends AbstractLazilyEncodableSection { +public class UsOr extends AbstractUsSectionWithGpc { public static final int ID = 15; public static final int VERSION = 1; public static final String NAME = "usor"; public UsOr() { - super(); + super( + new Base64Segment<>(UsOrField.USOR_CORE_SEGMENT_FIELD_NAMES), + new Base64Segment<>(UsOrField.USOR_GPC_SEGMENT_FIELD_NAMES)); } public UsOr(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,45 +37,10 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsOrCoreSegment(), new UsOrGpcSegment()); + protected final UsOrField getGpcSegmentIncludedKey() { + return UsOrField.GPC_SEGMENT_INCLUDED; } - @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); - } - } - - return segments; - } - - @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()); - } - } - - return SlicedCharSequence.join('.', encodedSegments); - } - - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsOrField.PROCESSING_NOTICE); } @@ -98,14 +61,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() { @@ -128,10 +89,6 @@ public Integer getGpcSegmentType() { return (Integer) this.getFieldValue(UsOrField.GPC_SEGMENT_TYPE); } - public Boolean getGpcSegmentIncluded() { - return (Boolean) this.getFieldValue(UsOrField.GPC_SEGMENT_INCLUDED); - } - public Boolean getGpc() { return (Boolean) this.getFieldValue(UsOrField.GPC); } 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..89cf9842 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,23 @@ 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; +import com.iab.gpp.encoder.segment.Base64Segment; -public class UsTn extends AbstractLazilyEncodableSection { +public class UsTn extends AbstractUsSectionWithGpc { public static final int ID = 22; public static final int VERSION = 1; public static final String NAME = "ustn"; public UsTn() { - super(); + super( + new Base64Segment<>(UsTnField.USTN_CORE_SEGMENT_FIELD_NAMES), + new Base64Segment<>(UsTnField.USTN_GPC_SEGMENT_FIELD_NAMES)); } public UsTn(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,45 +37,10 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsTnCoreSegment(), new UsTnGpcSegment()); + protected final UsTnField getGpcSegmentIncludedKey() { + return UsTnField.GPC_SEGMENT_INCLUDED; } - @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); - } - } - - return segments; - } - - @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()); - } - } - - return SlicedCharSequence.join('.', encodedSegments); - } - - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsTnField.PROCESSING_NOTICE); } @@ -98,9 +61,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() { @@ -127,10 +89,6 @@ public Integer getGpcSegmentType() { return (Integer) this.getFieldValue(UsTnField.GPC_SEGMENT_TYPE); } - public Boolean getGpcSegmentIncluded() { - return (Boolean) this.getFieldValue(UsTnField.GPC_SEGMENT_INCLUDED); - } - public Boolean getGpc() { return (Boolean) this.getFieldValue(UsTnField.GPC); } 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..40bac9d1 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,23 @@ 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; +import com.iab.gpp.encoder.segment.Base64Segment; -public class UsTx extends AbstractLazilyEncodableSection { +public class UsTx extends AbstractUsSectionWithGpc { public static final int ID = 16; public static final int VERSION = 1; public static final String NAME = "ustx"; public UsTx() { - super(); + super( + new Base64Segment<>(UsTxField.USTX_CORE_SEGMENT_FIELD_NAMES), + new Base64Segment<>(UsTxField.USTX_GPC_SEGMENT_FIELD_NAMES)); } public UsTx(CharSequence encodedString) { - super(); + this(); decode(encodedString); } @@ -39,45 +37,10 @@ public int getVersion() { } @Override - protected List initializeSegments() { - return Arrays.asList(new UsTxCoreSegment(), new UsTxGpcSegment()); + protected final UsTxField getGpcSegmentIncludedKey() { + return UsTxField.GPC_SEGMENT_INCLUDED; } - @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); - } - } - - return segments; - } - - @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()); - } - } - - return SlicedCharSequence.join('.', encodedSegments); - } - - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsTxField.PROCESSING_NOTICE); } @@ -98,9 +61,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() { @@ -127,10 +89,6 @@ public Integer getGpcSegmentType() { return (Integer) this.getFieldValue(UsTxField.GPC_SEGMENT_TYPE); } - public Boolean getGpcSegmentIncluded() { - return (Boolean) this.getFieldValue(UsTxField.GPC_SEGMENT_INCLUDED); - } - public Boolean getGpc() { return (Boolean) this.getFieldValue(UsTxField.GPC); } 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..4c81876f 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; +import com.iab.gpp.encoder.segment.Base64Segment; -public class UsUt extends AbstractLazilyEncodableSection { +public class UsUt extends AbstractUsSection { public static final int ID = 11; public static final int VERSION = 1; public static final String NAME = "usut"; public UsUt() { - super(); + super(new Base64Segment<>(UsUtField.USUT_CORE_SEGMENT_FIELD_NAMES)); } 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() { @@ -111,6 +77,4 @@ public Integer getMspaOptOutOptionMode() { public Integer getMspaServiceProviderMode() { return (Integer) this.getFieldValue(UsUtField.MSPA_SERVICE_PROVIDER_MODE); } - - } 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..8b8eec58 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; +import com.iab.gpp.encoder.segment.Base64Segment; -public class UsVa extends AbstractLazilyEncodableSection { +public class UsVa extends AbstractUsSection { public static final int ID = 9; public static final int VERSION = 1; public static final String NAME = "usva"; public UsVa() { - super(); + super(new Base64Segment<>(UsVaField.USVA_CORE_SEGMENT_FIELD_NAMES)); } 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..090651a2 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/AbstractBase64Segment.java @@ -0,0 +1,57 @@ +package com.iab.gpp.encoder.segment; + +import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; +import com.iab.gpp.encoder.bitstring.BitString; +import com.iab.gpp.encoder.datatype.DataType; +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 abstract AbstractBase64UrlEncoder getBase64UrlEncoder(); + + @Override + protected final CharSequence doEncode() { + BitString bitString = new BitString(); + int size = fieldNames.size(); + for (int i = 0; i < size; i++) { + DataType field = fieldNames.get(i); + try { + field.encode(bitString, values, i, this); + } catch (Exception e) { + throw new EncodingException("Unable to decode " + field.getName(), e); + } + } + return getBase64UrlEncoder().encode(bitString); + } + + @Override + protected final void doDecode(CharSequence encodedString) { + try { + BitString bitString = decodeBitString(encodedString); + int size = fieldNames.size(); + for (int i = 0; i < size; i++) { + DataType field = fieldNames.get(i); + try { + field.decode(bitString, values, i, this); + } catch (Exception e) { + throw new DecodingException("Unable to decode " + field.getName(), e); + } + } + } 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..e6386caa 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,100 +1,96 @@ 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.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> + 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 -> { - for (int n : l) { - if (n < 0 || n > 2) { - return false; - } - } - return true; - }); - - protected T fields; + protected final FieldNames fieldNames; + protected final Object[] values; + private boolean dirty; - private CharSequence encodedString = null; - - private boolean decoded = true; - - protected AbstractLazilyEncodableSegment() { - this.fields = initializeFields(); + protected AbstractLazilyEncodableSegment(FieldNames fieldNames) { + this.fieldNames = fieldNames; + this.values = new Object[fieldNames.size()]; } - protected abstract T initializeFields(); - - protected abstract StringBuilder encodeSegment(T fields); - - protected abstract void decodeSegment(CharSequence encodedString, T fields); + @Override + public final E resolveKey(FieldKey fieldName) { + return fieldNames.resolveKey(fieldName); + } - public boolean hasField(String fieldName) { - return this.fields.containsKey(fieldName); + @Override + public final boolean hasField(E key) { + return fieldNames.getIndex(key) != 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() { + if (dirty) { + return dirty; } - - DataType field = this.fields.get(fieldName); - if (field != null) { - return field.getValue(); - } else { - throw new InvalidFieldException("Invalid field: '" + fieldName + "'"); + int size = fieldNames.size(); + for (int i = 0; i < size; i++) { + if (fieldNames.get(i).isDirty(values, i)) { + return true; + } } + return false; } - public void setFieldValue(String fieldName, Object value) { - if (!this.decoded) { - this.decodeSegment(this.encodedString, this.fields); - this.fields.markClean(); - this.decoded = true; + @Override + public final void setDirty(boolean dirty) { + this.dirty = dirty; + int size = fieldNames.size(); + for (int i = 0; i < size; i++) { + fieldNames.get(i).setDirty(values, i, dirty); } + } - DataType field = this.fields.get(fieldName); - if (field != null) { - field.setValue(value); - } else { - throw new InvalidFieldException(fieldName + " not found"); - } + @Override + public final Object getFieldValue(E fieldName) { + ensureDecode(); + return getFieldValueUnsafe(fieldName); } - 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; + @Override + protected final Object getFieldValueUnsafe(E fieldName) { + Integer index = fieldNames.getIndex(fieldName); + if (index != null) { + return fieldNames.get(index).get(values, index); + } else { + throw new InvalidFieldException("Invalid field: '" + fieldName + "'"); } + } - return this.encodedString; + @Override + public final void setFieldValue(E fieldName, Object value) { + ensureDecode(); + setFieldValueUnsafe(fieldName, value); } - public void decode(CharSequence encodedString) { - this.encodedString = encodedString; - this.fields.markClean(); - this.decoded = false; + protected final void setFieldValueUnsafe(E fieldName, Object value) { + Integer index = fieldNames.getIndex(fieldName); + if (index != null) { + fieldNames.get(index).set(values, index, value); + dirty = true; + } else { + throw new InvalidFieldException(fieldName + " not found"); + } } + @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++) { + sb.append(", ").append(fieldNames.get(i).getName()).append('=').append(values[i]); } sb.append('}'); return sb.toString(); } - } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/Base64Segment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/Base64Segment.java new file mode 100644 index 00000000..181e187a --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/Base64Segment.java @@ -0,0 +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.field.FieldKey; +import com.iab.gpp.encoder.field.FieldNames; + +public final class Base64Segment & FieldKey> extends AbstractBase64Segment { + + public Base64Segment(FieldNames fieldNames) { + super(fieldNames); + } + + protected AbstractBase64UrlEncoder getBase64UrlEncoder() { + return CompressedBase64UrlEncoder.getInstance(); + } +} 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..30654a43 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,16 @@ package com.iab.gpp.encoder.segment; -public interface EncodableSegment { +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 boolean hasField(E fieldName); - void setFieldValue(String fieldName, Object value); + public abstract Object getFieldValue(E fieldName); - CharSequence encodeCharSequence(); + protected abstract Object getFieldValueUnsafe(E key); - 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 deleted file mode 100644 index adea375e..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/HeaderV1CoreSegment.java +++ /dev/null @@ -1,57 +0,0 @@ -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 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); - } - } - -} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/SegmentValueProvider.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/SegmentValueProvider.java new file mode 100644 index 00000000..fca1bae7 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/SegmentValueProvider.java @@ -0,0 +1,19 @@ +package com.iab.gpp.encoder.segment; + +import com.iab.gpp.encoder.field.FieldKey; + +public class SegmentValueProvider & FieldKey> { + private final E key; + + public SegmentValueProvider(E key) { + this.key = key; + } + + public int modify(int original) { + return original; + } + + public final int extract(EncodableSegment segment) { + return modify((Integer) segment.getFieldValueUnsafe(key)); + } +} 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 deleted file mode 100644 index 5b081f6e..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1CoreSegment.java +++ /dev/null @@ -1,78 +0,0 @@ -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; -import com.iab.gpp.encoder.datatype.EncodableFixedBitfield; -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 TcfCaV1CoreSegment() { - super(); - } - - public TcfCaV1CoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - // NOTE: TcfCaV1.setFieldValue 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); - } - - @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 deleted file mode 100644 index 7d1f83a9..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1DisclosedVendorsSegment.java +++ /dev/null @@ -1,54 +0,0 @@ -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 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); - } - - @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 deleted file mode 100644 index 0424bb5d..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1PublisherPurposesSegment.java +++ /dev/null @@ -1,75 +0,0 @@ -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 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)); - - EncodableFixedInteger numCustomPurposes = new EncodableFixedInteger(6, 0); - fields.put(TcfCaV1Field.NUM_CUSTOM_PURPOSES, numCustomPurposes); - - IntSupplier getLengthSupplier = new IntSupplier() { - - @Override - public int getAsInt() { - return numCustomPurposes.getValue(); - } - - }; - - fields.put(TcfCaV1Field.CUSTOM_PURPOSES_EXPRESS_CONSENT, - new EncodableFlexibleBitfield(getLengthSupplier)); - - fields.put(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 deleted file mode 100644 index 98f81351..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2CoreSegment.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.iab.gpp.encoder.segment; - -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; -import com.iab.gpp.encoder.datatype.EncodableFixedBitfield; -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 TcfEuV2CoreSegment() { - super(); - } - - public TcfEuV2CoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - protected EncodableBitStringFields initializeFields() { - // NOTE: TcfEuV2.setFieldValue 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; - } - - @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 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 deleted file mode 100644 index 69135848..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2PublisherPurposesSegment.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.iab.gpp.encoder.segment; - -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 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)); - - EncodableFixedInteger numCustomPurposes = new EncodableFixedInteger(6, 0); - fields.put(TcfEuV2Field.NUM_CUSTOM_PURPOSES, numCustomPurposes); - - IntSupplier getLengthSupplier = new IntSupplier() { - - @Override - public int getAsInt() { - return numCustomPurposes.getValue(); - } - - }; - - fields.put(TcfEuV2Field.PUBLISHER_CUSTOM_CONSENTS, - new EncodableFlexibleBitfield(getLengthSupplier)); - - fields.put(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); - } - - @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 deleted file mode 100644 index 9bd9a7c3..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2VendorsAllowedSegment.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.iab.gpp.encoder.segment; - -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 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); - } - - @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); - } - } -} 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 deleted file mode 100644 index 4db588ed..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2VendorsDisclosedSegment.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.iab.gpp.encoder.segment; - -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 TcfEuV2VendorsDisclosedSegment() { - super(); - } - - public TcfEuV2VendorsDisclosedSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @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; - } - - @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/TraditionalBase64Segment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TraditionalBase64Segment.java new file mode 100644 index 00000000..5b2610be --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TraditionalBase64Segment.java @@ -0,0 +1,18 @@ +package com.iab.gpp.encoder.segment; + +import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; +import com.iab.gpp.encoder.base64.TraditionalBase64UrlEncoder; +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.field.FieldNames; + +public final class TraditionalBase64Segment & FieldKey> + extends AbstractBase64Segment { + + public TraditionalBase64Segment(FieldNames fieldNames) { + super(fieldNames); + } + + protected AbstractBase64UrlEncoder getBase64UrlEncoder() { + return TraditionalBase64UrlEncoder.getInstance(); + } +} 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 deleted file mode 100644 index eafc1f12..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCaCoreSegment.java +++ /dev/null @@ -1,79 +0,0 @@ -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 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, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCaField.SHARING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCaField.SENSITIVE_DATA_LIMIT_USE_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCaField.SALE_OPT_OUT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsCaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, Arrays.asList(0, 0)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsCaField.PERSONAL_DATA_CONSENTS, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCaField.MSPA_COVERED_TRANSACTION, - new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCaField.MSPA_OPT_OUT_OPTION_MODE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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 deleted file mode 100644 index ed72554c..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCaGpcSegment.java +++ /dev/null @@ -1,56 +0,0 @@ -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 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); - } - - @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 deleted file mode 100644 index 98e96fc9..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCoCoreSegment.java +++ /dev/null @@ -1,76 +0,0 @@ -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 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, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCoField.SALE_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCoField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCoField.SALE_OPT_OUT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsCoField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCoField.MSPA_COVERED_TRANSACTION, - new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCoField.MSPA_OPT_OUT_OPTION_MODE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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 deleted file mode 100644 index 509e8aaf..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCoGpcSegment.java +++ /dev/null @@ -1,56 +0,0 @@ -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 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); - } - - @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 deleted file mode 100644 index d6e27686..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCtCoreSegment.java +++ /dev/null @@ -1,77 +0,0 @@ -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 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, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCtField.SALE_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCtField.SALE_OPT_OUT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsCtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsCtField.MSPA_COVERED_TRANSACTION, - new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsCtField.MSPA_OPT_OUT_OPTION_MODE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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 deleted file mode 100644 index b15c2ab5..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCtGpcSegment.java +++ /dev/null @@ -1,56 +0,0 @@ -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 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); - } - - @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 deleted file mode 100644 index 534fbf28..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsDeCoreSegment.java +++ /dev/null @@ -1,80 +0,0 @@ -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 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, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsDeField.SALE_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsDeField.SALE_OPT_OUT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsDeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsDeField.ADDITIONAL_DATA_PROCESSING_CONSENT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsDeField.MSPA_COVERED_TRANSACTION, - new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsDeField.MSPA_OPT_OUT_OPTION_MODE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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 deleted file mode 100644 index 6978a358..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsDeGpcSegment.java +++ /dev/null @@ -1,56 +0,0 @@ -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 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); - } - - @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 deleted file mode 100644 index 384d34ac..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsFlCoreSegment.java +++ /dev/null @@ -1,78 +0,0 @@ -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 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, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsFlField.SALE_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsFlField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsFlField.SALE_OPT_OUT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsFlField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsFlField.ADDITIONAL_DATA_PROCESSING_CONSENT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsFlField.MSPA_COVERED_TRANSACTION, - new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsFlField.MSPA_OPT_OUT_OPTION_MODE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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 deleted file mode 100644 index 530ccd13..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsIaCoreSegment.java +++ /dev/null @@ -1,79 +0,0 @@ -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 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, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsIaField.SALE_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsIaField.SENSITIVE_DATA_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsIaField.SALE_OPT_OUT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsIaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsIaField.MSPA_COVERED_TRANSACTION, - new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsIaField.MSPA_OPT_OUT_OPTION_MODE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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 deleted file mode 100644 index 02a9eb1e..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsIaGpcSegment.java +++ /dev/null @@ -1,56 +0,0 @@ -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 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); - } - - @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 deleted file mode 100644 index 49d8813b..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMtCoreSegment.java +++ /dev/null @@ -1,79 +0,0 @@ -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 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, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsMtField.SALE_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsMtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsMtField.SALE_OPT_OUT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsMtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsMtField.ADDITIONAL_DATA_PROCESSING_CONSENT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsMtField.MSPA_COVERED_TRANSACTION, - new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsMtField.MSPA_OPT_OUT_OPTION_MODE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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 deleted file mode 100644 index 60c2e3b9..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMtGpcSegment.java +++ /dev/null @@ -1,56 +0,0 @@ -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 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); - } - - @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..c69cb9f4 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,34 @@ 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 { +public final class UsNatCoreSegment extends AbstractBase64Segment { - private static final AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private static final BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); + private static final int VERSION_LENGTH = 6; public UsNatCoreSegment() { - super(); + super(UsNatField.USNAT_CORE_SEGMENT_FIELD_NAMES); } - public UsNatCoreSegment(String encodedString) { - super(); - this.decode(encodedString); + protected AbstractBase64UrlEncoder getBase64UrlEncoder() { + return CompressedBase64UrlEncoder.getInstance(); } @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, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.SALE_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.SHARING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.SENSITIVE_DATA_LIMIT_USE_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.SALE_OPT_OUT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.SHARING_OPT_OUT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsNatField.PERSONAL_DATA_CONSENTS, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.MSPA_COVERED_TRANSACTION, - new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNatField.MSPA_OPT_OUT_OPTION_MODE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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); + // An encoder implemented the v2 spec (more fields) while still sending the version as 1. + // 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. + // We use a heuristic of length to determine the v2 strings masquerading as v1 string. + if (bitString.peekInt(VERSION_LENGTH) == 1 && bitString.length() >= 72) { + // Upgrade to version 2 + bitString.putInt(2, VERSION_LENGTH); } + 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 deleted file mode 100644 index 5d0771a3..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNatGpcSegment.java +++ /dev/null @@ -1,56 +0,0 @@ -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 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); - } - - @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 deleted file mode 100644 index fb7b77a1..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNeCoreSegment.java +++ /dev/null @@ -1,79 +0,0 @@ -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 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, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNeField.SALE_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNeField.SALE_OPT_OUT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsNeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNeField.ADDITIONAL_DATA_PROCESSING_CONSENT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNeField.MSPA_COVERED_TRANSACTION, - new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNeField.MSPA_OPT_OUT_OPTION_MODE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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 deleted file mode 100644 index 16b3e688..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNeGpcSegment.java +++ /dev/null @@ -1,56 +0,0 @@ -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 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); - } - - @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 deleted file mode 100644 index 789f86b5..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNhCoreSegment.java +++ /dev/null @@ -1,79 +0,0 @@ -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 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, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNhField.SALE_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNhField.SALE_OPT_OUT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsNhField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsNhField.ADDITIONAL_DATA_PROCESSING_CONSENT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNhField.MSPA_COVERED_TRANSACTION, - new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNhField.MSPA_OPT_OUT_OPTION_MODE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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 deleted file mode 100644 index 1343c79e..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNhGpcSegment.java +++ /dev/null @@ -1,56 +0,0 @@ -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 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); - } - - @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 deleted file mode 100644 index 99f94205..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNjCoreSegment.java +++ /dev/null @@ -1,79 +0,0 @@ -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 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, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNjField.SALE_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNjField.SALE_OPT_OUT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsNjField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsNjField.ADDITIONAL_DATA_PROCESSING_CONSENT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNjField.MSPA_COVERED_TRANSACTION, - new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsNjField.MSPA_OPT_OUT_OPTION_MODE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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 deleted file mode 100644 index e5b14d7e..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNjGpcSegment.java +++ /dev/null @@ -1,56 +0,0 @@ -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 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); - } - - @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 deleted file mode 100644 index f9ef489d..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsOrCoreSegment.java +++ /dev/null @@ -1,79 +0,0 @@ -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 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, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsOrField.SALE_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsOrField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsOrField.SALE_OPT_OUT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsOrField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsOrField.ADDITIONAL_DATA_PROCESSING_CONSENT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsOrField.MSPA_COVERED_TRANSACTION, - new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsOrField.MSPA_OPT_OUT_OPTION_MODE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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 deleted file mode 100644 index 087a6d3d..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsOrGpcSegment.java +++ /dev/null @@ -1,56 +0,0 @@ -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 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); - } - - @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 deleted file mode 100644 index b6bd3409..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTnCoreSegment.java +++ /dev/null @@ -1,79 +0,0 @@ -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 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, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTnField.SALE_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTnField.SALE_OPT_OUT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsTnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTnField.ADDITIONAL_DATA_PROCESSING_CONSENT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTnField.MSPA_COVERED_TRANSACTION, - new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTnField.MSPA_OPT_OUT_OPTION_MODE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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 deleted file mode 100644 index 12c5aab3..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTnGpcSegment.java +++ /dev/null @@ -1,56 +0,0 @@ -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 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); - } - - @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 deleted file mode 100644 index 2b809263..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTxCoreSegment.java +++ /dev/null @@ -1,79 +0,0 @@ -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 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, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTxField.SALE_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTxField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTxField.SALE_OPT_OUT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsTxField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTxField.ADDITIONAL_DATA_PROCESSING_CONSENT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTxField.MSPA_COVERED_TRANSACTION, - new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsTxField.MSPA_OPT_OUT_OPTION_MODE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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 deleted file mode 100644 index 33626df8..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTxGpcSegment.java +++ /dev/null @@ -1,56 +0,0 @@ -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 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); - } - } -} 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 deleted file mode 100644 index 368cfca5..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsUtCoreSegment.java +++ /dev/null @@ -1,79 +0,0 @@ -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 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, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsUtField.SALE_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsUtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsUtField.SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsUtField.SALE_OPT_OUT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsUtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsUtField.MSPA_COVERED_TRANSACTION, - new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsUtField.MSPA_OPT_OUT_OPTION_MODE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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 deleted file mode 100644 index b374520b..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsVaCoreSegment.java +++ /dev/null @@ -1,77 +0,0 @@ -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 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, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsVaField.SALE_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsVaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsVaField.SALE_OPT_OUT, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsVaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsVaField.MSPA_COVERED_TRANSACTION, - new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); - fields.put(UsVaField.MSPA_OPT_OUT_OPTION_MODE, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - fields.put(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..9defd655 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,58 +1,37 @@ package com.iab.gpp.encoder.segment; -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); + super(UspV1Field.USPV1_CORE_SEGMENT_FIELD_NAMES); } @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; - } - - @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(getFieldValue(UspV1Field.VERSION)); + str.append(getFieldValue(UspV1Field.NOTICE)); + str.append(getFieldValue(UspV1Field.OPT_OUT_SALE)); + str.append(getFieldValue(UspV1Field.LSPA_COVERED)); 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)); + setFieldValueUnsafe(UspV1Field.VERSION, (int) (encodedString.charAt(0) - '0')); + setFieldValueUnsafe(UspV1Field.NOTICE, encodedString.charAt(1)); + setFieldValueUnsafe(UspV1Field.OPT_OUT_SALE, encodedString.charAt(2)); + setFieldValueUnsafe(UspV1Field.LSPA_COVERED, 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..d4444857 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 @@ -1,24 +1,22 @@ package com.iab.gpp.encoder; -import java.time.Instant; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Set; -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.TcfCaV1Field; import com.iab.gpp.encoder.field.TcfEuV2Field; 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.UsMnField; 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; @@ -31,6 +29,7 @@ import com.iab.gpp.encoder.section.UsDe; import com.iab.gpp.encoder.section.UsFl; import com.iab.gpp.encoder.section.UsIa; +import com.iab.gpp.encoder.section.UsMn; import com.iab.gpp.encoder.section.UsMt; import com.iab.gpp.encoder.section.UsNat; import com.iab.gpp.encoder.section.UsNe; @@ -42,10 +41,20 @@ import com.iab.gpp.encoder.section.UsUt; import com.iab.gpp.encoder.section.UsVa; import com.iab.gpp.encoder.section.UspV1; +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class GppModelTest { - private Instant utcDateTime = ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(); + private Instant utcDateTime = + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(); @Test public void testEncodeDefault() { @@ -69,7 +78,6 @@ public void testEncodeDefault() { Assertions.assertEquals(false, gppModel.hasSection(UspV1.NAME)); Assertions.assertEquals(false, gppModel.hasSection(TcfEuV2.NAME)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.NAME)); - } @Test @@ -97,8 +105,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,14 +121,13 @@ 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); + gppModel.setFieldValue(UsMn.NAME, UsMnField.VERSION, UsMn.VERSION); Assertions.assertEquals(true, gppModel.hasSection(TcfEuV2.NAME)); Assertions.assertEquals(true, gppModel.hasSection(TcfCaV1.NAME)); @@ -141,25 +148,30 @@ public void testEncodeDefaultAll() { Assertions.assertEquals(true, gppModel.hasSection(UsNh.NAME)); Assertions.assertEquals(true, gppModel.hasSection(UsNj.NAME)); Assertions.assertEquals(true, gppModel.hasSection(UsTn.NAME)); + Assertions.assertEquals(true, gppModel.hasSection(UsMn.NAME)); String gppString = gppModel.encode(); Assertions.assertEquals( - "DBACOdM~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA~BPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAA.YAAAAAAAAAA~1---~BAAAAAAAAABA.QA~BAAAAABA.QA~BAAAABA~BAAAAEA.QA~BAAAAAQA~BAAAAAEA.QA~BAAAAABA~BAAAAABA.QA~BAAAAAABAA.QA~BAAAAAQA.QA~BAAAAAABAA.QA~BAAAAAQA.QA~BAAAAAQA.QA~BAAAAABA.QA~BAAAAAAAQA.QA~BAAAAAQA.QA", - gppString); + "DBACOYs~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA~BPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAA.YAAAAAAAAAA~1---~CAAAAAAAAABA.QA~BAAAAABA.QA~BAAAABA~BAAAAEA.QA~BAAAAAQA~BAAAAAEA.QA~BAAAAABA~BAAAAABA.QA~BAAAAAABAA.QA~BAAAAAQA.QA~BAAAAAABAA.QA~BAAAAAQA.QA~BAAAAAQA.QA~BAAAAABA.QA~BAAAAAAAQA.QA~BAAAAAQA.QA~BAAAAAQA.QA", + gppString); } @Test public void testDecodingException() { - Assertions.assertThrows(DecodingException.class, () -> { - new GppModel("invalid gpp string").getHeader(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new GppModel("invalid gpp string").getHeader(); + }); } - + @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new GppModel("z").getUsCtSection(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new GppModel("z").getUsCtSection(); + }); } @Test @@ -186,8 +198,6 @@ public void testEncodeUspv1() { Assertions.assertEquals(false, gppModel.hasSection(TcfEuV2.NAME)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.NAME)); - - String gppString = gppModel.encode(); Assertions.assertEquals("DBABTA~1YNN", gppString); @@ -199,7 +209,6 @@ public void testEncodeUspv1() { Assertions.assertEquals(true, gppModel.hasSection(UspV1.NAME)); Assertions.assertEquals(false, gppModel.hasSection(TcfEuV2.NAME)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.NAME)); - } @Test @@ -223,8 +232,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)); @@ -235,9 +244,9 @@ public void testEncodeTcfEuV2() { Assertions.assertEquals(true, gppModel.hasSection(TcfEuV2.NAME)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.NAME)); - String gppString = gppModel.encode(); - Assertions.assertEquals("DBABMA~CPSG_8APSG_8ANwAAAENAwCAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA", gppString); + Assertions.assertEquals( + "DBABMA~CPSG_8APSG_8ANwAAAENAwCAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA", gppString); Assertions.assertEquals(2, gppString.split("~").length); @@ -249,7 +258,6 @@ public void testEncodeTcfEuV2() { Assertions.assertEquals(false, gppModel.hasSection(UspV1.NAME)); Assertions.assertEquals(true, gppModel.hasSection(TcfEuV2.NAME)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.NAME)); - } @Test @@ -269,8 +277,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)); @@ -286,7 +294,8 @@ public void testEncodeUspV1AndTcfEuV2() { Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.NAME)); String gppString = gppModel.encode(); - Assertions.assertEquals("DBACNYA~CPSG_8APSG_8ANwAAAENAwCAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA~1YNN", gppString); + Assertions.assertEquals( + "DBACNYA~CPSG_8APSG_8ANwAAAENAwCAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA~1YNN", gppString); Assertions.assertEquals(3, gppString.split("~").length); @@ -294,7 +303,6 @@ public void testEncodeUspV1AndTcfEuV2() { Assertions.assertEquals(true, gppModel.hasSection(UspV1.NAME)); Assertions.assertEquals(true, gppModel.hasSection(TcfEuV2.NAME)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.NAME)); - } @Test @@ -308,7 +316,6 @@ public void testEncodeUspV1AndTcfEuV2AndTcfCaV1() { Assertions.assertEquals(false, gppModel.hasSection(TcfEuV2.NAME)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.NAME)); - gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.CMP_ID, 880); gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.CMP_VERSION, 0); gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.CONSENT_SCREEN, 0); @@ -319,9 +326,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()); Assertions.assertEquals(false, gppModel.hasSection(UspV1.ID)); @@ -348,23 +354,34 @@ public void testEncodeUspV1AndTcfEuV2AndTcfCaV1() { gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.CMP_VERSION, 2); gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.VENDOR_LIST_VERSION, 413); gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.USE_NON_STANDARD_STACKS, true); - gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.SPECIAL_FEATURE_EXPRESS_CONSENT, + gppModel.setFieldValue( + TcfCaV1.NAME, + TcfCaV1Field.SPECIAL_FEATURE_EXPRESS_CONSENT, Arrays.asList(6, 7, 8, 9, 10, 11)); - gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.PURPOSES_EXPRESS_CONSENT, + gppModel.setFieldValue( + TcfCaV1.NAME, + TcfCaV1Field.PURPOSES_EXPRESS_CONSENT, Arrays.asList(0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17)); - gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.PURPOSES_IMPLIED_CONSENT, + gppModel.setFieldValue( + TcfCaV1.NAME, + TcfCaV1Field.PURPOSES_IMPLIED_CONSENT, Arrays.asList(6, 7, 8, 9, 10, 11, 18, 19, 20, 21, 22, 23)); - gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.VENDOR_EXPRESS_CONSENT, Arrays.asList(12, 24, 48)); - gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.VENDOR_IMPLIED_CONSENT, Arrays.asList(18, 30)); - gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.PUB_PURPOSES_EXPRESS_CONSENT, + gppModel.setFieldValue( + TcfCaV1.NAME, TcfCaV1Field.VENDOR_EXPRESS_CONSENT, Arrays.asList(12, 24, 48)); + gppModel.setFieldValue( + TcfCaV1.NAME, TcfCaV1Field.VENDOR_IMPLIED_CONSENT, Arrays.asList(18, 30)); + gppModel.setFieldValue( + TcfCaV1.NAME, + TcfCaV1Field.PUB_PURPOSES_EXPRESS_CONSENT, Arrays.asList(0, 1, 2, 6, 7, 8, 12, 13, 14, 18, 19, 20)); - gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.PUB_PURPOSES_IMPLIED_CONSENT, + gppModel.setFieldValue( + TcfCaV1.NAME, + TcfCaV1Field.PUB_PURPOSES_IMPLIED_CONSENT, Arrays.asList(3, 4, 5, 9, 10, 11, 15, 16, 17, 21, 22, 23)); gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.NUM_CUSTOM_PURPOSES, 3); - gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.CUSTOM_PURPOSES_EXPRESS_CONSENT, - List.of(1)); - gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.CUSTOM_PURPOSES_IMPLIED_CONSENT, - List.of(0,2)); + gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.CUSTOM_PURPOSES_EXPRESS_CONSENT, List.of(1)); + gppModel.setFieldValue( + TcfCaV1.NAME, TcfCaV1Field.CUSTOM_PURPOSES_IMPLIED_CONSENT, List.of(0, 2)); gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.CREATED, utcDateTime); gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.LAST_UPDATED, utcDateTime); @@ -377,7 +394,6 @@ public void testEncodeUspV1AndTcfEuV2AndTcfCaV1() { Assertions.assertEquals(true, gppModel.hasSection(TcfEuV2.NAME)); Assertions.assertEquals(true, gppModel.hasSection(TcfCaV1.NAME)); - String gppString = gppModel.encode(); Assertions.assertEquals( "DBACOeA~CPSG_8APSG_8ANwAAAENAwCAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA~BPSG_8APSG_8AAyACAENGdCgf_gfgAfgfgBgABABAAABAB4AACACAAA.fHHHA4444ao~1YNN", @@ -407,13 +423,12 @@ public void testDecodeDefaults() { Assertions.assertEquals(false, gppModel.hasSection(UspV1.NAME)); Assertions.assertEquals(false, gppModel.hasSection(TcfEuV2.NAME)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.NAME)); - } @Test public void testDecodeDefaultsAll() { String gppString = - "DBACOdM~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA~BPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAA.YAAAAAAAAAA~1---~BAAAAAAAAABA.QA~BAAAAABA.QA~BAAAABA~BAAAAEA.QA~BAAAAAQA~BAAAAAEA.QA~BAAAAABA~BAAAAABA.QA~BAAAAAABAA.QA~BAAAAAQA.QA~BAAAAAABAA.QA~BAAAAAQA.QA~BAAAAAQA.QA~BAAAAABA.QA~BAAAAAAAQA.QA~BAAAAAQA.QA"; + "DBACOYs~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA~BPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAA.YAAAAAAAAAA~1---~BAAAAAAAAABA.QA~BAAAAABA.QA~BAAAABA~BAAAAEA.QA~BAAAAAQA~BAAAAAEA.QA~BAAAAABA~BAAAAABA.QA~BAAAAAABAA.QA~BAAAAAQA.QA~BAAAAAABAA.QA~BAAAAAQA.QA~BAAAAAQA.QA~BAAAAABA.QA~BAAAAAAAQA.QA~BAAAAAQA.QA~BAAAAAABAA.QA"; GppModel gppModel = new GppModel(gppString); Assertions.assertEquals(true, gppModel.hasSection(TcfEuV2.NAME)); @@ -435,6 +450,7 @@ public void testDecodeDefaultsAll() { Assertions.assertEquals(true, gppModel.hasSection(UsNh.NAME)); Assertions.assertEquals(true, gppModel.hasSection(UsNj.NAME)); Assertions.assertEquals(true, gppModel.hasSection(UsTn.NAME)); + Assertions.assertEquals(true, gppModel.hasSection(UsMn.NAME)); } @Test @@ -478,29 +494,44 @@ public void testDecodeTcfEuV2() { Assertions.assertEquals(880, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.CMP_ID)); Assertions.assertEquals(0, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.CMP_VERSION)); Assertions.assertEquals(0, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.CONSENT_SCREEN)); - Assertions.assertEquals("EN", gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.CONSENT_LANGUAGE)); - Assertions.assertEquals(48, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.VENDOR_LIST_VERSION)); + Assertions.assertEquals( + "EN", gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.CONSENT_LANGUAGE)); + Assertions.assertEquals( + 48, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.VENDOR_LIST_VERSION)); Assertions.assertEquals(2, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.POLICY_VERSION)); - Assertions.assertEquals(false, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.IS_SERVICE_SPECIFIC)); - Assertions.assertEquals(false, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.USE_NON_STANDARD_STACKS)); - Assertions.assertEquals(false, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.PURPOSE_ONE_TREATMENT)); - Assertions.assertEquals("AA", gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); + Assertions.assertEquals( + false, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.IS_SERVICE_SPECIFIC)); + Assertions.assertEquals( + false, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.USE_NON_STANDARD_STACKS)); + Assertions.assertEquals( + false, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.PURPOSE_ONE_TREATMENT)); + Assertions.assertEquals( + "AA", gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); Assertions.assertEquals(utcDateTime, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.CREATED)); - Assertions.assertEquals(utcDateTime, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.LAST_UPDATED)); + Assertions.assertEquals( + utcDateTime, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.LAST_UPDATED)); Assertions.assertEquals(2, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.VERSION)); Assertions.assertEquals(880, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CMP_ID)); Assertions.assertEquals(0, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CMP_VERSION)); Assertions.assertEquals(0, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CONSENT_SCREEN)); - Assertions.assertEquals("EN", gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CONSENT_LANGUAGE)); - Assertions.assertEquals(48, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.VENDOR_LIST_VERSION)); + Assertions.assertEquals( + "EN", gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CONSENT_LANGUAGE)); + Assertions.assertEquals( + 48, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.VENDOR_LIST_VERSION)); Assertions.assertEquals(2, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.POLICY_VERSION)); - Assertions.assertEquals(false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.IS_SERVICE_SPECIFIC)); - Assertions.assertEquals(false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.USE_NON_STANDARD_STACKS)); - Assertions.assertEquals(false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.PURPOSE_ONE_TREATMENT)); - Assertions.assertEquals("AA", gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); - Assertions.assertEquals(utcDateTime, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CREATED)); - Assertions.assertEquals(utcDateTime, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.LAST_UPDATED)); + Assertions.assertEquals( + false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.IS_SERVICE_SPECIFIC)); + Assertions.assertEquals( + false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.USE_NON_STANDARD_STACKS)); + Assertions.assertEquals( + false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.PURPOSE_ONE_TREATMENT)); + Assertions.assertEquals( + "AA", gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); + Assertions.assertEquals( + utcDateTime, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CREATED)); + Assertions.assertEquals( + utcDateTime, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.LAST_UPDATED)); } @Test @@ -517,7 +548,6 @@ public void testDecodeUspv1AndTcfEuV2() { Assertions.assertEquals(true, gppModel.hasSection(TcfEuV2.NAME)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.NAME)); - Assertions.assertEquals('Y', gppModel.getFieldValue(UspV1.ID, UspV1Field.NOTICE)); Assertions.assertEquals('N', gppModel.getFieldValue(UspV1.ID, UspV1Field.OPT_OUT_SALE)); Assertions.assertEquals('N', gppModel.getFieldValue(UspV1.ID, UspV1Field.LSPA_COVERED)); @@ -530,29 +560,44 @@ public void testDecodeUspv1AndTcfEuV2() { Assertions.assertEquals(880, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.CMP_ID)); Assertions.assertEquals(0, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.CMP_VERSION)); Assertions.assertEquals(0, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.CONSENT_SCREEN)); - Assertions.assertEquals("EN", gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.CONSENT_LANGUAGE)); - Assertions.assertEquals(48, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.VENDOR_LIST_VERSION)); + Assertions.assertEquals( + "EN", gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.CONSENT_LANGUAGE)); + Assertions.assertEquals( + 48, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.VENDOR_LIST_VERSION)); Assertions.assertEquals(2, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.POLICY_VERSION)); - Assertions.assertEquals(false, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.IS_SERVICE_SPECIFIC)); - Assertions.assertEquals(false, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.USE_NON_STANDARD_STACKS)); - Assertions.assertEquals(false, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.PURPOSE_ONE_TREATMENT)); - Assertions.assertEquals("AA", gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); + Assertions.assertEquals( + false, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.IS_SERVICE_SPECIFIC)); + Assertions.assertEquals( + false, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.USE_NON_STANDARD_STACKS)); + Assertions.assertEquals( + false, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.PURPOSE_ONE_TREATMENT)); + Assertions.assertEquals( + "AA", gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); Assertions.assertEquals(utcDateTime, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.CREATED)); - Assertions.assertEquals(utcDateTime, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.LAST_UPDATED)); + Assertions.assertEquals( + utcDateTime, gppModel.getFieldValue(TcfEuV2.ID, TcfEuV2Field.LAST_UPDATED)); Assertions.assertEquals(2, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.VERSION)); Assertions.assertEquals(880, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CMP_ID)); Assertions.assertEquals(0, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CMP_VERSION)); Assertions.assertEquals(0, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CONSENT_SCREEN)); - Assertions.assertEquals("EN", gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CONSENT_LANGUAGE)); - Assertions.assertEquals(48, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.VENDOR_LIST_VERSION)); + Assertions.assertEquals( + "EN", gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CONSENT_LANGUAGE)); + Assertions.assertEquals( + 48, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.VENDOR_LIST_VERSION)); Assertions.assertEquals(2, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.POLICY_VERSION)); - Assertions.assertEquals(false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.IS_SERVICE_SPECIFIC)); - Assertions.assertEquals(false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.USE_NON_STANDARD_STACKS)); - Assertions.assertEquals(false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.PURPOSE_ONE_TREATMENT)); - Assertions.assertEquals("AA", gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); - Assertions.assertEquals(utcDateTime, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CREATED)); - Assertions.assertEquals(utcDateTime, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.LAST_UPDATED)); + Assertions.assertEquals( + false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.IS_SERVICE_SPECIFIC)); + Assertions.assertEquals( + false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.USE_NON_STANDARD_STACKS)); + Assertions.assertEquals( + false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.PURPOSE_ONE_TREATMENT)); + Assertions.assertEquals( + "AA", gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); + Assertions.assertEquals( + utcDateTime, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CREATED)); + Assertions.assertEquals( + utcDateTime, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.LAST_UPDATED)); TcfEuV2 tcfEuV2Section = (TcfEuV2) gppModel.getSection(TcfEuV2.NAME); Integer tcfEuV2Version = tcfEuV2Section.getVersion(); @@ -586,15 +631,23 @@ public void testDecodeUspv1AndTcfEuV2AndTcfCaV1() { Assertions.assertEquals(880, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CMP_ID)); Assertions.assertEquals(0, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CMP_VERSION)); Assertions.assertEquals(0, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CONSENT_SCREEN)); - Assertions.assertEquals("EN", gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CONSENT_LANGUAGE)); - Assertions.assertEquals(48, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.VENDOR_LIST_VERSION)); + Assertions.assertEquals( + "EN", gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CONSENT_LANGUAGE)); + Assertions.assertEquals( + 48, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.VENDOR_LIST_VERSION)); Assertions.assertEquals(2, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.POLICY_VERSION)); - Assertions.assertEquals(false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.IS_SERVICE_SPECIFIC)); - Assertions.assertEquals(false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.USE_NON_STANDARD_STACKS)); - Assertions.assertEquals(false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.PURPOSE_ONE_TREATMENT)); - Assertions.assertEquals("AA", gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); - Assertions.assertEquals(utcDateTime, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CREATED)); - Assertions.assertEquals(utcDateTime, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.LAST_UPDATED)); + Assertions.assertEquals( + false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.IS_SERVICE_SPECIFIC)); + Assertions.assertEquals( + false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.USE_NON_STANDARD_STACKS)); + Assertions.assertEquals( + false, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.PURPOSE_ONE_TREATMENT)); + Assertions.assertEquals( + "AA", gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); + Assertions.assertEquals( + utcDateTime, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.CREATED)); + Assertions.assertEquals( + utcDateTime, gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.LAST_UPDATED)); TcfEuV2 tcfEuV2Section = (TcfEuV2) gppModel.getSection(TcfEuV2.NAME); Integer tcfEuV2Version = tcfEuV2Section.getVersion(); @@ -613,27 +666,24 @@ public void testDecodeUspv1AndTcfEuV2AndTcfCaV1() { Assertions.assertEquals(2, tcfCaV1Section.getCmpVersion()); Assertions.assertEquals(413, tcfCaV1Section.getVendorListVersion()); Assertions.assertEquals(true, tcfCaV1Section.getUseNonStandardStacks()); - Assertions.assertTrue(tcfCaV1Section.getSpecialFeatureExpressConsent().intStream().anyMatch(x -> x== 7)); - Assertions.assertEquals(Set.of(7, 8, 9, 10, 11, 12), - tcfCaV1Section.getSpecialFeatureExpressConsent()); - Assertions - .assertEquals( - Set.of(1, 2, 3, 4, 5, 6, 13, 14, 15, 16, 17, 18), - tcfCaV1Section.getPurposesExpressConsent()); - Assertions - .assertEquals( - Set.of(7, 8, 9, 10, 11, 12, 19, 20, 21, 22, 23, 24), - tcfCaV1Section.getPurposesImpliedConsent()); + Assertions.assertTrue( + tcfCaV1Section.getSpecialFeatureExpressConsent().intStream().anyMatch(x -> x == 7)); + Assertions.assertEquals( + Set.of(7, 8, 9, 10, 11, 12), tcfCaV1Section.getSpecialFeatureExpressConsent()); + Assertions.assertEquals( + Set.of(1, 2, 3, 4, 5, 6, 13, 14, 15, 16, 17, 18), + tcfCaV1Section.getPurposesExpressConsent()); + Assertions.assertEquals( + Set.of(7, 8, 9, 10, 11, 12, 19, 20, 21, 22, 23, 24), + tcfCaV1Section.getPurposesImpliedConsent()); Assertions.assertEquals(Set.of(12, 24, 48), tcfCaV1Section.getVendorExpressConsent()); Assertions.assertEquals(Set.of(18, 30), tcfCaV1Section.getVendorImpliedConsent()); - Assertions - .assertEquals( - Set.of(1, 2, 3, 7, 8, 9, 13, 14, 15, 19, 20, 21), - tcfCaV1Section.getPubPurposesExpressConsent()); - Assertions - .assertEquals( - Set.of(4, 5, 6, 10, 11, 12, 16, 17, 18, 22, 23, 24), - tcfCaV1Section.getPubPurposesImpliedConsent()); + Assertions.assertEquals( + Set.of(1, 2, 3, 7, 8, 9, 13, 14, 15, 19, 20, 21), + tcfCaV1Section.getPubPurposesExpressConsent()); + Assertions.assertEquals( + Set.of(4, 5, 6, 10, 11, 12, 16, 17, 18, 22, 23, 24), + tcfCaV1Section.getPubPurposesImpliedConsent()); Assertions.assertEquals(3, tcfCaV1Section.getNumCustomPurposes()); Assertions.assertEquals(Set.of(2), tcfCaV1Section.getCustomPurposesExpressConsent()); Assertions.assertEquals(Set.of(1, 3), tcfCaV1Section.getCustomPurposesImpliedConsent()); @@ -652,8 +702,12 @@ public void testEncode1() { gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.VENDOR_CONSENTS, Arrays.asList(28)); gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.CREATED, utcDateTime); gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.LAST_UPDATED, utcDateTime); + Assertions.assertEquals(true, gppModel.hasField(TcfEuV2.NAME, TcfEuV2Field.VERSION)); + Assertions.assertEquals(true, gppModel.getTcfEuV2Section().hasField(TcfEuV2Field.VERSION)); + gppModel.toString(); - Assertions.assertEquals("DBABMA~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAOAAAABAAAAA.QAAA.IAAA", gppModel.encode()); + Assertions.assertEquals( + "DBABMA~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAOAAAABAAAAA.QAAA.IAAA", gppModel.encode()); } @Test @@ -664,7 +718,8 @@ public void testEncode2() { gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.CREATED, utcDateTime); gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.LAST_UPDATED, utcDateTime); - Assertions.assertEquals("DBABMA~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAOwAQAOgAAAA.QAAA.IAAA", gppModel.encode()); + Assertions.assertEquals( + "DBABMA~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAOwAQAOgAAAA.QAAA.IAAA", gppModel.encode()); } @Test @@ -675,92 +730,108 @@ public void testEncode3() { gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.CREATED, utcDateTime); gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.LAST_UPDATED, utcDateTime); - Assertions.assertEquals("DBABMA~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAFpQAwAAgCtAWkAAAAAAA.QAAA.IAAA", + Assertions.assertEquals( + "DBABMA~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAFpQAwAAgCtAWkAAAAAAA.QAAA.IAAA", gppModel.encode()); } @Test public void testDecode1() { - GppModel gppModel = new GppModel("DBABMA~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAOAAAABAAAAA.QAAA.IAAA"); - Assertions.assertEquals(Set.of(28), gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.VENDOR_CONSENTS)); + GppModel gppModel = + new GppModel("DBABMA~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAOAAAABAAAAA.QAAA.IAAA"); + Assertions.assertEquals( + Set.of(28), gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.VENDOR_CONSENTS)); } @Test public void testDecode2() { - GppModel gppModel = new GppModel("DBABMA~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAOwAQAOgAAAA.QAAA.IAAA"); - Assertions.assertEquals(Set.of(29), gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.VENDOR_CONSENTS)); + GppModel gppModel = + new GppModel("DBABMA~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAOwAQAOgAAAA.QAAA.IAAA"); + Assertions.assertEquals( + Set.of(29), gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.VENDOR_CONSENTS)); } @Test public void testDecode3() { - GppModel gppModel = new GppModel("DBABMA~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAFpQAwAAgCtAWkAAAAAAA.QAAA.IAAA"); - Assertions.assertEquals(Set.of(1, 173, 722), - gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.VENDOR_CONSENTS)); + GppModel gppModel = + new GppModel("DBABMA~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAFpQAwAAgCtAWkAAAAAAA.QAAA.IAAA"); + Assertions.assertEquals( + Set.of(1, 173, 722), gppModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.VENDOR_CONSENTS)); } - + @Test public void testDecode4() { GppModel gppModel = new GppModel("DBABTA~1YYN"); gppModel.getFieldValue(UspV1.NAME, UspV1Field.VERSION); - } @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); - 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.VERSION); + Assertions.assertEquals( + Arrays.asList(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), + Assertions.assertEquals( + Arrays.asList(0, 0), gppModel.getFieldValue(UsNat.NAME, UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); } - + @Test public void testDecode7() { GppModel gppModel = new GppModel("DBABLA~BAAAAAAAAABA.QA"); - gppModel.getFieldValue(UsNat.NAME, UspV1Field.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.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), + Assertions.assertEquals( + Arrays.asList(0, 0, 0), gppModel.getFieldValue(UsNat.NAME, UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); } - + @Test public void testDecode8() { GppModel gppModel = new GppModel("DBABLA~BAAAAAABEQA.QA"); - gppModel.getFieldValue(UsNat.NAME, UspV1Field.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.VERSION); + Assertions.assertEquals( + Arrays.asList(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, 1, 0), + Assertions.assertEquals( + Arrays.asList(0, 1), gppModel.getFieldValue(UsNat.NAME, UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); } - + @Test public void testDecode9() { GppModel gppModel = new GppModel("DBABLA~BAAAAAAAAQRA.QA"); - gppModel.getFieldValue(UsNat.NAME, UspV1Field.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.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), + Assertions.assertEquals( + Arrays.asList(0, 0, 1), gppModel.getFieldValue(UsNat.NAME, UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); } - + @Test public void testConsistency() { GppModel fromObjectModel = new GppModel(); - fromObjectModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.PURPOSE_CONSENTS, - Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); - fromObjectModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.VENDOR_CONSENTS, + fromObjectModel.setFieldValue( + TcfEuV2.NAME, TcfEuV2Field.PURPOSE_CONSENTS, Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); + fromObjectModel.setFieldValue( + TcfEuV2.NAME, + TcfEuV2Field.VENDOR_CONSENTS, Arrays.asList(32, 128, 81, 210, 755, 21, 173, 238)); - Assertions.assertEquals(fromObjectModel.getSection(TcfEuV2.NAME).encode(), + Assertions.assertEquals( + fromObjectModel.getSection(TcfEuV2.NAME).encode(), fromObjectModel.getSection(TcfEuV2.NAME).encode()); Assertions.assertEquals(fromObjectModel.encode(), fromObjectModel.encode()); @@ -769,9 +840,9 @@ public void testConsistency() { Assertions.assertEquals( Set.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), decodedModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.PURPOSE_CONSENTS)); - Assertions.assertEquals(Set.of(21, 32, 81, 128, 173, 210, 238, 755), + Assertions.assertEquals( + Set.of(21, 32, 81, 128, 173, 210, 238, 755), decodedModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.VENDOR_CONSENTS)); - } @Test @@ -809,7 +880,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'); @@ -819,13 +890,13 @@ public void testDecodingEmptyString() { @Test public void testDecodingExceptionValidStringButNotGPP() { try { - GppModel gppModel = new GppModel("DP48G0AP48G0AEsACCPLAkEgAAAAAEPgAB5YAAAQaQD2F2K2kKFkPCmQWYAQBCijYEAhQAAAAkCBIAAgAUgQAgFIIAgAIFAAAAAAAAAQEgCQAAQABAAAIACgAAAAAAIAAAAAAAQQAAAAAIAAAAAAAAEAAAAAAAQAAAAIAABEhCAAQQAEAAAAAAAQAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAgAA"); + GppModel gppModel = + new GppModel( + "DP48G0AP48G0AEsACCPLAkEgAAAAAEPgAB5YAAAQaQD2F2K2kKFkPCmQWYAQBCijYEAhQAAAAkCBIAAgAUgQAgFIIAgAIFAAAAAAAAAQEgCQAAQABAAAIACgAAAAAAIAAAAAAAQQAAAAAIAAAAAAAAEAAAAAAAQAAAAIAABEhCAAQQAEAAAAAAAQAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAgAA"); gppModel.getHeader().getName(); Assertions.fail("Expected LazyDecodingException"); } catch (DecodingException e) { } } - - } 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..255cdc90 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 @@ -2,47 +2,47 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; 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() { - Assertions.assertEquals("000011000001000000000001001100000000000000000000", base64UrlEncoder.decode("DBABMAAA").toString()); + Assertions.assertEquals( + "000011000001000000000001001100000000000000000000", + base64UrlEncoder.decode("DBABMAAA").toString()); } @Test public void testDecode2() { - Assertions.assertEquals("000011000001000000000010001101011000000000000000", base64UrlEncoder.decode("DBACNYAA").toString()); + Assertions.assertEquals( + "000011000001000000000010001101011000000000000000", + base64UrlEncoder.decode("DBACNYAA").toString()); } @Test public void testDecode3() { - Assertions.assertEquals("000011000001000000000001100011110000000000000000", base64UrlEncoder.decode("DBABjwAA").toString()); + 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..4f1a9e84 --- /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..6b5996a3 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 @@ -1,61 +1,52 @@ package com.iab.gpp.encoder.datatype; -import java.util.Arrays; -import java.util.Set; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - 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; +import com.iab.gpp.encoder.field.UsNatField; +import java.util.Set; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; 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(); - encodableFixedIntegerRange.setValue(Arrays.asList(28)); - BitStringBuilder builder = new BitStringBuilder(); - encodableFixedIntegerRange.encode(builder); - Assertions.assertEquals("00000000000100000000000011100", builder.build().toString()); + EncodableFixedIntegerRange encodableFixedIntegerRange = + new EncodableFixedIntegerRange<>(""); + IntegerSet integerSet = new IntegerSet(); + integerSet.add(28); + BitString builder = new BitString(); + encodableFixedIntegerRange.encode(builder, integerSet, null); + Assertions.assertEquals("00000000000100000000000011100", builder.toString()); } @Test public void testEncode2() throws EncodingException { - EncodableFixedIntegerRange encodableFixedIntegerRange = new EncodableFixedIntegerRange(); - encodableFixedIntegerRange.setValue(Arrays.asList(29)); - BitStringBuilder builder = new BitStringBuilder(); - encodableFixedIntegerRange.encode(builder); - Assertions.assertEquals("00000000000100000000000011101", builder.build().toString()); + EncodableFixedIntegerRange encodableFixedIntegerRange = + new EncodableFixedIntegerRange<>(""); + IntegerSet integerSet = new IntegerSet(); + integerSet.add(29); + BitString builder = new BitString(); + encodableFixedIntegerRange.encode(builder, integerSet, null); + Assertions.assertEquals("00000000000100000000000011101", builder.toString()); } @Test public void testDecode1() throws DecodingException { - EncodableFixedIntegerRange encodableFixedIntegerRange = new EncodableFixedIntegerRange(); - encodableFixedIntegerRange.decode(BitString.of("00000000000100000000000011100")); - Assertions.assertEquals(Set.of(28), encodableFixedIntegerRange.getValue()); + EncodableFixedIntegerRange encodableFixedIntegerRange = + new EncodableFixedIntegerRange<>(""); + Assertions.assertEquals( + Set.of(28), + encodableFixedIntegerRange.decode(BitString.of("00000000000100000000000011100"), null)); } @Test public void testDecode2() throws DecodingException { - EncodableFixedIntegerRange encodableFixedIntegerRange = new EncodableFixedIntegerRange(); - encodableFixedIntegerRange.decode(BitString.of("00000000000100000000000011101")); - Assertions.assertEquals(Set.of(29), encodableFixedIntegerRange.getValue()); + EncodableFixedIntegerRange encodableFixedIntegerRange = + new EncodableFixedIntegerRange<>(""); + Assertions.assertEquals( + Set.of(29), + encodableFixedIntegerRange.decode(BitString.of("00000000000100000000000011101"), null)); } - } 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..9245ad34 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 @@ -1,85 +1,84 @@ package com.iab.gpp.encoder.datatype; +import com.iab.gpp.encoder.bitstring.BitString; +import com.iab.gpp.encoder.field.UsNatField; import java.util.Arrays; import java.util.Set; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; - public class EncodableOptimizedFixedRangeTest { - private EncodableOptimizedFixedRange encodableOptimizedFixedRange = new EncodableOptimizedFixedRange(); + private EncodableOptimizedFixedRange encodableOptimizedFixedRange = + new EncodableOptimizedFixedRange<>(""); @Test public void testEncode1() { - encodableOptimizedFixedRange.setValue(Arrays.asList(12, 24, 48)); - BitStringBuilder builder = new BitStringBuilder(); - encodableOptimizedFixedRange.encode(builder); - Assertions.assertEquals("00000000001100000000000000001000000000001000000000000000000000001", - builder.build().toString()); + IntegerSet integerSet = new IntegerSet(); + integerSet.addAll(Arrays.asList(12, 24, 48)); + BitString builder = new BitString(); + encodableOptimizedFixedRange.encode(builder, integerSet, null); + Assertions.assertEquals( + "00000000001100000000000000001000000000001000000000000000000000001", builder.toString()); } @Test public void testEncode2() { - encodableOptimizedFixedRange.setValue(Arrays.asList(18, 30)); - BitStringBuilder builder = new BitStringBuilder(); - encodableOptimizedFixedRange.encode(builder); - Assertions.assertEquals("00000000000111100000000000000000001000000000001", builder.build().toString()); + IntegerSet integerSet = new IntegerSet(); + integerSet.addAll(Arrays.asList(18, 30)); + BitString builder = new BitString(); + encodableOptimizedFixedRange.encode(builder, integerSet, null); + Assertions.assertEquals("00000000000111100000000000000000001000000000001", builder.toString()); } @Test public void testEncode3() { - encodableOptimizedFixedRange.setValue(Arrays.asList(28)); - BitStringBuilder builder = new BitStringBuilder(); - encodableOptimizedFixedRange.encode(builder); - Assertions.assertEquals("000000000001110000000000000000000000000000001", builder.build().toString()); + IntegerSet integerSet = new IntegerSet(); + integerSet.addAll(Arrays.asList(28)); + BitString builder = new BitString(); + encodableOptimizedFixedRange.encode(builder, integerSet, null); + Assertions.assertEquals("000000000001110000000000000000000000000000001", builder.toString()); } @Test public void testEncode4() { - encodableOptimizedFixedRange.setValue(Arrays.asList(29)); - BitStringBuilder builder = new BitStringBuilder(); - encodableOptimizedFixedRange.encode(builder); - Assertions.assertEquals("0000000000011101100000000000100000000000011101", builder.build().toString()); + IntegerSet integerSet = new IntegerSet(); + integerSet.addAll(Arrays.asList(29)); + BitString builder = new BitString(); + encodableOptimizedFixedRange.encode(builder, integerSet, null); + Assertions.assertEquals("0000000000011101100000000000100000000000011101", builder.toString()); } @Test public void testDecode1() { - encodableOptimizedFixedRange.decode(BitString.of("00000000001100000000000000001000000000001000000000000000000000001")); - Assertions.assertEquals(Set.of(12, 24, 48), encodableOptimizedFixedRange.getValue()); + Assertions.assertEquals( + Set.of(12, 24, 48), + encodableOptimizedFixedRange.decode( + BitString.of("00000000001100000000000000001000000000001000000000000000000000001"), + null)); } @Test public void testDecode2() { - encodableOptimizedFixedRange.decode(BitString.of("00000000000111100000000000000000001000000000001")); - Assertions.assertEquals(Set.of(18, 30), encodableOptimizedFixedRange.getValue()); + Assertions.assertEquals( + Set.of(18, 30), + encodableOptimizedFixedRange.decode( + BitString.of("00000000000111100000000000000000001000000000001"), null)); } @Test public void testDecode3() { - encodableOptimizedFixedRange.decode(BitString.of("000000000001110000000000000000000000000000001")); - Assertions.assertEquals(Set.of(28), encodableOptimizedFixedRange.getValue()); + Assertions.assertEquals( + Set.of(28), + encodableOptimizedFixedRange.decode( + BitString.of("000000000001110000000000000000000000000000001"), null)); } @Test public void testDecode4() { - encodableOptimizedFixedRange.decode(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()); + Assertions.assertEquals( + Set.of(29), + encodableOptimizedFixedRange.decode( + BitString.of("0000000000011101100000000000100000000000011101"), null)); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/FixedIntegerListEncoderTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/FixedIntegerListEncoderTest.java new file mode 100644 index 00000000..9ab09f75 --- /dev/null +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/FixedIntegerListEncoderTest.java @@ -0,0 +1,257 @@ +package com.iab.gpp.encoder.datatype; + +import com.iab.gpp.encoder.bitstring.BitString; +import com.iab.gpp.encoder.datatype.encoder.FixedIntegerListEncoder; +import com.iab.gpp.encoder.error.DecodingException; +import com.iab.gpp.encoder.error.EncodingException; +import com.iab.gpp.encoder.field.UsNatField; +import java.util.ArrayList; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class FixedIntegerListEncoderTest { + + @Test + public void testEncode1() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, new ArrayList<>(), 2, 2); + Assertions.assertEquals("0000", builder.toString()); + } + + @Test + public void testEncode2() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(0), 2, 2); + Assertions.assertEquals("0000", builder.toString()); + } + + @Test + public void testEncode3() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(0, 0), 2, 2); + Assertions.assertEquals("0000", builder.toString()); + } + + @Test + public void testEncode4() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(0, 1), 2, 2); + Assertions.assertEquals("0001", builder.toString()); + } + + @Test + public void testEncode5() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(0, 2), 2, 2); + Assertions.assertEquals("0010", builder.toString()); + } + + @Test + public void testEncode6() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(0, 3), 2, 2); + Assertions.assertEquals("0011", builder.toString()); + } + + @Test + public void testEncode7() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(1, 0), 2, 2); + Assertions.assertEquals("0100", builder.toString()); + } + + @Test + public void testEncode8() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(1, 1), 2, 2); + Assertions.assertEquals("0101", builder.toString()); + } + + @Test + public void testEncode9() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(1, 2), 2, 2); + Assertions.assertEquals("0110", builder.toString()); + } + + @Test + public void testEncode10() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(1, 3), 2, 2); + Assertions.assertEquals("0111", builder.toString()); + } + + @Test + public void testEncode11() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(2, 0), 2, 2); + Assertions.assertEquals("1000", builder.toString()); + } + + @Test + public void testEncode12() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(2, 1), 2, 2); + Assertions.assertEquals("1001", builder.toString()); + } + + @Test + public void testEncode13() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(2, 2), 2, 2); + Assertions.assertEquals("1010", builder.toString()); + } + + @Test + public void testEncode14() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(2, 3), 2, 2); + Assertions.assertEquals("1011", builder.toString()); + } + + @Test + public void testEncode15() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(3, 0), 2, 2); + Assertions.assertEquals("1100", builder.toString()); + } + + @Test + public void testEncode16() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(3, 1), 2, 2); + Assertions.assertEquals("1101", builder.toString()); + } + + @Test + public void testEncode17() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(3, 2), 2, 2); + Assertions.assertEquals("1110", builder.toString()); + } + + @Test + public void testEncode18() { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(3, 3), 2, 2); + Assertions.assertEquals("1111", builder.toString()); + } + + @Test + public void testEncode19() { + try { + BitString builder = new BitString(); + FixedIntegerListEncoder.encode(builder, Arrays.asList(3, 3), 1, 1); + Assertions.fail("EncodingException expected"); + } catch (EncodingException e) { + + } + } + + private FixedIntegerList decode(String str) { + EncodableFixedIntegerList encodable = + new EncodableFixedIntegerList<>("", 2, 2, null); + return encodable.decode(BitString.of(str), null); + } + + @Test + public void testDecode2() { + Assertions.assertEquals(Arrays.asList(0, 0), decode("0000")); + } + + @Test + public void testDecode3() { + Assertions.assertEquals(Arrays.asList(0, 1), decode("0001")); + } + + @Test + public void testDecode4() { + Assertions.assertEquals(Arrays.asList(0, 2), decode("0010")); + } + + @Test + public void testDecode5() { + Assertions.assertEquals(Arrays.asList(0, 3), decode("0011")); + } + + @Test + public void testDecode6() { + Assertions.assertEquals(Arrays.asList(1, 0), decode("0100")); + } + + @Test + public void testDecode7() { + Assertions.assertEquals(Arrays.asList(1, 1), decode("0101")); + } + + @Test + public void testDecode8() { + Assertions.assertEquals(Arrays.asList(1, 2), decode("0110")); + } + + @Test + public void testDecode9() { + Assertions.assertEquals(Arrays.asList(1, 3), decode("0111")); + } + + @Test + public void testDecode10() { + Assertions.assertEquals(Arrays.asList(2, 0), decode("1000")); + } + + @Test + public void testDecode11() { + Assertions.assertEquals(Arrays.asList(2, 1), decode("1001")); + } + + @Test + public void testDecode12() { + Assertions.assertEquals(Arrays.asList(2, 2), decode("1010")); + } + + @Test + public void testDecode13() { + Assertions.assertEquals(Arrays.asList(2, 3), decode("1011")); + } + + @Test + public void testDecode14() { + Assertions.assertEquals(Arrays.asList(3, 0), decode("1100")); + } + + @Test + public void testDecode15() { + Assertions.assertEquals(Arrays.asList(3, 1), decode("1101")); + } + + @Test + public void testDecode16() { + Assertions.assertEquals(Arrays.asList(3, 2), decode("1110")); + } + + @Test + public void testDecode17() { + Assertions.assertEquals(Arrays.asList(3, 3), decode("1111")); + } + + @Test + public void testDecode19() { + try { + decode("2"); + Assertions.fail("DecodingException expected"); + } catch (DecodingException e) { + + } + } + + @Test + public void testDecode20() { + try { + decode("111"); + Assertions.fail("DecodingException expected"); + } catch (DecodingException e) { + + } + } +} 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..a8ab9eca --- /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(6, 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/BooleanEncoderTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/BooleanEncoderTest.java index 0a499084..0dcbd37c 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/BooleanEncoderTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/BooleanEncoderTest.java @@ -1,42 +1,40 @@ package com.iab.gpp.encoder.datatype.encoder; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; import com.iab.gpp.encoder.error.DecodingException; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class BooleanEncoderTest { @Test public void testEncode1() { - BitStringBuilder builder = new BitStringBuilder(); - BooleanEncoder.encode(builder, false); - Assertions.assertEquals("0", builder.build().toString()); + BitString builder = new BitString(); + builder.writeBoolean(false); + Assertions.assertEquals("0", builder.toString()); } @Test public void testEncode2() { - BitStringBuilder builder = new BitStringBuilder(); - BooleanEncoder.encode(builder, true); - Assertions.assertEquals("1", builder.build().toString()); + BitString builder = new BitString(); + builder.writeBoolean(true); + Assertions.assertEquals("1", builder.toString()); } @Test public void testDecode1() { - Assertions.assertEquals(false, BooleanEncoder.decode(BitString.of("0"))); + Assertions.assertEquals(false, BitString.of("0").readBoolean()); } @Test public void testDecode2() { - Assertions.assertEquals(true, BooleanEncoder.decode(BitString.of("1"))); + Assertions.assertEquals(true, BitString.of("1").readBoolean()); } @Test public void testDecode3() { try { - BooleanEncoder.decode(BitString.of("")); + BitString.of("").readBoolean(); Assertions.fail("DecodingException expected"); } catch (DecodingException e) { @@ -46,41 +44,10 @@ public void testDecode3() { @Test public void testDecode4() { try { - BooleanEncoder.decode(BitString.of("2")); - Assertions.fail("DecodingException expected"); - } catch (DecodingException e) { - - } - } - - @Test - public void testDecode5() { - try { - BooleanEncoder.decode(BitString.of("00")); - Assertions.fail("DecodingException expected"); - } catch (DecodingException e) { - - } - } - - @Test - public void testDecode6() { - try { - BooleanEncoder.decode(BitString.of("01")); + BitString.of("2").readBoolean(); Assertions.fail("DecodingException expected"); } catch (DecodingException e) { } } - - @Test - public void testDecode7() { - try { - BooleanEncoder.decode(BitString.of("10")); - Assertions.fail("DecodingException expected"); - } catch (DecodingException e) { - - } - } - } 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..652e9644 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 @@ -1,21 +1,19 @@ package com.iab.gpp.encoder.datatype.encoder; +import com.iab.gpp.encoder.bitstring.BitString; +import com.iab.gpp.encoder.error.DecodingException; import java.time.Instant; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.error.DecodingException; - public class DatetimeEncoderTest { @Test public void test1() throws DecodingException { Instant date1 = Instant.now(); - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); DatetimeEncoder.encode(builder, date1); - String encodedDate1 = builder.build().toString(); + String encodedDate1 = builder.toString(); Instant date2 = DatetimeEncoder.decode(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..54b4c8e5 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 @@ -1,140 +1,111 @@ package com.iab.gpp.encoder.datatype.encoder; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - 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; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class FibonacciIntegerEncoderTest { @Test public void testEncode1() { - BitStringBuilder builder = new BitStringBuilder(); - FibonacciIntegerEncoder.encode(builder, 1); - Assertions.assertEquals("11", builder.build().toString()); + BitString builder = new BitString(); + builder.writeFibonacci(1); + Assertions.assertEquals("11", builder.toString()); } @Test public void testEncode2() { - BitStringBuilder builder = new BitStringBuilder(); - FibonacciIntegerEncoder.encode(builder, 2); - Assertions.assertEquals("011", builder.build().toString()); + BitString builder = new BitString(); + builder.writeFibonacci(2); + Assertions.assertEquals("011", builder.toString()); } @Test public void testEncode3() { - BitStringBuilder builder = new BitStringBuilder(); - FibonacciIntegerEncoder.encode(builder, 3); - Assertions.assertEquals("0011", builder.build().toString()); + BitString builder = new BitString(); + builder.writeFibonacci(3); + Assertions.assertEquals("0011", builder.toString()); } @Test public void testEncode4() { - BitStringBuilder builder = new BitStringBuilder(); - FibonacciIntegerEncoder.encode(builder, 4); - Assertions.assertEquals("1011", builder.build().toString()); + BitString builder = new BitString(); + builder.writeFibonacci(4); + Assertions.assertEquals("1011", builder.toString()); } @Test public void testEncode5() { - BitStringBuilder builder = new BitStringBuilder(); - FibonacciIntegerEncoder.encode(builder, 5); - Assertions.assertEquals("00011", builder.build().toString()); + BitString builder = new BitString(); + builder.writeFibonacci(5); + Assertions.assertEquals("00011", builder.toString()); } @Test public void testEncode6() { - BitStringBuilder builder = new BitStringBuilder(); - FibonacciIntegerEncoder.encode(builder, 6); - Assertions.assertEquals("10011", builder.build().toString()); + BitString builder = new BitString(); + builder.writeFibonacci(6); + Assertions.assertEquals("10011", builder.toString()); } @Test public void testEncode7() { - BitStringBuilder builder = new BitStringBuilder(); - FibonacciIntegerEncoder.encode(builder, 7); - Assertions.assertEquals("01011", builder.build().toString()); + BitString builder = new BitString(); + builder.writeFibonacci(7); + Assertions.assertEquals("01011", builder.toString()); } @Test public void testEncodeTooLarge() { - BitStringBuilder builder = new BitStringBuilder(); - Assertions.assertThrows(EncodingException.class, () -> - FibonacciIntegerEncoder.encode(builder, Integer.MAX_VALUE)); + BitString builder = new BitString(); + Assertions.assertThrows( + EncodingException.class, () -> builder.writeFibonacci(Integer.MAX_VALUE)); + } + + private int decode(String str) { + return 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"))); + Assertions.assertThrows( + DecodingException.class, () -> 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..15296f02 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 @@ -1,104 +1,106 @@ package com.iab.gpp.encoder.datatype.encoder; +import com.iab.gpp.encoder.bitstring.BitString; +import com.iab.gpp.encoder.datatype.IntegerSet; +import com.iab.gpp.encoder.error.DecodingException; import java.util.ArrayList; import java.util.Arrays; import java.util.Set; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.error.DecodingException; - public class FibonacciIntegerRangeEncoderTest { @Test public void testEncode1() { - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); FibonacciIntegerRangeEncoder.encode(builder, new ArrayList<>()); - Assertions.assertEquals("000000000000", builder.build().toString()); + Assertions.assertEquals("000000000000", builder.toString()); } @Test public void testEncode2() { - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); FibonacciIntegerRangeEncoder.encode(builder, Arrays.asList(2)); - Assertions.assertEquals("0000000000010011", builder.build().toString()); + Assertions.assertEquals("0000000000010011", builder.toString()); } @Test public void testEncode3() { - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); FibonacciIntegerRangeEncoder.encode(builder, Arrays.asList(2, 3, 4, 5, 6)); - Assertions.assertEquals("00000000000110111011", builder.build().toString()); + Assertions.assertEquals("00000000000110111011", builder.toString()); } @Test public void testEncode4() { - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); FibonacciIntegerRangeEncoder.encode(builder, Arrays.asList(2, 5, 6, 7)); - Assertions.assertEquals("000000000010001110011011", builder.build().toString()); + Assertions.assertEquals("000000000010001110011011", builder.toString()); } @Test public void testEncode5() { - BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); set.addAll(Arrays.asList(6, 7, 2, 5)); FibonacciIntegerRangeEncoder.encode(builder, set); - Assertions.assertEquals("000000000010001110011011", builder.build().toString()); + Assertions.assertEquals("000000000010001110011011", builder.toString()); } @Test public void testEncode6() { - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); FibonacciIntegerRangeEncoder.encode(builder, Arrays.asList(3, 5, 6, 7, 8)); - Assertions.assertEquals("0000000000100001110110011", builder.build().toString()); + Assertions.assertEquals("0000000000100001110110011", builder.toString()); } @Test public void testEncode7() { - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); FibonacciIntegerRangeEncoder.encode(builder, Arrays.asList(2, 5, 6, 7, 8, 9, 10, 11, 12)); - Assertions.assertEquals("00000000001000111001101011", builder.build().toString()); + Assertions.assertEquals("00000000001000111001101011", builder.toString()); + } + + private IntegerSet decode(String str) { + return FibonacciIntegerRangeEncoder.decode(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"))); + Assertions.assertEquals(Set.of(3, 5, 6, 7, 8), 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"))); + Assertions.assertEquals( + Set.of(2, 5, 6, 7, 8, 9, 10, 11, 12), decode("00000000001000111001101011")); } @Test public void testDecode7() { try { - FibonacciIntegerRangeEncoder.decode(BitString.of("0011")); + decode("0011"); Assertions.fail("DecodingException expected"); } catch (DecodingException e) { @@ -108,7 +110,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..e8ea82e7 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 @@ -1,131 +1,134 @@ package com.iab.gpp.encoder.datatype.encoder; +import com.iab.gpp.encoder.bitstring.BitString; +import com.iab.gpp.encoder.datatype.IntegerSet; +import com.iab.gpp.encoder.error.DecodingException; import java.util.Set; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.error.DecodingException; - public class FixedBitfieldEncoderTest { @Test public void testEncode1() { - BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); FixedBitfieldEncoder.encode(builder, set, 2); - Assertions.assertEquals("00", builder.build().toString()); + Assertions.assertEquals("00", builder.toString()); } @Test public void testEncode2() { - BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); FixedBitfieldEncoder.encode(builder, set, 1); - Assertions.assertEquals("0", builder.build().toString()); + Assertions.assertEquals("0", builder.toString()); } @Test public void testEncode3() { - BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); set.add(0); FixedBitfieldEncoder.encode(builder, set, 1); - Assertions.assertEquals("1", builder.build().toString()); + Assertions.assertEquals("1", builder.toString()); } @Test public void testEncode4() { - BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); FixedBitfieldEncoder.encode(builder, set, 2); - Assertions.assertEquals("00", builder.build().toString()); + Assertions.assertEquals("00", builder.toString()); } @Test public void testEncode5() { - BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); set.addInt(1); FixedBitfieldEncoder.encode(builder, set, 2); - Assertions.assertEquals("01", builder.build().toString()); + Assertions.assertEquals("01", builder.toString()); } @Test public void testEncode6() { - BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); set.addInt(0); FixedBitfieldEncoder.encode(builder, set, 2); - Assertions.assertEquals("10", builder.build().toString()); + Assertions.assertEquals("10", builder.toString()); } @Test public void testEncode7() { - BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); set.addInt(0); set.addInt(1); FixedBitfieldEncoder.encode(builder, set, 2); - Assertions.assertEquals("11", builder.build().toString()); + Assertions.assertEquals("11", builder.toString()); } @Test public void testEncode8() { - IntegerSet set = new IntegerBitSet(5); - for(int i = 0; i <= 10; i++) { + IntegerSet set = new IntegerSet(5); + for (int i = 0; i <= 10; i++) { set.addInt(i); } - Assertions.assertEquals(Set.of(0,1,2,3,4), set); + Assertions.assertEquals(Set.of(0, 1, 2, 3, 4), set); } @Test public void testEncode9() { - IntegerBitSet set = new IntegerBitSet(5); - set.addRange(0,10); - Assertions.assertEquals(Set.of(0,1,2,3,4), set); + 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 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..ff6f8035 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 @@ -1,93 +1,90 @@ package com.iab.gpp.encoder.datatype.encoder; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - 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; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class FixedIntegerEncoderTest { @Test public void testEncode1() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerEncoder.encode(builder, 0, 1); - Assertions.assertEquals("0", builder.build().toString()); + BitString builder = new BitString(); + builder.writeInt(0, 1); + Assertions.assertEquals("0", builder.toString()); } @Test public void testEncode2() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerEncoder.encode(builder, 0, 6); - Assertions.assertEquals("000000", builder.build().toString()); + BitString builder = new BitString(); + builder.writeInt(0, 6); + Assertions.assertEquals("000000", builder.toString()); } @Test public void testEncode3() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerEncoder.encode(builder, 1, 1); - Assertions.assertEquals("1", builder.build().toString()); + BitString builder = new BitString(); + builder.writeInt(1, 1); + Assertions.assertEquals("1", builder.toString()); } @Test public void testEncode4() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerEncoder.encode(builder, 1, 4); - Assertions.assertEquals("0001", builder.build().toString()); + BitString builder = new BitString(); + builder.writeInt(1, 4); + Assertions.assertEquals("0001", builder.toString()); } @Test public void testEncode5() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerEncoder.encode(builder, 7, 8); - Assertions.assertEquals("00000111", builder.build().toString()); + BitString builder = new BitString(); + builder.writeInt(7, 8); + Assertions.assertEquals("00000111", builder.toString()); } - + @Test public void testEncode6() { try { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerEncoder.encode(builder, 8, 1); + BitString builder = new BitString(); + builder.writeInt(8, 1); Assertions.fail("EncodingException expected"); } catch (EncodingException e) { } } - @Test - public void testDecode1() throws DecodingException { - Assertions.assertEquals(0, FixedIntegerEncoder.decode(BitString.of(""))); + private int decode(String str) { + return BitString.of(str).readInt(str.length()); } @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 deleted file mode 100644 index 16a70ff4..00000000 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerListEncoderTest.java +++ /dev/null @@ -1,266 +0,0 @@ -package com.iab.gpp.encoder.datatype.encoder; - -import java.util.ArrayList; -import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -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 FixedIntegerListEncoderTest { - - @Test - public void testEncode1() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, new ArrayList<>(), 2, 2); - Assertions.assertEquals("0000", builder.build().toString()); - } - - @Test - public void testEncode2() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(0), 2, 2); - Assertions.assertEquals("0000", builder.build().toString()); - } - - @Test - public void testEncode3() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(0, 0), 2, 2); - Assertions.assertEquals("0000", builder.build().toString()); - } - - @Test - public void testEncode4() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(0, 1), 2, 2); - Assertions.assertEquals("0001", builder.build().toString()); - } - - @Test - public void testEncode5() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(0, 2), 2, 2); - Assertions.assertEquals("0010", builder.build().toString()); - } - - @Test - public void testEncode6() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(0, 3), 2, 2); - Assertions.assertEquals("0011", builder.build().toString()); - } - - @Test - public void testEncode7() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(1, 0), 2, 2); - Assertions.assertEquals("0100", builder.build().toString()); - } - - @Test - public void testEncode8() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(1, 1), 2, 2); - Assertions.assertEquals("0101", builder.build().toString()); - } - - @Test - public void testEncode9() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(1, 2), 2, 2); - Assertions.assertEquals("0110", builder.build().toString()); - } - - @Test - public void testEncode10() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(1, 3), 2, 2); - Assertions.assertEquals("0111", builder.build().toString()); - } - - @Test - public void testEncode11() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(2, 0), 2, 2); - Assertions.assertEquals("1000", builder.build().toString()); - } - - @Test - public void testEncode12() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(2, 1), 2, 2); - Assertions.assertEquals("1001", builder.build().toString()); - } - - @Test - public void testEncode13() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(2, 2), 2, 2); - Assertions.assertEquals("1010", builder.build().toString()); - } - - @Test - public void testEncode14() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(2, 3), 2, 2); - Assertions.assertEquals("1011", builder.build().toString()); - } - - @Test - public void testEncode15() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(3, 0), 2, 2); - Assertions.assertEquals("1100", builder.build().toString()); - } - - @Test - public void testEncode16() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(3, 1), 2, 2); - Assertions.assertEquals("1101", builder.build().toString()); - } - - @Test - public void testEncode17() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(3, 2), 2, 2); - Assertions.assertEquals("1110", builder.build().toString()); - } - - @Test - public void testEncode18() { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(3, 3), 2, 2); - Assertions.assertEquals("1111", builder.build().toString()); - } - - @Test - public void testEncode19() { - try { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerListEncoder.encode(builder, Arrays.asList(3, 3), 1, 1); - Assertions.fail("EncodingException expected"); - } catch (EncodingException e) { - - } - } - - @Test - public void testDecode1() { - Assertions.assertEquals(Arrays.asList(0, 0), FixedIntegerListEncoder.decode(BitString.of(""), 2, 2)); - } - - @Test - public void testDecode2() { - Assertions.assertEquals(Arrays.asList(0, 0), FixedIntegerListEncoder.decode(BitString.of("0000"), 2, 2)); - } - - @Test - public void testDecode3() { - Assertions.assertEquals(Arrays.asList(0, 1), FixedIntegerListEncoder.decode(BitString.of("0001"), 2, 2)); - } - - @Test - public void testDecode4() { - Assertions.assertEquals(Arrays.asList(0, 2), FixedIntegerListEncoder.decode(BitString.of("0010"), 2, 2)); - } - - @Test - public void testDecode5() { - Assertions.assertEquals(Arrays.asList(0, 3), FixedIntegerListEncoder.decode(BitString.of("0011"), 2, 2)); - } - - @Test - public void testDecode6() { - Assertions.assertEquals(Arrays.asList(1, 0), FixedIntegerListEncoder.decode(BitString.of("0100"), 2, 2)); - } - - @Test - public void testDecode7() { - Assertions.assertEquals(Arrays.asList(1, 1), FixedIntegerListEncoder.decode(BitString.of("0101"), 2, 2)); - } - - @Test - public void testDecode8() { - Assertions.assertEquals(Arrays.asList(1, 2), FixedIntegerListEncoder.decode(BitString.of("0110"), 2, 2)); - } - - @Test - public void testDecode9() { - Assertions.assertEquals(Arrays.asList(1, 3), FixedIntegerListEncoder.decode(BitString.of("0111"), 2, 2)); - } - - @Test - public void testDecode10() { - Assertions.assertEquals(Arrays.asList(2, 0), FixedIntegerListEncoder.decode(BitString.of("1000"), 2, 2)); - } - - @Test - public void testDecode11() { - Assertions.assertEquals(Arrays.asList(2, 1), FixedIntegerListEncoder.decode(BitString.of("1001"), 2, 2)); - } - - @Test - public void testDecode12() { - Assertions.assertEquals(Arrays.asList(2, 2), FixedIntegerListEncoder.decode(BitString.of("1010"), 2, 2)); - } - - @Test - public void testDecode13() { - Assertions.assertEquals(Arrays.asList(2, 3), FixedIntegerListEncoder.decode(BitString.of("1011"), 2, 2)); - } - - @Test - public void testDecode14() { - Assertions.assertEquals(Arrays.asList(3, 0), FixedIntegerListEncoder.decode(BitString.of("1100"), 2, 2)); - } - - @Test - public void testDecode15() { - Assertions.assertEquals(Arrays.asList(3, 1), FixedIntegerListEncoder.decode(BitString.of("1101"), 2, 2)); - } - - @Test - public void testDecode16() { - Assertions.assertEquals(Arrays.asList(3, 2), FixedIntegerListEncoder.decode(BitString.of("1110"), 2, 2)); - } - - @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) { - - } - } - - @Test - public void testDecode19() { - try { - FixedIntegerListEncoder.decode(BitString.of("2"), 2, 2); - Assertions.fail("DecodingException expected"); - } catch (DecodingException e) { - - } - } - - @Test - public void testDecode20() { - try { - FixedIntegerListEncoder.decode(BitString.of("111"), 2, 2); - 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..d8a9f8c3 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 @@ -1,140 +1,149 @@ package com.iab.gpp.encoder.datatype.encoder; +import com.iab.gpp.encoder.bitstring.BitString; +import com.iab.gpp.encoder.datatype.IntegerSet; +import com.iab.gpp.encoder.error.DecodingException; import java.util.ArrayList; import java.util.Arrays; import java.util.Set; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import com.iab.gpp.encoder.bitstring.BitString; -import com.iab.gpp.encoder.bitstring.BitStringBuilder; -import com.iab.gpp.encoder.error.DecodingException; - public class FixedIntegerRangeEncoderTest { @Test public void testEncode1() { - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); FixedIntegerRangeEncoder.encode(builder, new ArrayList<>()); - Assertions.assertEquals("000000000000", builder.build().toString()); + Assertions.assertEquals("000000000000", builder.toString()); } @Test public void testEncode2() { - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); FixedIntegerRangeEncoder.encode(builder, Arrays.asList(2)); - Assertions.assertEquals("00000000000100000000000000010", builder.build().toString()); + Assertions.assertEquals("00000000000100000000000000010", builder.toString()); } @Test public void testEncode3() { - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); FixedIntegerRangeEncoder.encode(builder, Arrays.asList(2, 3, 4, 5, 6)); - Assertions.assertEquals("000000000001100000000000000100000000000000110", - builder.build().toString()); + Assertions.assertEquals("000000000001100000000000000100000000000000110", builder.toString()); } @Test public void testEncode4() { - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); FixedIntegerRangeEncoder.encode(builder, Arrays.asList(2, 5, 6, 7)); - Assertions.assertEquals("00000000001000000000000000010100000000000001010000000000000111", - builder.build().toString()); + Assertions.assertEquals( + "00000000001000000000000000010100000000000001010000000000000111", builder.toString()); } @Test public void testEncode5() { - BitStringBuilder builder = new BitStringBuilder(); - IntegerSet set = new IntegerBitSet(); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); set.addAll(Arrays.asList(6, 7, 2, 5)); FixedIntegerRangeEncoder.encode(builder, set); - Assertions.assertEquals("00000000001000000000000000010100000000000001010000000000000111", - builder.build().toString()); + Assertions.assertEquals( + "00000000001000000000000000010100000000000001010000000000000111", builder.toString()); } @Test public void testEncode6() { - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); FixedIntegerRangeEncoder.encode(builder, Arrays.asList(3, 5, 6, 7, 8)); - Assertions.assertEquals("00000000001000000000000000011100000000000001010000000000001000", - builder.build().toString()); + Assertions.assertEquals( + "00000000001000000000000000011100000000000001010000000000001000", builder.toString()); } @Test public void testEncode7() { - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); FixedIntegerRangeEncoder.encode(builder, Arrays.asList(12, 24, 48)); - Assertions.assertEquals("000000000011000000000000011000000000000001100000000000000110000", - builder.build().toString()); + Assertions.assertEquals( + "000000000011000000000000011000000000000001100000000000000110000", builder.toString()); } @Test public void testEncode8() { - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); FixedIntegerRangeEncoder.encode(builder, Arrays.asList(12, 24, 48, 49)); - Assertions.assertEquals("0000000000110000000000000110000000000000011000100000000001100000000000000110001", - builder.build().toString()); + Assertions.assertEquals( + "0000000000110000000000000110000000000000011000100000000001100000000000000110001", + builder.toString()); } @Test public void testEncode9() { - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); FixedIntegerRangeEncoder.encode(builder, Arrays.asList(2, 6, 8, 12, 18, 23, 24, 25, 37, 42)); Assertions.assertEquals( "00000000100000000000000000010000000000000001100000000000000100000000000000001100000000000000100101000000000001011100000000000110010000000000010010100000000000101010", - builder.build().toString()); + builder.toString()); + } + + private IntegerSet decode(String str) { + return FixedIntegerRangeEncoder.decode(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"))); + Assertions.assertEquals( + Set.of(2, 3, 4, 5, 6), decode("000000000001100000000000000100000000000000110")); } @Test public void testDecode4() throws DecodingException { - Assertions.assertEquals(Set.of(2, 5, 6, 7), - FixedIntegerRangeEncoder.decode(BitString.of("00000000001000000000000000010100000000000001010000000000000111"))); + Assertions.assertEquals( + Set.of(2, 5, 6, 7), + decode("00000000001000000000000000010100000000000001010000000000000111")); } @Test public void testDecode5() throws DecodingException { - Assertions.assertEquals(Set.of(3, 5, 6, 7, 8), - FixedIntegerRangeEncoder.decode(BitString.of("00000000001000000000000000011100000000000001010000000000001000"))); + Assertions.assertEquals( + Set.of(3, 5, 6, 7, 8), + decode("00000000001000000000000000011100000000000001010000000000001000")); } @Test public void testDecode6() throws DecodingException { - Assertions.assertEquals(Set.of(12, 24, 48), - FixedIntegerRangeEncoder.decode(BitString.of("000000000011000000000000011000000000000001100000000000000110000"))); + Assertions.assertEquals( + Set.of(12, 24, 48), + 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 +153,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..fec0583e 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 @@ -1,106 +1,102 @@ package com.iab.gpp.encoder.datatype.encoder; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - 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; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class FixedLongEncoderTest { @Test public void testEncode1() { - BitStringBuilder builder = new BitStringBuilder(); - FixedLongEncoder.encode(builder, 0, 1); - Assertions.assertEquals("0", builder.build().toString()); + BitString builder = new BitString(); + builder.writeLong(0, 1); + Assertions.assertEquals("0", builder.toString()); } @Test public void testEncode2() { - BitStringBuilder builder = new BitStringBuilder(); - FixedLongEncoder.encode(builder, 0, 6); - Assertions.assertEquals("000000", builder.build().toString()); + BitString builder = new BitString(); + builder.writeLong(0, 6); + Assertions.assertEquals("000000", builder.toString()); } @Test public void testEncode3() { - BitStringBuilder builder = new BitStringBuilder(); - FixedLongEncoder.encode(builder, 1, 1); - Assertions.assertEquals("1", builder.build().toString()); + BitString builder = new BitString(); + builder.writeLong(1, 1); + Assertions.assertEquals("1", builder.toString()); } @Test public void testEncode4() { - BitStringBuilder builder = new BitStringBuilder(); - FixedLongEncoder.encode(builder, 1, 4); - Assertions.assertEquals("0001", builder.build().toString()); + BitString builder = new BitString(); + builder.writeLong(1, 4); + Assertions.assertEquals("0001", builder.toString()); } @Test public void testEncode5() { - BitStringBuilder builder = new BitStringBuilder(); - FixedLongEncoder.encode(builder, 7, 8); - Assertions.assertEquals("00000111", builder.build().toString()); + BitString builder = new BitString(); + builder.writeLong(7, 8); + Assertions.assertEquals("00000111", builder.toString()); } - @Test public void testEncode6() { - BitStringBuilder builder = new BitStringBuilder(); - FixedLongEncoder.encode(builder, 16630898421L, 36); - Assertions.assertEquals("001111011111010001110101111011110101", builder.build().toString()); + BitString builder = new BitString(); + builder.writeLong(16630898421L, 36); + Assertions.assertEquals("001111011111010001110101111011110101", builder.toString()); } - + @Test public void testEncode7() { try { - BitStringBuilder builder = new BitStringBuilder(); - FixedIntegerEncoder.encode(builder, 8, 1); + BitString builder = new BitString(); + builder.writeInt(8, 1); Assertions.fail("EncodingException expected"); } catch (EncodingException e) { } } - @Test - public void testDecode1() throws DecodingException { - Assertions.assertEquals(0, FixedLongEncoder.decode(BitString.of(""))); + private long decode(String str) { + return BitString.of(str).readLong(str.length()); } @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..78c1e0b6 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 @@ -1,33 +1,31 @@ package com.iab.gpp.encoder.datatype.encoder; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - 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; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class FixedStringEncoderTest { @Test public void testEncode1() { - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); FixedStringEncoder.encode(builder, "AB", 2); - Assertions.assertEquals("000000000001", builder.build().toString()); + Assertions.assertEquals("000000000001", builder.toString()); } @Test public void testEncode2() { - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); FixedStringEncoder.encode(builder, "a", 2); - Assertions.assertEquals("100000111111", builder.build().toString()); + Assertions.assertEquals("100000111111", builder.toString()); } @Test public void testEncode3() { try { - BitStringBuilder builder = new BitStringBuilder(); + BitString builder = new BitString(); FixedStringEncoder.encode(builder, "1", 2); Assertions.fail("DecodingException expected"); } catch (EncodingException e) { @@ -35,20 +33,24 @@ public void testEncode3() { } } + private String decode(String str) { + return FixedStringEncoder.decode(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..d2f32236 --- /dev/null +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/IntegerSetTest.java @@ -0,0 +1,51 @@ +package com.iab.gpp.encoder.datatype.encoder; + +import static org.junit.jupiter.api.Assertions.*; + +import com.iab.gpp.encoder.datatype.IntegerSet; +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..60a9479f 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 @@ -1,32 +1,33 @@ package com.iab.gpp.encoder.section; +import com.iab.gpp.encoder.error.DecodingException; +import com.iab.gpp.encoder.field.HeaderV1Field; import java.util.ArrayList; import java.util.Arrays; import java.util.Set; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import com.iab.gpp.encoder.error.DecodingException; 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,33 +35,38 @@ 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() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new HeaderV1("z").getSectionsIds(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new HeaderV1("z").getSectionsIds(); + }); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/TcfCaV1Test.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/TcfCaV1Test.java index 8b6ecf76..60392396 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/TcfCaV1Test.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/TcfCaV1Test.java @@ -1,6 +1,10 @@ package com.iab.gpp.encoder.section; - +import com.iab.gpp.encoder.datatype.RangeEntry; +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.TcfCaV1Field; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.ArrayList; @@ -9,11 +13,6 @@ import java.util.Set; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import com.iab.gpp.encoder.datatype.RangeEntry; -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.TcfCaV1Field; public class TcfCaV1Test { @@ -21,9 +20,14 @@ public class TcfCaV1Test { public void testEncode1() { TcfCaV1 tcfCaV1 = new TcfCaV1(); - tcfCaV1.setFieldValue(TcfCaV1Field.CREATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); - tcfCaV1.setFieldValue(TcfCaV1Field.LAST_UPDATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); - Assertions.assertEquals("BPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAA.YAAAAAAAAAA", tcfCaV1.encode()); + tcfCaV1.setFieldValue( + TcfCaV1Field.CREATED, + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); + tcfCaV1.setFieldValue( + TcfCaV1Field.LAST_UPDATED, + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); + Assertions.assertEquals( + "BPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAA.YAAAAAAAAAA", tcfCaV1.encode()); } @Test @@ -34,38 +38,53 @@ public void testEncode2() { tcfCaV1.setFieldValue(TcfCaV1Field.CMP_VERSION, 2); tcfCaV1.setFieldValue(TcfCaV1Field.VENDOR_LIST_VERSION, 413); tcfCaV1.setFieldValue(TcfCaV1Field.USE_NON_STANDARD_STACKS, true); - tcfCaV1.setFieldValue(TcfCaV1Field.SPECIAL_FEATURE_EXPRESS_CONSENT, - Arrays.asList(6, 7, 8, 9, 10, 11)); - tcfCaV1.setFieldValue(TcfCaV1Field.PURPOSES_EXPRESS_CONSENT, + tcfCaV1.setFieldValue( + TcfCaV1Field.SPECIAL_FEATURE_EXPRESS_CONSENT, Arrays.asList(6, 7, 8, 9, 10, 11)); + tcfCaV1.setFieldValue( + TcfCaV1Field.PURPOSES_EXPRESS_CONSENT, Arrays.asList(0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17)); - tcfCaV1.setFieldValue(TcfCaV1Field.PURPOSES_IMPLIED_CONSENT, + tcfCaV1.setFieldValue( + TcfCaV1Field.PURPOSES_IMPLIED_CONSENT, Arrays.asList(6, 7, 8, 9, 10, 11, 18, 19, 20, 21, 22, 23)); tcfCaV1.setFieldValue(TcfCaV1Field.VENDOR_EXPRESS_CONSENT, Arrays.asList(12, 24, 48)); tcfCaV1.setFieldValue(TcfCaV1Field.VENDOR_IMPLIED_CONSENT, Arrays.asList(18, 30)); - tcfCaV1.setFieldValue(TcfCaV1Field.PUB_PURPOSES_EXPRESS_CONSENT, + tcfCaV1.setFieldValue( + TcfCaV1Field.PUB_PURPOSES_EXPRESS_CONSENT, Arrays.asList(0, 1, 2, 6, 7, 8, 12, 13, 14, 18, 19, 20)); - tcfCaV1.setFieldValue(TcfCaV1Field.PUB_PURPOSES_IMPLIED_CONSENT, + tcfCaV1.setFieldValue( + TcfCaV1Field.PUB_PURPOSES_IMPLIED_CONSENT, Arrays.asList(3, 4, 5, 9, 10, 11, 15, 16, 17, 21, 22, 23)); tcfCaV1.setFieldValue(TcfCaV1Field.NUM_CUSTOM_PURPOSES, 3); tcfCaV1.setFieldValue(TcfCaV1Field.CUSTOM_PURPOSES_EXPRESS_CONSENT, Set.of(1)); - tcfCaV1.setFieldValue(TcfCaV1Field.CUSTOM_PURPOSES_IMPLIED_CONSENT, Set.of(0,2)); + tcfCaV1.setFieldValue(TcfCaV1Field.CUSTOM_PURPOSES_IMPLIED_CONSENT, Set.of(0, 2)); - tcfCaV1.setFieldValue(TcfCaV1Field.CREATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); - tcfCaV1.setFieldValue(TcfCaV1Field.LAST_UPDATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); + tcfCaV1.setFieldValue( + TcfCaV1Field.CREATED, + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); + tcfCaV1.setFieldValue( + TcfCaV1Field.LAST_UPDATED, + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); - Assertions.assertEquals("BPSG_8APSG_8AAyACAENGdCgf_gfgAfgfgBgABABAAABAB4AACACAAA.fHHHA4444ao", tcfCaV1.encode()); + Assertions.assertEquals( + "BPSG_8APSG_8AAyACAENGdCgf_gfgAfgfgBgABABAAABAB4AACACAAA.fHHHA4444ao", tcfCaV1.encode()); } @Test public void testEncode3() throws EncodingException, InvalidFieldException { TcfCaV1 tcfCaV1 = new TcfCaV1(); - tcfCaV1.setFieldValue(TcfCaV1Field.DISCLOSED_VENDORS, Arrays.asList(1, 2, 3, 5, 6, 7, 10, 11, 12)); + tcfCaV1.setFieldValue( + TcfCaV1Field.DISCLOSED_VENDORS, Arrays.asList(1, 2, 3, 5, 6, 7, 10, 11, 12)); - tcfCaV1.setFieldValue(TcfCaV1Field.CREATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); - tcfCaV1.setFieldValue(TcfCaV1Field.LAST_UPDATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); + tcfCaV1.setFieldValue( + TcfCaV1Field.CREATED, + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); + tcfCaV1.setFieldValue( + TcfCaV1Field.LAST_UPDATED, + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); - Assertions.assertEquals("BPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAA.YAAAAAAAAAA.IAGO5w", tcfCaV1.encode()); + Assertions.assertEquals( + "BPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAA.YAAAAAAAAAA.IAGO5w", tcfCaV1.encode()); } @Test @@ -77,9 +96,15 @@ public void testEncode4() throws EncodingException, InvalidFieldException { TcfCaV1 tcfCaV1 = new TcfCaV1(); tcfCaV1.setFieldValue(TcfCaV1Field.PUB_RESTRICTIONS, pubRestrictions); - tcfCaV1.setFieldValue(TcfCaV1Field.CREATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); - tcfCaV1.setFieldValue(TcfCaV1Field.LAST_UPDATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); - Assertions.assertEquals("BPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAACCgBwABAAOAAoADgAJA.YAAAAAAAAAA", tcfCaV1.encode()); + tcfCaV1.setFieldValue( + TcfCaV1Field.CREATED, + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); + tcfCaV1.setFieldValue( + TcfCaV1Field.LAST_UPDATED, + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); + Assertions.assertEquals( + "BPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAACCgBwABAAOAAoADgAJA.YAAAAAAAAAA", + tcfCaV1.encode()); } @Test @@ -90,30 +115,22 @@ public void testDecode1() { Assertions.assertEquals(0, tcfCaV1.getCmpVersion()); Assertions.assertEquals(0, tcfCaV1.getVendorListVersion()); Assertions.assertEquals(false, tcfCaV1.getUseNonStandardStacks()); - Assertions.assertEquals( - Set.of(), - tcfCaV1.getSpecialFeatureExpressConsent()); - Assertions - .assertEquals( - Set.of(), - tcfCaV1.getPurposesExpressConsent()); - Assertions - .assertEquals( - Set.of(), - tcfCaV1.getPurposesImpliedConsent()); + Assertions.assertEquals(Set.of(), tcfCaV1.getSpecialFeatureExpressConsent()); + Assertions.assertEquals(Set.of(), tcfCaV1.getPurposesExpressConsent()); + Assertions.assertEquals(Set.of(), tcfCaV1.getPurposesImpliedConsent()); Assertions.assertEquals(Set.of(), tcfCaV1.getVendorExpressConsent()); Assertions.assertEquals(Set.of(), tcfCaV1.getVendorImpliedConsent()); - Assertions.assertEquals( - Set.of(), - tcfCaV1.getPubPurposesExpressConsent()); - Assertions.assertEquals( - Set.of(), - tcfCaV1.getPubPurposesImpliedConsent()); + Assertions.assertEquals(Set.of(), tcfCaV1.getPubPurposesExpressConsent()); + Assertions.assertEquals(Set.of(), tcfCaV1.getPubPurposesImpliedConsent()); Assertions.assertEquals(0, tcfCaV1.getNumCustomPurposes()); Assertions.assertEquals(Set.of(), tcfCaV1.getCustomPurposesExpressConsent()); Assertions.assertEquals(Set.of(), tcfCaV1.getCustomPurposesImpliedConsent()); - Assertions.assertEquals(ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(), tcfCaV1.getCreated()); - Assertions.assertEquals(ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(), tcfCaV1.getLastUpdated()); + Assertions.assertEquals( + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(), + tcfCaV1.getCreated()); + Assertions.assertEquals( + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(), + tcfCaV1.getLastUpdated()); Assertions.assertEquals("EN", tcfCaV1.getConsentLanguage()); Assertions.assertEquals(5, tcfCaV1.getId()); @@ -122,33 +139,34 @@ public void testDecode1() { @Test public void testDecode2() { - TcfCaV1 tcfCaV1 = new TcfCaV1("BPSG_8APSG_8AAyACAENGdCgf_gfgAfgfgBgABABAAABAB4AACACAAA.fHHHA4444ao"); + TcfCaV1 tcfCaV1 = + new TcfCaV1("BPSG_8APSG_8AAyACAENGdCgf_gfgAfgfgBgABABAAABAB4AACACAAA.fHHHA4444ao"); Assertions.assertEquals(50, tcfCaV1.getCmpId()); Assertions.assertEquals(2, tcfCaV1.getCmpVersion()); Assertions.assertEquals(413, tcfCaV1.getVendorListVersion()); Assertions.assertEquals(true, tcfCaV1.getUseNonStandardStacks()); - Assertions.assertEquals(Set.of(7, 8, 9, 10, 11, 12), - tcfCaV1.getSpecialFeatureExpressConsent()); - Assertions.assertEquals(Set.of(1, 2, 3, 4, 5, 6, 13, 14, 15, 16, 17, 18), - tcfCaV1.getPurposesExpressConsent()); - Assertions.assertEquals(Set.of(7, 8, 9, 10, 11, 12, 19, 20, 21, 22, 23, 24), - tcfCaV1.getPurposesImpliedConsent()); + Assertions.assertEquals(Set.of(7, 8, 9, 10, 11, 12), tcfCaV1.getSpecialFeatureExpressConsent()); + Assertions.assertEquals( + Set.of(1, 2, 3, 4, 5, 6, 13, 14, 15, 16, 17, 18), tcfCaV1.getPurposesExpressConsent()); + Assertions.assertEquals( + Set.of(7, 8, 9, 10, 11, 12, 19, 20, 21, 22, 23, 24), tcfCaV1.getPurposesImpliedConsent()); Assertions.assertEquals(Set.of(12, 24, 48), tcfCaV1.getVendorExpressConsent()); Assertions.assertEquals(Set.of(18, 30), tcfCaV1.getVendorImpliedConsent()); - Assertions - .assertEquals( - Set.of(1, 2, 3, 7, 8, 9, 13, 14, 15, 19, 20, 21), - tcfCaV1.getPubPurposesExpressConsent()); - Assertions - .assertEquals( - Set.of(4, 5, 6, 10, 11, 12, 16, 17, 18, 22, 23, 24), - tcfCaV1.getPubPurposesImpliedConsent()); + Assertions.assertEquals( + Set.of(1, 2, 3, 7, 8, 9, 13, 14, 15, 19, 20, 21), tcfCaV1.getPubPurposesExpressConsent()); + Assertions.assertEquals( + Set.of(4, 5, 6, 10, 11, 12, 16, 17, 18, 22, 23, 24), + tcfCaV1.getPubPurposesImpliedConsent()); Assertions.assertEquals(3, tcfCaV1.getNumCustomPurposes()); Assertions.assertEquals(Set.of(2), tcfCaV1.getCustomPurposesExpressConsent()); Assertions.assertEquals(Set.of(1, 3), tcfCaV1.getCustomPurposesImpliedConsent()); - Assertions.assertEquals(ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(), tcfCaV1.getCreated()); - Assertions.assertEquals(ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(), tcfCaV1.getLastUpdated()); + Assertions.assertEquals( + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(), + tcfCaV1.getCreated()); + Assertions.assertEquals( + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(), + tcfCaV1.getLastUpdated()); Assertions.assertEquals("EN", tcfCaV1.getConsentLanguage()); Assertions.assertEquals(5, tcfCaV1.getId()); @@ -165,7 +183,8 @@ public void testDecode3() throws DecodingException { @Test public void testDecode4() throws DecodingException { - TcfCaV1 tcfCaV1 = new TcfCaV1("BPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAACCgBwABAAOAAoADgAJA.YAAAAAAAAAA"); + TcfCaV1 tcfCaV1 = + new TcfCaV1("BPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAACCgBwABAAOAAoADgAJA.YAAAAAAAAAA"); List pubRestictions = tcfCaV1.getPubRestrictions(); Assertions.assertEquals(1, pubRestictions.size()); @@ -173,18 +192,22 @@ public void testDecode4() throws DecodingException { Assertions.assertEquals(1, pubRestictions.get(0).getType()); Assertions.assertEquals(Set.of(1, 2, 3, 5, 6, 7, 9), pubRestictions.get(0).getIds()); } - + @Test() public void testDecodeGarbage1() { - Assertions.assertThrows(DecodingException.class, () -> { - new TcfCaV1("A").getPubRestrictions(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new TcfCaV1("A").getPubRestrictions(); + }); } - + @Test() public void testDecodeGarbage2() { - Assertions.assertThrows(DecodingException.class, () -> { - new TcfCaV1("z").getPubRestrictions(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new TcfCaV1("z").getPubRestrictions(); + }); } } 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..1abdfb65 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 @@ -1,5 +1,9 @@ package com.iab.gpp.encoder.section; +import com.iab.gpp.encoder.datatype.IntegerSet; +import com.iab.gpp.encoder.datatype.RangeEntry; +import com.iab.gpp.encoder.error.DecodingException; +import com.iab.gpp.encoder.field.TcfEuV2Field; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.ArrayList; @@ -8,40 +12,46 @@ import java.util.Set; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -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.field.TcfEuV2Field; public class TcfEuV2Test { @Test public void testEncode1() { TcfEuV2 tcfEuV2 = new TcfEuV2(); - tcfEuV2.setFieldValue(TcfEuV2Field.CREATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); - tcfEuV2.setFieldValue(TcfEuV2Field.LAST_UPDATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); - Assertions.assertEquals("CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA", tcfEuV2.encode()); + tcfEuV2.setFieldValue( + TcfEuV2Field.CREATED, + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); + tcfEuV2.setFieldValue( + TcfEuV2Field.LAST_UPDATED, + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); + Assertions.assertEquals( + "CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA", tcfEuV2.encode()); + TcfEuV2Field.TCFEUV2_CORE_SEGMENT_FIELD_NAMES.toString(); } @Test public void testEncode2() { TcfEuV2 tcfEuV2 = new TcfEuV2(); tcfEuV2.setFieldValue(TcfEuV2Field.IS_SERVICE_SPECIFIC, true); - tcfEuV2.setFieldValue(TcfEuV2Field.CREATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); - tcfEuV2.setFieldValue(TcfEuV2Field.LAST_UPDATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); + tcfEuV2.setFieldValue( + TcfEuV2Field.CREATED, + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); + tcfEuV2.setFieldValue( + TcfEuV2Field.LAST_UPDATED, + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant()); Assertions.assertEquals(3, tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_PURPOSES_SEGMENT_TYPE)); + Assertions.assertEquals(Set.of(), tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_CONSENTS)); Assertions.assertEquals( - Set.of(), - tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_CONSENTS)); - Assertions.assertEquals( - Set.of(), - tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_LEGITIMATE_INTERESTS)); + Set.of(), tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_LEGITIMATE_INTERESTS)); Assertions.assertEquals(0, tcfEuV2.getFieldValue(TcfEuV2Field.NUM_CUSTOM_PURPOSES)); - Assertions.assertEquals(Set.of(), tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_CUSTOM_CONSENTS)); - Assertions.assertEquals(Set.of(), tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_CUSTOM_LEGITIMATE_INTERESTS)); + Assertions.assertEquals( + Set.of(), tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_CUSTOM_CONSENTS)); + Assertions.assertEquals( + Set.of(), tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_CUSTOM_LEGITIMATE_INTERESTS)); - Assertions.assertEquals("CPSG_8APSG_8AAAAAAENAACgAAAAAAAAAAAAAAAAAAAA.YAAAAAAAAAAA", tcfEuV2.encode()); + Assertions.assertEquals( + "CPSG_8APSG_8AAAAAAENAACgAAAAAAAAAAAAAAAAAAAA.YAAAAAAAAAAA", tcfEuV2.encode()); } @Test @@ -49,8 +59,12 @@ public void testDecode1() { TcfEuV2 tcfEuV2 = new TcfEuV2("CAAAAAAAAAAAAAAAAAENAACAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA"); Assertions.assertEquals(2, tcfEuV2.getVersion()); - Assertions.assertEquals(ZonedDateTime.of(1970, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(), tcfEuV2.getCreated()); - Assertions.assertEquals(ZonedDateTime.of(1970, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(), tcfEuV2.getLastUpdated()); + Assertions.assertEquals( + ZonedDateTime.of(1970, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(), + tcfEuV2.getCreated()); + Assertions.assertEquals( + ZonedDateTime.of(1970, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(), + tcfEuV2.getLastUpdated()); Assertions.assertEquals(0, tcfEuV2.getCmpId()); Assertions.assertEquals(0, tcfEuV2.getCmpVersion()); Assertions.assertEquals(0, tcfEuV2.getConsentScreen()); @@ -59,29 +73,17 @@ public void testDecode1() { Assertions.assertEquals(2, tcfEuV2.getPolicyVersion()); Assertions.assertEquals(false, tcfEuV2.getIsServiceSpecific()); Assertions.assertEquals(false, tcfEuV2.getUseNonStandardStacks()); - Assertions.assertEquals( - Set.of(), - tcfEuV2.getSpecialFeatureOptins()); - Assertions - .assertEquals( - Set.of(), - tcfEuV2.getPurposeConsents()); - Assertions.assertEquals( - Set.of(), - tcfEuV2.getPurposeLegitimateInterests()); + Assertions.assertEquals(Set.of(), tcfEuV2.getSpecialFeatureOptins()); + Assertions.assertEquals(Set.of(), tcfEuV2.getPurposeConsents()); + Assertions.assertEquals(Set.of(), tcfEuV2.getPurposeLegitimateInterests()); Assertions.assertEquals(false, tcfEuV2.getPurposeOneTreatment()); Assertions.assertEquals("AA", tcfEuV2.getPublisherCountryCode()); Assertions.assertEquals(Set.of(), tcfEuV2.getVendorConsents()); Assertions.assertEquals(Set.of(), tcfEuV2.getVendorLegitimateInterests()); Assertions.assertEquals(Arrays.asList(), tcfEuV2.getPublisherRestrictions()); Assertions.assertEquals(3, tcfEuV2.getPublisherPurposesSegmentType()); - Assertions - .assertEquals( - Set.of(), - tcfEuV2.getPublisherConsents()); - Assertions.assertEquals( - Set.of(), - tcfEuV2.getPublisherLegitimateInterests()); + Assertions.assertEquals(Set.of(), tcfEuV2.getPublisherConsents()); + Assertions.assertEquals(Set.of(), tcfEuV2.getPublisherLegitimateInterests()); Assertions.assertEquals(0, tcfEuV2.getNumCustomPurposes()); Assertions.assertEquals(Set.of(), tcfEuV2.getPublisherCustomConsents()); Assertions.assertEquals(Set.of(), tcfEuV2.getPublisherCustomLegitimateInterests()); @@ -98,8 +100,12 @@ public void testDecode2() { TcfEuV2 tcfEuV2 = new TcfEuV2("CPSG_8APSG_8AAAAAAENAACgAAAAAAAAAAAAAAAAAAAA.YAAAAAAAAAAA"); Assertions.assertEquals(2, tcfEuV2.getVersion()); - Assertions.assertEquals(ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(), tcfEuV2.getCreated()); - Assertions.assertEquals(ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(), tcfEuV2.getLastUpdated()); + Assertions.assertEquals( + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(), + tcfEuV2.getCreated()); + Assertions.assertEquals( + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(), + tcfEuV2.getLastUpdated()); Assertions.assertEquals(0, tcfEuV2.getCmpId()); Assertions.assertEquals(0, tcfEuV2.getCmpVersion()); Assertions.assertEquals(0, tcfEuV2.getConsentScreen()); @@ -108,29 +114,17 @@ public void testDecode2() { Assertions.assertEquals(2, tcfEuV2.getPolicyVersion()); Assertions.assertEquals(true, tcfEuV2.getIsServiceSpecific()); Assertions.assertEquals(false, tcfEuV2.getUseNonStandardStacks()); - Assertions.assertEquals( - Set.of(), - tcfEuV2.getSpecialFeatureOptins()); - Assertions - .assertEquals( - Set.of(), - tcfEuV2.getPurposeConsents()); - Assertions.assertEquals( - Set.of(), - tcfEuV2.getPurposeLegitimateInterests()); + Assertions.assertEquals(Set.of(), tcfEuV2.getSpecialFeatureOptins()); + Assertions.assertEquals(Set.of(), tcfEuV2.getPurposeConsents()); + Assertions.assertEquals(Set.of(), tcfEuV2.getPurposeLegitimateInterests()); Assertions.assertEquals(false, tcfEuV2.getPurposeOneTreatment()); Assertions.assertEquals("AA", tcfEuV2.getPublisherCountryCode()); Assertions.assertEquals(Set.of(), tcfEuV2.getVendorConsents()); Assertions.assertEquals(Set.of(), tcfEuV2.getVendorLegitimateInterests()); Assertions.assertEquals(Arrays.asList(), tcfEuV2.getPublisherRestrictions()); Assertions.assertEquals(3, tcfEuV2.getPublisherPurposesSegmentType()); - Assertions - .assertEquals( - Set.of(), - tcfEuV2.getPublisherConsents()); - Assertions.assertEquals( - Set.of(), - tcfEuV2.getPublisherLegitimateInterests()); + Assertions.assertEquals(Set.of(), tcfEuV2.getPublisherConsents()); + Assertions.assertEquals(Set.of(), tcfEuV2.getPublisherLegitimateInterests()); Assertions.assertEquals(0, tcfEuV2.getNumCustomPurposes()); Assertions.assertEquals(Set.of(), tcfEuV2.getPublisherCustomConsents()); Assertions.assertEquals(Set.of(), tcfEuV2.getPublisherCustomLegitimateInterests()); @@ -144,26 +138,27 @@ public void testDecode2() { @Test public void testDecode3() { - TcfEuV2 tcfEuV2 = new TcfEuV2( - "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")); + TcfEuV2 tcfEuV2 = + new TcfEuV2( + "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(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 +180,9 @@ 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,197 +204,238 @@ 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 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( - Set.of(1), - tcfEuV2.getFieldValue("SpecialFeatureOptins")); - Assertions - .assertEquals( - Set.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), - tcfEuV2.getFieldValue("PurposeConsents")); + 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(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(TcfEuV2Field.SPECIAL_FEATURE_OPTINS)); + Assertions.assertEquals( + Set.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), + 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 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( - Set.of(1), - tcfEuV2.getFieldValue("SpecialFeatureOptins")); - Assertions - .assertEquals( - Set.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), - tcfEuV2.getFieldValue("PurposeConsents")); + 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(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(TcfEuV2Field.SPECIAL_FEATURE_OPTINS)); + Assertions.assertEquals( + Set.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), + 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( - Set.of(), - tcfEuV2.getFieldValue("SpecialFeatureOptins")); - Assertions - .assertEquals( - Set.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), - tcfEuV2.getFieldValue("PurposeConsents")); + TcfEuV2 tcfEuV2 = + new TcfEuV2( + "COv_eg6Ov_eg6AOADBENAaCgAP_AAH_AACiQAVEUQQoAIQAqIoghAAQgAA.YAAAAAAAAAAAAAAAAAA"); + + 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(TcfEuV2Field.SPECIAL_FEATURE_OPTINS)); + Assertions.assertEquals( + Set.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), + 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")); + Assertions.assertEquals( + Set.of(2, 6, 8, 12, 18, 23, 37, 42), + tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_LEGITIMATE_INTERESTS)); } - + @SuppressWarnings("unchecked") @Test 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( - Set.of(1), - tcfEuV2.getFieldValue("SpecialFeatureOptins")); + "2019-10-07T05:17:54Z", tcfEuV2.getFieldValue(TcfEuV2Field.CREATED).toString()); Assertions.assertEquals( - Set.of(1), - tcfEuV2.getFieldValue("PurposeConsents")); + "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(TcfEuV2Field.SPECIAL_FEATURE_OPTINS)); + Assertions.assertEquals(Set.of(1), tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_CONSENTS)); Assertions.assertEquals( - Set.of(2, 7, 9, 10), - tcfEuV2.getFieldValue("PurposeLegitimateInterests")); + Set.of(2, 7, 9, 10), 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")); - - Assertions.assertEquals(1, ((List)tcfEuV2.getFieldValue("PublisherRestrictions")).size()); - RangeEntry rangeEntry = ((List)tcfEuV2.getFieldValue("PublisherRestrictions")).get(0); + Assertions.assertEquals( + Set.of(1, 2, 3, 4, 5, 6, 7, 8, 9), + tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_LEGITIMATE_INTERESTS)); + + 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()); } - + @Test() public void testDecodeGarbage1() { - Assertions.assertThrows(DecodingException.class, () -> { - new TcfEuV2("A").getCreated(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new TcfEuV2("A").getCreated(); + }); } - + @Test() public void testDecodeGarbage2() { - Assertions.assertThrows(DecodingException.class, () -> { - new TcfEuV2("z").getCreated(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new TcfEuV2("z").getCreated(); + }); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsCaTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsCaTest.java index 6dcc3fcc..3ef79752 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsCaTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsCaTest.java @@ -1,12 +1,11 @@ package com.iab.gpp.encoder.section; - -import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.ValidationException; import com.iab.gpp.encoder.field.UsCaField; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class UsCaTest { @@ -26,7 +25,8 @@ public void testEncode2() { usCa.setFieldValue(UsCaField.SENSITIVE_DATA_LIMIT_USE_NOTICE, 1); usCa.setFieldValue(UsCaField.SALE_OPT_OUT, 1); usCa.setFieldValue(UsCaField.SHARING_OPT_OUT, 1); - usCa.setFieldValue(UsCaField.SENSITIVE_DATA_PROCESSING, Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0)); + usCa.setFieldValue( + UsCaField.SENSITIVE_DATA_PROCESSING, Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0)); usCa.setFieldValue(UsCaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, Arrays.asList(2, 1)); usCa.setFieldValue(UsCaField.PERSONAL_DATA_CONSENTS, 1); usCa.setFieldValue(UsCaField.MSPA_COVERED_TRANSACTION, 1); @@ -46,7 +46,8 @@ public void testEncode3() { usCa.setFieldValue(UsCaField.SENSITIVE_DATA_LIMIT_USE_NOTICE, 1); usCa.setFieldValue(UsCaField.SALE_OPT_OUT, 1); usCa.setFieldValue(UsCaField.SHARING_OPT_OUT, 1); - usCa.setFieldValue(UsCaField.SENSITIVE_DATA_PROCESSING, Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0)); + usCa.setFieldValue( + UsCaField.SENSITIVE_DATA_PROCESSING, Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0)); usCa.setFieldValue(UsCaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, Arrays.asList(2, 1)); usCa.setFieldValue(UsCaField.PERSONAL_DATA_CONSENTS, 1); usCa.setFieldValue(UsCaField.MSPA_COVERED_TRANSACTION, 1); @@ -56,7 +57,7 @@ public void testEncode3() { Assertions.assertEquals("BVWSSSVY.YA", usCa.encode()); } - + @Test public void testSetInvalidValues() { UsCa usCa = new UsCa(); @@ -65,80 +66,81 @@ public void testSetInvalidValues() { usCa.setFieldValue(UsCaField.SALE_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCa.setFieldValue(UsCaField.SHARING_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCa.setFieldValue(UsCaField.SENSITIVE_DATA_LIMIT_USE_NOTICE, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCa.setFieldValue(UsCaField.SALE_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCa.setFieldValue(UsCaField.SHARING_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { - usCa.setFieldValue(UsCaField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 0, 0, 0, 3, 0, 0, 0, 0)); + usCa.setFieldValue( + UsCaField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 0, 0, 0, 3, 0, 0, 0, 0)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCa.setFieldValue(UsCaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, Arrays.asList(0, 3)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCa.setFieldValue(UsCaField.PERSONAL_DATA_CONSENTS, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCa.setFieldValue(UsCaField.MSPA_COVERED_TRANSACTION, 0); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCa.setFieldValue(UsCaField.MSPA_OPT_OUT_OPTION_MODE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCa.setFieldValue(UsCaField.MSPA_SERVICE_PROVIDER_MODE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } } - + @Test public void testEncodeWithGpcSegmentExcluded() { @@ -156,7 +158,8 @@ public void testDecode1() { Assertions.assertEquals(1, usCa.getSensitiveDataLimitUseNotice()); Assertions.assertEquals(1, usCa.getSaleOptOut()); Assertions.assertEquals(1, usCa.getSharingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0), usCa.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0), usCa.getSensitiveDataProcessing()); Assertions.assertEquals(Arrays.asList(2, 1), usCa.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usCa.getPersonalDataConsents()); Assertions.assertEquals(1, usCa.getMspaCoveredTransaction()); @@ -174,7 +177,8 @@ public void testDecodeWithGpcSegmentExcluded() { Assertions.assertEquals(1, usCa.getSensitiveDataLimitUseNotice()); Assertions.assertEquals(1, usCa.getSaleOptOut()); Assertions.assertEquals(1, usCa.getSharingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0), usCa.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0), usCa.getSensitiveDataProcessing()); Assertions.assertEquals(Arrays.asList(2, 1), usCa.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usCa.getPersonalDataConsents()); Assertions.assertEquals(1, usCa.getMspaCoveredTransaction()); @@ -182,11 +186,13 @@ public void testDecodeWithGpcSegmentExcluded() { Assertions.assertEquals(2, usCa.getMspaServiceProviderMode()); Assertions.assertEquals(false, usCa.getGpcSegmentIncluded()); } - + @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new UsCa("z").getPersonalDataConsents(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new UsCa("z").getPersonalDataConsents(); + }); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsCoTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsCoTest.java index 59488ff1..38d62643 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsCoTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsCoTest.java @@ -1,12 +1,11 @@ package com.iab.gpp.encoder.section; - -import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.ValidationException; import com.iab.gpp.encoder.field.UsCoField; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class UsCoTest { @@ -34,7 +33,7 @@ public void testEncode2() { Assertions.assertEquals("BVWSSVg.YA", usCo.encode()); } - + @Test public void testSetInvalidValues() { UsCo usCo = new UsCo(); @@ -43,72 +42,71 @@ public void testSetInvalidValues() { usCo.setFieldValue(UsCoField.SHARING_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCo.setFieldValue(UsCoField.SALE_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCo.setFieldValue(UsCoField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCo.setFieldValue(UsCoField.SALE_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCo.setFieldValue(UsCoField.TARGETED_ADVERTISING_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCo.setFieldValue(UsCoField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 0, 1, 2)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCo.setFieldValue(UsCoField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCo.setFieldValue(UsCoField.MSPA_COVERED_TRANSACTION, 0); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCo.setFieldValue(UsCoField.MSPA_OPT_OUT_OPTION_MODE, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCo.setFieldValue(UsCoField.MSPA_SERVICE_PROVIDER_MODE, 5); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - - } + } } @Test @@ -151,11 +149,13 @@ public void testDecodeWithGpcSegmentExcluded() { Assertions.assertEquals(2, usCo.getMspaServiceProviderMode()); Assertions.assertEquals(false, usCo.getGpcSegmentIncluded()); } - + @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new UsCo("z").getTargetedAdvertisingOptOut(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new UsCo("z").getTargetedAdvertisingOptOut(); + }); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsCtTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsCtTest.java index 03ea9f9b..1dd4877e 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsCtTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsCtTest.java @@ -1,12 +1,11 @@ package com.iab.gpp.encoder.section; - -import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.ValidationException; import com.iab.gpp.encoder.field.UsCtField; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class UsCtTest { @@ -34,7 +33,7 @@ public void testEncode2() { Assertions.assertEquals("BVWSSZFg.YA", usCt.encode()); } - + @Test public void testSetInvalidValues() { UsCt usCt = new UsCt(); @@ -43,70 +42,71 @@ public void testSetInvalidValues() { usCt.setFieldValue(UsCtField.SHARING_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCt.setFieldValue(UsCtField.SALE_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCt.setFieldValue(UsCtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCt.setFieldValue(UsCtField.SALE_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCt.setFieldValue(UsCtField.TARGETED_ADVERTISING_OPT_OUT, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { - usCt.setFieldValue(UsCtField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); + usCt.setFieldValue( + UsCtField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCt.setFieldValue(UsCtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, Arrays.asList(1, 2, 3)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCt.setFieldValue(UsCtField.MSPA_COVERED_TRANSACTION, 0); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCt.setFieldValue(UsCtField.MSPA_OPT_OUT_OPTION_MODE, 4); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usCt.setFieldValue(UsCtField.MSPA_SERVICE_PROVIDER_MODE, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } } @@ -126,7 +126,8 @@ public void testDecode1() throws DecodingException { Assertions.assertEquals(1, usCt.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usCt.getSaleOptOut()); Assertions.assertEquals(1, usCt.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usCt.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usCt.getSensitiveDataProcessing()); Assertions.assertEquals(Arrays.asList(2, 1, 0), usCt.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usCt.getMspaCoveredTransaction()); Assertions.assertEquals(1, usCt.getMspaOptOutOptionMode()); @@ -143,18 +144,21 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(1, usCt.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usCt.getSaleOptOut()); Assertions.assertEquals(1, usCt.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usCt.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usCt.getSensitiveDataProcessing()); Assertions.assertEquals(Arrays.asList(2, 1, 0), usCt.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usCt.getMspaCoveredTransaction()); Assertions.assertEquals(1, usCt.getMspaOptOutOptionMode()); Assertions.assertEquals(2, usCt.getMspaServiceProviderMode()); Assertions.assertEquals(false, usCt.getGpcSegmentIncluded()); } - + @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new UsCt("z").getSharingNotice(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new UsCt("z").getSharingNotice(); + }); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsDeTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsDeTest.java index 30341616..dfc6c081 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsDeTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsDeTest.java @@ -1,12 +1,11 @@ package com.iab.gpp.encoder.section; - -import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.ValidationException; import com.iab.gpp.encoder.field.UsDeField; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class UsDeTest { @@ -25,7 +24,8 @@ public void testEncode2() { usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 1); usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 1); - usDe.setFieldValue(UsDeField.SENSITIVE_DATA_PROCESSING, Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0)); + usDe.setFieldValue( + UsDeField.SENSITIVE_DATA_PROCESSING, Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0)); usDe.setFieldValue(UsDeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, Arrays.asList(2, 1, 0, 2, 1)); usDe.setFieldValue(UsDeField.ADDITIONAL_DATA_PROCESSING_CONSENT, 1); usDe.setFieldValue(UsDeField.MSPA_COVERED_TRANSACTION, 1); @@ -35,7 +35,7 @@ public void testEncode2() { Assertions.assertEquals("BVWSSSSVYA.YA", usDe.encode()); } - + @Test public void testSetInvalidValues() { UsDe usDe = new UsDe(); @@ -44,77 +44,78 @@ public void testSetInvalidValues() { usDe.setFieldValue(UsDeField.PROCESSING_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { - usDe.setFieldValue(UsDeField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); + usDe.setFieldValue( + UsDeField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usDe.setFieldValue(UsDeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, Arrays.asList(1, 2, 3)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usDe.setFieldValue(UsDeField.ADDITIONAL_DATA_PROCESSING_CONSENT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usDe.setFieldValue(UsDeField.MSPA_COVERED_TRANSACTION, 0); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 4); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } } @@ -134,8 +135,10 @@ public void testDecode1() throws DecodingException { Assertions.assertEquals(1, usDe.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usDe.getSaleOptOut()); Assertions.assertEquals(1, usDe.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0), usDe.getSensitiveDataProcessing()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1), usDe.getKnownChildSensitiveDataConsents()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0), usDe.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1), usDe.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usDe.getAdditionalDataProcessingConsent()); Assertions.assertEquals(1, usDe.getMspaCoveredTransaction()); Assertions.assertEquals(1, usDe.getMspaOptOutOptionMode()); @@ -152,19 +155,23 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(1, usDe.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usDe.getSaleOptOut()); Assertions.assertEquals(1, usDe.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0), usDe.getSensitiveDataProcessing()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1), usDe.getKnownChildSensitiveDataConsents()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0), usDe.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1), usDe.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usDe.getAdditionalDataProcessingConsent()); Assertions.assertEquals(1, usDe.getMspaCoveredTransaction()); Assertions.assertEquals(1, usDe.getMspaOptOutOptionMode()); Assertions.assertEquals(2, usDe.getMspaServiceProviderMode()); Assertions.assertEquals(false, usDe.getGpcSegmentIncluded()); } - + @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new UsDe("z").getProcessingNotice(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new UsDe("z").getProcessingNotice(); + }); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsFlTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsFlTest.java index 3882d962..fe4158ad 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsFlTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsFlTest.java @@ -1,14 +1,13 @@ package com.iab.gpp.encoder.section; - -import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; 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.error.ValidationException; import com.iab.gpp.encoder.field.UsFlField; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class UsFlTest { @@ -28,7 +27,8 @@ public void testEncode2() { usFl.setFieldValue(UsFlField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); usFl.setFieldValue(UsFlField.SALE_OPT_OUT, 1); usFl.setFieldValue(UsFlField.TARGETED_ADVERTISING_OPT_OUT, 1); - usFl.setFieldValue(UsFlField.SENSITIVE_DATA_PROCESSING, Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1)); + usFl.setFieldValue( + UsFlField.SENSITIVE_DATA_PROCESSING, Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1)); usFl.setFieldValue(UsFlField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, Arrays.asList(2, 1, 2)); usFl.setFieldValue(UsFlField.ADDITIONAL_DATA_PROCESSING_CONSENT, 1); usFl.setFieldValue(UsFlField.MSPA_COVERED_TRANSACTION, 1); @@ -81,7 +81,8 @@ public void testSetInvalidValues() { } try { - usFl.setFieldValue(UsFlField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); + usFl.setFieldValue( + UsFlField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { @@ -121,7 +122,6 @@ public void testSetInvalidValues() { } catch (ValidationException e) { } - } @Test @@ -133,18 +133,21 @@ public void testDecode1() throws DecodingException { Assertions.assertEquals(1, usFl.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usFl.getSaleOptOut()); Assertions.assertEquals(1, usFl.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usFl.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usFl.getSensitiveDataProcessing()); Assertions.assertEquals(Arrays.asList(2, 1, 2), usFl.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usFl.getAdditionalDataProcessingConsent()); Assertions.assertEquals(1, usFl.getMspaCoveredTransaction()); Assertions.assertEquals(1, usFl.getMspaOptOutOptionMode()); Assertions.assertEquals(2, usFl.getMspaServiceProviderMode()); } - + @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new UsFl("z").getMspaCoveredTransaction(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new UsFl("z").getMspaCoveredTransaction(); + }); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsIaTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsIaTest.java index 4171eac1..6bd6b053 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsIaTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsIaTest.java @@ -1,12 +1,11 @@ package com.iab.gpp.encoder.section; - -import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.ValidationException; import com.iab.gpp.encoder.field.UsIaField; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class UsIaTest { @@ -35,7 +34,7 @@ public void testEncode2() { Assertions.assertEquals("BVVkklWA.YA", usIa.encode()); } - + @Test public void testSetInvalidValues() { UsIa usIa = new UsIa(); @@ -44,77 +43,78 @@ public void testSetInvalidValues() { usIa.setFieldValue(UsIaField.PROCESSING_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usIa.setFieldValue(UsIaField.SENSITIVE_DATA_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { - usIa.setFieldValue(UsIaField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); + usIa.setFieldValue( + UsIaField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usIa.setFieldValue(UsIaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usIa.setFieldValue(UsIaField.MSPA_COVERED_TRANSACTION, 0); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 4); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } } @@ -135,7 +135,8 @@ public void testDecode1() throws DecodingException { Assertions.assertEquals(1, usIa.getSensitiveDataOptOutNotice()); Assertions.assertEquals(1, usIa.getSaleOptOut()); Assertions.assertEquals(1, usIa.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usIa.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usIa.getSensitiveDataProcessing()); Assertions.assertEquals(1, usIa.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usIa.getMspaCoveredTransaction()); Assertions.assertEquals(1, usIa.getMspaOptOutOptionMode()); @@ -153,18 +154,21 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(1, usIa.getSensitiveDataOptOutNotice()); Assertions.assertEquals(1, usIa.getSaleOptOut()); Assertions.assertEquals(1, usIa.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usIa.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usIa.getSensitiveDataProcessing()); Assertions.assertEquals(1, usIa.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usIa.getMspaCoveredTransaction()); Assertions.assertEquals(1, usIa.getMspaOptOutOptionMode()); Assertions.assertEquals(2, usIa.getMspaServiceProviderMode()); Assertions.assertEquals(false, usIa.getGpcSegmentIncluded()); } - + @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new UsIa("z").getProcessingNotice(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new UsIa("z").getProcessingNotice(); + }); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsMnTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsMnTest.java new file mode 100644 index 00000000..02506a39 --- /dev/null +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsMnTest.java @@ -0,0 +1,174 @@ +package com.iab.gpp.encoder.section; + +import com.iab.gpp.encoder.error.DecodingException; +import com.iab.gpp.encoder.error.ValidationException; +import com.iab.gpp.encoder.field.UsMnField; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class UsMnTest { + + @Test + public void testEncode1() { + UsMn usMn = new UsMn(); + Assertions.assertEquals("BAAAAAQA.QA", usMn.encode()); + } + + @Test + public void testEncode2() { + UsMn usMn = new UsMn(); + + usMn.setFieldValue(UsMnField.PROCESSING_NOTICE, 1); + usMn.setFieldValue(UsMnField.SALE_OPT_OUT_NOTICE, 1); + usMn.setFieldValue(UsMnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usMn.setFieldValue(UsMnField.SALE_OPT_OUT, 1); + usMn.setFieldValue(UsMnField.TARGETED_ADVERTISING_OPT_OUT, 1); + usMn.setFieldValue(UsMnField.SENSITIVE_DATA_PROCESSING, Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1)); + usMn.setFieldValue(UsMnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, 1); + usMn.setFieldValue(UsMnField.ADDITIONAL_DATA_PROCESSING_CONSENT, 1); + usMn.setFieldValue(UsMnField.MSPA_COVERED_TRANSACTION, 1); + usMn.setFieldValue(UsMnField.MSPA_OPT_OUT_OPTION_MODE, 1); + usMn.setFieldValue(UsMnField.MSPA_SERVICE_PROVIDER_MODE, 2); + usMn.setFieldValue(UsMnField.GPC, true); + + Assertions.assertEquals("BVWSSVWA.YA", usMn.encode()); + } + + @Test + public void testSetInvalidValues() { + UsMn usMn = new UsMn(); + + try { + usMn.setFieldValue(UsMnField.PROCESSING_NOTICE, 3); + Assertions.fail("Expected ValidationException"); + } catch (ValidationException e) { + + } + + try { + usMn.setFieldValue(UsMnField.SALE_OPT_OUT_NOTICE, 3); + Assertions.fail("Expected ValidationException"); + } catch (ValidationException e) { + + } + + try { + usMn.setFieldValue(UsMnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); + Assertions.fail("Expected ValidationException"); + } catch (ValidationException e) { + + } + + try { + usMn.setFieldValue(UsMnField.SALE_OPT_OUT, 3); + Assertions.fail("Expected ValidationException"); + } catch (ValidationException e) { + + } + + try { + usMn.setFieldValue(UsMnField.TARGETED_ADVERTISING_OPT_OUT, -1); + Assertions.fail("Expected ValidationException"); + } catch (ValidationException e) { + + } + + try { + usMn.setFieldValue( + UsMnField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); + Assertions.fail("Expected ValidationException"); + } catch (ValidationException e) { + + } + + try { + usMn.setFieldValue(UsMnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, 3); + Assertions.fail("Expected ValidationException"); + } catch (ValidationException e) { + + } + + try { + usMn.setFieldValue(UsMnField.ADDITIONAL_DATA_PROCESSING_CONSENT, 3); + Assertions.fail("Expected ValidationException"); + } catch (ValidationException e) { + + } + + try { + usMn.setFieldValue(UsMnField.MSPA_COVERED_TRANSACTION, 0); + Assertions.fail("Expected ValidationException"); + } catch (ValidationException e) { + + } + + try { + usMn.setFieldValue(UsMnField.MSPA_OPT_OUT_OPTION_MODE, 4); + Assertions.fail("Expected ValidationException"); + } catch (ValidationException e) { + + } + + try { + usMn.setFieldValue(UsMnField.MSPA_SERVICE_PROVIDER_MODE, -1); + Assertions.fail("Expected ValidationException"); + } catch (ValidationException e) { + + } + } + + @Test + public void testEncodeWithGpcSegmentExcluded() { + UsMn usMn = new UsMn(); + usMn.setFieldValue(UsMnField.GPC_SEGMENT_INCLUDED, false); + Assertions.assertEquals("BAAAAAQA", usMn.encode()); + } + + @Test + public void testDecode1() throws DecodingException { + UsMn usMn = new UsMn("BVWSSVWA.YA"); + + Assertions.assertEquals(1, usMn.getProcessingNotice()); + Assertions.assertEquals(1, usMn.getSaleOptOutNotice()); + Assertions.assertEquals(1, usMn.getTargetedAdvertisingOptOutNotice()); + Assertions.assertEquals(1, usMn.getSaleOptOut()); + Assertions.assertEquals(1, usMn.getTargetedAdvertisingOptOut()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usMn.getSensitiveDataProcessing()); + Assertions.assertEquals(1, usMn.getKnownChildSensitiveDataConsents()); + Assertions.assertEquals(1, usMn.getAdditionalDataProcessingConsent()); + Assertions.assertEquals(1, usMn.getMspaCoveredTransaction()); + Assertions.assertEquals(1, usMn.getMspaOptOutOptionMode()); + Assertions.assertEquals(2, usMn.getMspaServiceProviderMode()); + Assertions.assertEquals(true, usMn.getGpc()); + } + + @Test + public void testDecodeWithGpcSegmentExcluded() throws DecodingException { + UsMn usMn = new UsMn("BVWSSVWA"); + + Assertions.assertEquals(1, usMn.getProcessingNotice()); + Assertions.assertEquals(1, usMn.getSaleOptOutNotice()); + Assertions.assertEquals(1, usMn.getTargetedAdvertisingOptOutNotice()); + Assertions.assertEquals(1, usMn.getSaleOptOut()); + Assertions.assertEquals(1, usMn.getTargetedAdvertisingOptOut()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usMn.getSensitiveDataProcessing()); + Assertions.assertEquals(1, usMn.getKnownChildSensitiveDataConsents()); + Assertions.assertEquals(1, usMn.getAdditionalDataProcessingConsent()); + Assertions.assertEquals(1, usMn.getMspaCoveredTransaction()); + Assertions.assertEquals(1, usMn.getMspaOptOutOptionMode()); + Assertions.assertEquals(2, usMn.getMspaServiceProviderMode()); + Assertions.assertEquals(false, usMn.getGpcSegmentIncluded()); + } + + @Test() + public void testDecodeGarbage() { + Assertions.assertThrows( + DecodingException.class, + () -> { + new UsMn("z").getProcessingNotice(); + }); + } +} diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsMtTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsMtTest.java index aaceb049..8e951bd1 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsMtTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsMtTest.java @@ -1,12 +1,11 @@ package com.iab.gpp.encoder.section; - -import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.ValidationException; import com.iab.gpp.encoder.field.UsMtField; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class UsMtTest { @@ -35,7 +34,7 @@ public void testEncode2() { Assertions.assertEquals("BVWSSZFY.YA", usMt.encode()); } - + @Test public void testSetInvalidValues() { UsMt usMt = new UsMt(); @@ -44,77 +43,78 @@ public void testSetInvalidValues() { usMt.setFieldValue(UsMtField.SHARING_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usMt.setFieldValue(UsMtField.SALE_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usMt.setFieldValue(UsMtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usMt.setFieldValue(UsMtField.SALE_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usMt.setFieldValue(UsMtField.TARGETED_ADVERTISING_OPT_OUT, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { - usMt.setFieldValue(UsMtField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); + usMt.setFieldValue( + UsMtField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usMt.setFieldValue(UsMtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, Arrays.asList(1, 2, 3)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usMt.setFieldValue(UsMtField.ADDITIONAL_DATA_PROCESSING_CONSENT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usMt.setFieldValue(UsMtField.MSPA_COVERED_TRANSACTION, 0); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usMt.setFieldValue(UsMtField.MSPA_OPT_OUT_OPTION_MODE, 4); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usMt.setFieldValue(UsMtField.MSPA_SERVICE_PROVIDER_MODE, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } } @@ -134,7 +134,8 @@ public void testDecode1() throws DecodingException { Assertions.assertEquals(1, usMt.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usMt.getSaleOptOut()); Assertions.assertEquals(1, usMt.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usMt.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usMt.getSensitiveDataProcessing()); Assertions.assertEquals(Arrays.asList(2, 1, 0), usMt.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usMt.getAdditionalDataProcessingConsent()); Assertions.assertEquals(1, usMt.getMspaCoveredTransaction()); @@ -152,7 +153,8 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(1, usMt.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usMt.getSaleOptOut()); Assertions.assertEquals(1, usMt.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usMt.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usMt.getSensitiveDataProcessing()); Assertions.assertEquals(Arrays.asList(2, 1, 0), usMt.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usMt.getAdditionalDataProcessingConsent()); Assertions.assertEquals(1, usMt.getMspaCoveredTransaction()); @@ -160,11 +162,13 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(2, usMt.getMspaServiceProviderMode()); Assertions.assertEquals(false, usMt.getGpcSegmentIncluded()); } - + @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new UsMt("z").getSharingNotice(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new UsMt("z").getSharingNotice(); + }); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsNatTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsNatTest.java index 67029545..d5357886 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsNatTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsNatTest.java @@ -1,12 +1,11 @@ package com.iab.gpp.encoder.section; - -import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.ValidationException; import com.iab.gpp.encoder.field.UsNatField; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class UsNatTest { @@ -14,7 +13,7 @@ public class UsNatTest { public void testEncode1() { UsNat usNat = new UsNat(); - Assertions.assertEquals("BAAAAAAAAABA.QA", usNat.encode()); + Assertions.assertEquals("CAAAAAAAAABA.QA", usNat.encode()); } @Test @@ -30,7 +29,9 @@ public void testEncode2() { usNat.setFieldValue(UsNatField.SALE_OPT_OUT, 1); usNat.setFieldValue(UsNatField.SHARING_OPT_OUT, 1); usNat.setFieldValue(UsNatField.TARGETED_ADVERTISING_OPT_OUT, 1); - usNat.setFieldValue(UsNatField.SENSITIVE_DATA_PROCESSING, Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2)); + usNat.setFieldValue( + UsNatField.SENSITIVE_DATA_PROCESSING, + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2)); usNat.setFieldValue(UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, Arrays.asList(2, 1, 0)); usNat.setFieldValue(UsNatField.PERSONAL_DATA_CONSENTS, 1); usNat.setFieldValue(UsNatField.MSPA_COVERED_TRANSACTION, 1); @@ -38,9 +39,9 @@ public void testEncode2() { usNat.setFieldValue(UsNatField.MSPA_SERVICE_PROVIDER_MODE, 2); usNat.setFieldValue(UsNatField.GPC, true); - Assertions.assertEquals("BVVVkkkkkpFY.YA", usNat.encode()); + Assertions.assertEquals("CVVVkkkkkpFY.YA", usNat.encode()); } - + @Test public void testSetInvalidValues() { UsNat usNat = new UsNat(); @@ -49,108 +50,107 @@ public void testSetInvalidValues() { usNat.setFieldValue(UsNatField.SHARING_NOTICE, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNat.setFieldValue(UsNatField.SALE_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNat.setFieldValue(UsNatField.SHARING_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNat.setFieldValue(UsNatField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 4); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNat.setFieldValue(UsNatField.SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNat.setFieldValue(UsNatField.SENSITIVE_DATA_LIMIT_USE_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNat.setFieldValue(UsNatField.SALE_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNat.setFieldValue(UsNatField.SHARING_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNat.setFieldValue(UsNatField.TARGETED_ADVERTISING_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { - usNat.setFieldValue(UsNatField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 0, 1, 2, 0, 0, 1, 2, 0)); + usNat.setFieldValue( + UsNatField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 0, 1, 2, 0, 0, 1, 2, 0)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNat.setFieldValue(UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, Arrays.asList(0, 3)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNat.setFieldValue(UsNatField.PERSONAL_DATA_CONSENTS, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNat.setFieldValue(UsNatField.MSPA_COVERED_TRANSACTION, 0); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNat.setFieldValue(UsNatField.MSPA_OPT_OUT_OPTION_MODE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNat.setFieldValue(UsNatField.MSPA_SERVICE_PROVIDER_MODE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - - } @Test @@ -166,7 +166,9 @@ public void testEncode3() { usNat.setFieldValue(UsNatField.SALE_OPT_OUT, 1); usNat.setFieldValue(UsNatField.SHARING_OPT_OUT, 1); usNat.setFieldValue(UsNatField.TARGETED_ADVERTISING_OPT_OUT, 1); - usNat.setFieldValue(UsNatField.SENSITIVE_DATA_PROCESSING, Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2)); + usNat.setFieldValue( + UsNatField.SENSITIVE_DATA_PROCESSING, + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2)); usNat.setFieldValue(UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, Arrays.asList(2, 1, 0)); usNat.setFieldValue(UsNatField.PERSONAL_DATA_CONSENTS, 1); usNat.setFieldValue(UsNatField.MSPA_COVERED_TRANSACTION, 1); @@ -174,7 +176,7 @@ public void testEncode3() { usNat.setFieldValue(UsNatField.MSPA_SERVICE_PROVIDER_MODE, 2); usNat.setFieldValue(UsNatField.GPC, true); - Assertions.assertEquals("BVVVkkkkkpFY.YA", usNat.encode()); + Assertions.assertEquals("CVVVkkkkkpFY.YA", usNat.encode()); } @Test @@ -182,12 +184,12 @@ public void testEncodeWithGpcSegmentIncluded() { UsNat usNat = new UsNat(); usNat.setFieldValue(UsNatField.GPC_SEGMENT_INCLUDED, false); - Assertions.assertEquals("BAAAAAAAAABA", usNat.encode()); + Assertions.assertEquals("CAAAAAAAAABA", usNat.encode()); } @Test public void testDecode1() throws DecodingException { - UsNat usNat = new UsNat("BVVVkkkkkpFY.YA"); + UsNat usNat = new UsNat("CVVVkkkkkpFY.YA"); Assertions.assertEquals(1, usNat.getSharingNotice()); Assertions.assertEquals(1, usNat.getSaleOptOutNotice()); @@ -198,7 +200,9 @@ public void testDecode1() throws DecodingException { Assertions.assertEquals(1, usNat.getSaleOptOut()); Assertions.assertEquals(1, usNat.getSharingOptOut()); Assertions.assertEquals(1, usNat.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2), usNat.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2), + usNat.getSensitiveDataProcessing()); Assertions.assertEquals(Arrays.asList(2, 1, 0), usNat.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usNat.getPersonalDataConsents()); Assertions.assertEquals(1, usNat.getMspaCoveredTransaction()); @@ -220,7 +224,9 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(1, usNat.getSaleOptOut()); Assertions.assertEquals(1, usNat.getSharingOptOut()); Assertions.assertEquals(1, usNat.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2), usNat.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2), + usNat.getSensitiveDataProcessing()); Assertions.assertEquals(Arrays.asList(2, 1, 0), usNat.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usNat.getPersonalDataConsents()); Assertions.assertEquals(1, usNat.getMspaCoveredTransaction()); @@ -228,11 +234,36 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(2, usNat.getMspaServiceProviderMode()); Assertions.assertEquals(false, usNat.getGpcSegmentIncluded()); } - + + @Test + public void testDecodeBackwardsCompatibility() throws DecodingException { + UsNat usNat = new UsNat("BVQqAAAACg"); + + Assertions.assertEquals(1, usNat.getSharingNotice()); + Assertions.assertEquals(1, usNat.getSaleOptOutNotice()); + Assertions.assertEquals(1, usNat.getSharingOptOutNotice()); + Assertions.assertEquals(1, usNat.getTargetedAdvertisingOptOutNotice()); + Assertions.assertEquals(0, usNat.getSensitiveDataProcessingOptOutNotice()); + Assertions.assertEquals(0, usNat.getSensitiveDataLimitUseNotice()); + Assertions.assertEquals(2, usNat.getSaleOptOut()); + Assertions.assertEquals(2, usNat.getSharingOptOut()); + Assertions.assertEquals(2, usNat.getTargetedAdvertisingOptOut()); + Assertions.assertEquals( + Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), usNat.getSensitiveDataProcessing()); + Assertions.assertEquals(Arrays.asList(0, 0), usNat.getKnownChildSensitiveDataConsents()); + Assertions.assertEquals(2, usNat.getPersonalDataConsents()); + Assertions.assertEquals(2, usNat.getMspaCoveredTransaction()); + Assertions.assertEquals(0, usNat.getMspaOptOutOptionMode()); + Assertions.assertEquals(0, usNat.getMspaServiceProviderMode()); + Assertions.assertEquals(false, usNat.getGpc()); + } + @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new UsNat("z").getSharingNotice(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new UsNat("z").getSharingNotice(); + }); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsNeTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsNeTest.java index e9e25743..10b6e816 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsNeTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsNeTest.java @@ -1,12 +1,11 @@ package com.iab.gpp.encoder.section; - -import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.ValidationException; import com.iab.gpp.encoder.field.UsNeField; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class UsNeTest { @@ -35,7 +34,7 @@ public void testEncode2() { Assertions.assertEquals("BVWSSVWA.YA", usNe.encode()); } - + @Test public void testSetInvalidValues() { UsNe usNe = new UsNe(); @@ -44,77 +43,78 @@ public void testSetInvalidValues() { usNe.setFieldValue(UsNeField.PROCESSING_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { - usNe.setFieldValue(UsNeField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); + usNe.setFieldValue( + UsNeField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNe.setFieldValue(UsNeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNe.setFieldValue(UsNeField.ADDITIONAL_DATA_PROCESSING_CONSENT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNe.setFieldValue(UsNeField.MSPA_COVERED_TRANSACTION, 0); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 4); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } } @@ -134,7 +134,8 @@ public void testDecode1() throws DecodingException { Assertions.assertEquals(1, usNe.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usNe.getSaleOptOut()); Assertions.assertEquals(1, usNe.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usNe.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usNe.getSensitiveDataProcessing()); Assertions.assertEquals(1, usNe.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usNe.getAdditionalDataProcessingConsent()); Assertions.assertEquals(1, usNe.getMspaCoveredTransaction()); @@ -152,7 +153,8 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(1, usNe.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usNe.getSaleOptOut()); Assertions.assertEquals(1, usNe.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usNe.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usNe.getSensitiveDataProcessing()); Assertions.assertEquals(1, usNe.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usNe.getAdditionalDataProcessingConsent()); Assertions.assertEquals(1, usNe.getMspaCoveredTransaction()); @@ -160,11 +162,13 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(2, usNe.getMspaServiceProviderMode()); Assertions.assertEquals(false, usNe.getGpcSegmentIncluded()); } - + @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new UsNe("z").getProcessingNotice(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new UsNe("z").getProcessingNotice(); + }); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsNhTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsNhTest.java index 3211f9fc..805166c3 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsNhTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsNhTest.java @@ -1,12 +1,11 @@ package com.iab.gpp.encoder.section; - -import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.ValidationException; import com.iab.gpp.encoder.field.UsNhField; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class UsNhTest { @@ -35,7 +34,7 @@ public void testEncode2() { Assertions.assertEquals("BVWSSZFY.YA", usNh.encode()); } - + @Test public void testSetInvalidValues() { UsNh usNh = new UsNh(); @@ -44,77 +43,78 @@ public void testSetInvalidValues() { usNh.setFieldValue(UsNhField.PROCESSING_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { - usNh.setFieldValue(UsNhField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); + usNh.setFieldValue( + UsNhField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNh.setFieldValue(UsNhField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, Arrays.asList(1, 2, 3)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNh.setFieldValue(UsNhField.ADDITIONAL_DATA_PROCESSING_CONSENT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNh.setFieldValue(UsNhField.MSPA_COVERED_TRANSACTION, 0); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 4); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } } @@ -134,7 +134,8 @@ public void testDecode1() throws DecodingException { Assertions.assertEquals(1, usNh.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usNh.getSaleOptOut()); Assertions.assertEquals(1, usNh.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usNh.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usNh.getSensitiveDataProcessing()); Assertions.assertEquals(Arrays.asList(2, 1, 0), usNh.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usNh.getAdditionalDataProcessingConsent()); Assertions.assertEquals(1, usNh.getMspaCoveredTransaction()); @@ -152,7 +153,8 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(1, usNh.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usNh.getSaleOptOut()); Assertions.assertEquals(1, usNh.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usNh.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usNh.getSensitiveDataProcessing()); Assertions.assertEquals(Arrays.asList(2, 1, 0), usNh.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usNh.getAdditionalDataProcessingConsent()); Assertions.assertEquals(1, usNh.getMspaCoveredTransaction()); @@ -160,11 +162,13 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(2, usNh.getMspaServiceProviderMode()); Assertions.assertEquals(false, usNh.getGpcSegmentIncluded()); } - + @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new UsNh("z").getProcessingNotice(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new UsNh("z").getProcessingNotice(); + }); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsNjTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsNjTest.java index afda60bb..b32b0cee 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsNjTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsNjTest.java @@ -1,12 +1,11 @@ package com.iab.gpp.encoder.section; - -import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.ValidationException; import com.iab.gpp.encoder.field.UsNjField; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class UsNjTest { @@ -25,7 +24,8 @@ public void testEncode2() { usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 1); usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 1); - usNj.setFieldValue(UsNjField.SENSITIVE_DATA_PROCESSING, Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 1)); + usNj.setFieldValue( + UsNjField.SENSITIVE_DATA_PROCESSING, Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 1)); usNj.setFieldValue(UsNjField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, Arrays.asList(2, 1, 0, 2, 1)); usNj.setFieldValue(UsNjField.ADDITIONAL_DATA_PROCESSING_CONSENT, 1); usNj.setFieldValue(UsNjField.MSPA_COVERED_TRANSACTION, 1); @@ -35,7 +35,7 @@ public void testEncode2() { Assertions.assertEquals("BVWSSRklWA.YA", usNj.encode()); } - + @Test public void testSetInvalidValues() { UsNj usNj = new UsNj(); @@ -44,77 +44,78 @@ public void testSetInvalidValues() { usNj.setFieldValue(UsNjField.PROCESSING_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { - usNj.setFieldValue(UsNjField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); + usNj.setFieldValue( + UsNjField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNj.setFieldValue(UsNjField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, Arrays.asList(1, 2, 3)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNj.setFieldValue(UsNjField.ADDITIONAL_DATA_PROCESSING_CONSENT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNj.setFieldValue(UsNjField.MSPA_COVERED_TRANSACTION, 0); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 4); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } } @@ -134,8 +135,10 @@ public void testDecode1() throws DecodingException { Assertions.assertEquals(1, usNj.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usNj.getSaleOptOut()); Assertions.assertEquals(1, usNj.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 1), usNj.getSensitiveDataProcessing()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1), usNj.getKnownChildSensitiveDataConsents()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 1), usNj.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1), usNj.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usNj.getAdditionalDataProcessingConsent()); Assertions.assertEquals(1, usNj.getMspaCoveredTransaction()); Assertions.assertEquals(1, usNj.getMspaOptOutOptionMode()); @@ -152,19 +155,23 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(1, usNj.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usNj.getSaleOptOut()); Assertions.assertEquals(1, usNj.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 1), usNj.getSensitiveDataProcessing()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1), usNj.getKnownChildSensitiveDataConsents()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 1), usNj.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1), usNj.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usNj.getAdditionalDataProcessingConsent()); Assertions.assertEquals(1, usNj.getMspaCoveredTransaction()); Assertions.assertEquals(1, usNj.getMspaOptOutOptionMode()); Assertions.assertEquals(2, usNj.getMspaServiceProviderMode()); Assertions.assertEquals(false, usNj.getGpcSegmentIncluded()); } - + @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new UsNj("z").getProcessingNotice(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new UsNj("z").getProcessingNotice(); + }); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsOrTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsOrTest.java index 34c310b5..3a78e62c 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsOrTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsOrTest.java @@ -1,12 +1,11 @@ package com.iab.gpp.encoder.section; - -import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.ValidationException; import com.iab.gpp.encoder.field.UsOrField; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class UsOrTest { @@ -25,7 +24,8 @@ public void testEncode2() { usOr.setFieldValue(UsOrField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); usOr.setFieldValue(UsOrField.SALE_OPT_OUT, 1); usOr.setFieldValue(UsOrField.TARGETED_ADVERTISING_OPT_OUT, 1); - usOr.setFieldValue(UsOrField.SENSITIVE_DATA_PROCESSING, Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 1, 2)); + usOr.setFieldValue( + UsOrField.SENSITIVE_DATA_PROCESSING, Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 1, 2)); usOr.setFieldValue(UsOrField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, Arrays.asList(2, 1, 0)); usOr.setFieldValue(UsOrField.ADDITIONAL_DATA_PROCESSING_CONSENT, 1); usOr.setFieldValue(UsOrField.MSPA_COVERED_TRANSACTION, 1); @@ -35,7 +35,7 @@ public void testEncode2() { Assertions.assertEquals("BVWSSRpFYA.YA", usOr.encode()); } - + @Test public void testSetInvalidValues() { UsOr usOr = new UsOr(); @@ -44,77 +44,78 @@ public void testSetInvalidValues() { usOr.setFieldValue(UsOrField.PROCESSING_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usOr.setFieldValue(UsOrField.SALE_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usOr.setFieldValue(UsOrField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usOr.setFieldValue(UsOrField.SALE_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usOr.setFieldValue(UsOrField.TARGETED_ADVERTISING_OPT_OUT, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { - usOr.setFieldValue(UsOrField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); + usOr.setFieldValue( + UsOrField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usOr.setFieldValue(UsOrField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, Arrays.asList(1, 2, 3)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usOr.setFieldValue(UsOrField.ADDITIONAL_DATA_PROCESSING_CONSENT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usOr.setFieldValue(UsOrField.MSPA_COVERED_TRANSACTION, 0); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usOr.setFieldValue(UsOrField.MSPA_OPT_OUT_OPTION_MODE, 4); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usOr.setFieldValue(UsOrField.MSPA_SERVICE_PROVIDER_MODE, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } } @@ -134,7 +135,8 @@ public void testDecode1() throws DecodingException { Assertions.assertEquals(1, usOr.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usOr.getSaleOptOut()); Assertions.assertEquals(1, usOr.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 1, 2), usOr.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 1, 2), usOr.getSensitiveDataProcessing()); Assertions.assertEquals(Arrays.asList(2, 1, 0), usOr.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usOr.getAdditionalDataProcessingConsent()); Assertions.assertEquals(1, usOr.getMspaCoveredTransaction()); @@ -152,7 +154,8 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(1, usOr.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usOr.getSaleOptOut()); Assertions.assertEquals(1, usOr.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 1, 2), usOr.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1, 0, 1, 2), usOr.getSensitiveDataProcessing()); Assertions.assertEquals(Arrays.asList(2, 1, 0), usOr.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usOr.getAdditionalDataProcessingConsent()); Assertions.assertEquals(1, usOr.getMspaCoveredTransaction()); @@ -160,11 +163,13 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(2, usOr.getMspaServiceProviderMode()); Assertions.assertEquals(false, usOr.getGpcSegmentIncluded()); } - + @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new UsOr("z").getProcessingNotice(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new UsOr("z").getProcessingNotice(); + }); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsTnTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsTnTest.java index 8d0cae7d..79aa5ff1 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsTnTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsTnTest.java @@ -1,12 +1,11 @@ package com.iab.gpp.encoder.section; - -import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.ValidationException; import com.iab.gpp.encoder.field.UsTnField; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class UsTnTest { @@ -35,7 +34,7 @@ public void testEncode2() { Assertions.assertEquals("BVWSSVWA.YA", usTn.encode()); } - + @Test public void testSetInvalidValues() { UsTn usTn = new UsTn(); @@ -44,77 +43,78 @@ public void testSetInvalidValues() { usTn.setFieldValue(UsTnField.PROCESSING_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { - usTn.setFieldValue(UsTnField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); + usTn.setFieldValue( + UsTnField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTn.setFieldValue(UsTnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTn.setFieldValue(UsTnField.ADDITIONAL_DATA_PROCESSING_CONSENT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTn.setFieldValue(UsTnField.MSPA_COVERED_TRANSACTION, 0); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 4); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } } @@ -134,7 +134,8 @@ public void testDecode1() throws DecodingException { Assertions.assertEquals(1, usTn.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usTn.getSaleOptOut()); Assertions.assertEquals(1, usTn.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usTn.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usTn.getSensitiveDataProcessing()); Assertions.assertEquals(1, usTn.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usTn.getAdditionalDataProcessingConsent()); Assertions.assertEquals(1, usTn.getMspaCoveredTransaction()); @@ -152,7 +153,8 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(1, usTn.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usTn.getSaleOptOut()); Assertions.assertEquals(1, usTn.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usTn.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usTn.getSensitiveDataProcessing()); Assertions.assertEquals(1, usTn.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usTn.getAdditionalDataProcessingConsent()); Assertions.assertEquals(1, usTn.getMspaCoveredTransaction()); @@ -160,11 +162,13 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(2, usTn.getMspaServiceProviderMode()); Assertions.assertEquals(false, usTn.getGpcSegmentIncluded()); } - + @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new UsTn("z").getProcessingNotice(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new UsTn("z").getProcessingNotice(); + }); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsTxTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsTxTest.java index 4609feed..28a4ef45 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsTxTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsTxTest.java @@ -1,12 +1,11 @@ package com.iab.gpp.encoder.section; - -import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.ValidationException; import com.iab.gpp.encoder.field.UsTxField; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class UsTxTest { @@ -35,7 +34,7 @@ public void testEncode2() { Assertions.assertEquals("BVWSSVWA.YA", usTx.encode()); } - + @Test public void testSetInvalidValues() { UsTx usTx = new UsTx(); @@ -44,77 +43,78 @@ public void testSetInvalidValues() { usTx.setFieldValue(UsTxField.PROCESSING_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTx.setFieldValue(UsTxField.SALE_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTx.setFieldValue(UsTxField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTx.setFieldValue(UsTxField.SALE_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTx.setFieldValue(UsTxField.TARGETED_ADVERTISING_OPT_OUT, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { - usTx.setFieldValue(UsTxField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); + usTx.setFieldValue( + UsTxField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTx.setFieldValue(UsTxField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTx.setFieldValue(UsTxField.ADDITIONAL_DATA_PROCESSING_CONSENT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTx.setFieldValue(UsTxField.MSPA_COVERED_TRANSACTION, 0); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTx.setFieldValue(UsTxField.MSPA_OPT_OUT_OPTION_MODE, 4); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usTx.setFieldValue(UsTxField.MSPA_SERVICE_PROVIDER_MODE, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } } @@ -134,7 +134,8 @@ public void testDecode1() throws DecodingException { Assertions.assertEquals(1, usTx.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usTx.getSaleOptOut()); Assertions.assertEquals(1, usTx.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usTx.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usTx.getSensitiveDataProcessing()); Assertions.assertEquals(1, usTx.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usTx.getAdditionalDataProcessingConsent()); Assertions.assertEquals(1, usTx.getMspaCoveredTransaction()); @@ -152,7 +153,8 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(1, usTx.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usTx.getSaleOptOut()); Assertions.assertEquals(1, usTx.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usTx.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usTx.getSensitiveDataProcessing()); Assertions.assertEquals(1, usTx.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usTx.getAdditionalDataProcessingConsent()); Assertions.assertEquals(1, usTx.getMspaCoveredTransaction()); @@ -160,11 +162,13 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(2, usTx.getMspaServiceProviderMode()); Assertions.assertEquals(false, usTx.getGpcSegmentIncluded()); } - + @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new UsTx("z").getProcessingNotice(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new UsTx("z").getProcessingNotice(); + }); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsUtTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsUtTest.java index f95b88f0..3ad6dc06 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsUtTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsUtTest.java @@ -1,12 +1,11 @@ package com.iab.gpp.encoder.section; - -import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.ValidationException; import com.iab.gpp.encoder.field.UsUtField; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class UsUtTest { @@ -34,7 +33,7 @@ public void testEncode2() { Assertions.assertEquals("BVVkklWA", usUt.encode()); } - + @Test public void testSetInvalidValues() { UsUt usUt = new UsUt(); @@ -43,79 +42,79 @@ public void testSetInvalidValues() { usUt.setFieldValue(UsUtField.SHARING_NOTICE, -1); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usUt.setFieldValue(UsUtField.SALE_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usUt.setFieldValue(UsUtField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usUt.setFieldValue(UsUtField.SALE_OPT_OUT, 4); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usUt.setFieldValue(UsUtField.SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usUt.setFieldValue(UsUtField.TARGETED_ADVERTISING_OPT_OUT, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { - usUt.setFieldValue(UsUtField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 0, 1, 2, 0)); + usUt.setFieldValue( + UsUtField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 0, 1, 2, 0)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usUt.setFieldValue(UsUtField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usUt.setFieldValue(UsUtField.MSPA_COVERED_TRANSACTION, 0); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usUt.setFieldValue(UsUtField.MSPA_OPT_OUT_OPTION_MODE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - + try { usUt.setFieldValue(UsUtField.MSPA_SERVICE_PROVIDER_MODE, 3); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { - + } - } @Test @@ -127,17 +126,20 @@ public void testDecode1() throws DecodingException { Assertions.assertEquals(1, usUt.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usUt.getSaleOptOut()); Assertions.assertEquals(1, usUt.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usUt.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usUt.getSensitiveDataProcessing()); Assertions.assertEquals(1, usUt.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usUt.getMspaCoveredTransaction()); Assertions.assertEquals(1, usUt.getMspaOptOutOptionMode()); Assertions.assertEquals(2, usUt.getMspaServiceProviderMode()); } - + @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new UsUt("z").getKnownChildSensitiveDataConsents(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new UsUt("z").getKnownChildSensitiveDataConsents(); + }); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsVaTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsVaTest.java index 346e0ca6..06025a47 100644 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsVaTest.java +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsVaTest.java @@ -1,14 +1,13 @@ package com.iab.gpp.encoder.section; - -import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; 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.error.ValidationException; import com.iab.gpp.encoder.field.UsVaField; +import java.util.Arrays; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class UsVaTest { @@ -28,7 +27,8 @@ public void testEncode2() { usVa.setFieldValue(UsVaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); usVa.setFieldValue(UsVaField.SALE_OPT_OUT, 1); usVa.setFieldValue(UsVaField.TARGETED_ADVERTISING_OPT_OUT, 1); - usVa.setFieldValue(UsVaField.SENSITIVE_DATA_PROCESSING, Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1)); + usVa.setFieldValue( + UsVaField.SENSITIVE_DATA_PROCESSING, Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1)); usVa.setFieldValue(UsVaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, 1); usVa.setFieldValue(UsVaField.MSPA_COVERED_TRANSACTION, 1); usVa.setFieldValue(UsVaField.MSPA_OPT_OUT_OPTION_MODE, 1); @@ -80,7 +80,8 @@ public void testSetInvalidValues() { } try { - usVa.setFieldValue(UsVaField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); + usVa.setFieldValue( + UsVaField.SENSITIVE_DATA_PROCESSING, Arrays.asList(0, 1, 2, 3, 1, 2, 0, 1)); Assertions.fail("Expected ValidationException"); } catch (ValidationException e) { @@ -113,7 +114,6 @@ public void testSetInvalidValues() { } catch (ValidationException e) { } - } @Test @@ -125,7 +125,8 @@ public void testDecode1() throws DecodingException { Assertions.assertEquals(1, usVa.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usVa.getSaleOptOut()); Assertions.assertEquals(1, usVa.getTargetedAdvertisingOptOut()); - Assertions.assertEquals(Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usVa.getSensitiveDataProcessing()); + Assertions.assertEquals( + Arrays.asList(2, 1, 0, 2, 1, 0, 2, 1), usVa.getSensitiveDataProcessing()); Assertions.assertEquals(1, usVa.getKnownChildSensitiveDataConsents()); Assertions.assertEquals(1, usVa.getMspaCoveredTransaction()); Assertions.assertEquals(1, usVa.getMspaOptOutOptionMode()); @@ -134,8 +135,10 @@ public void testDecode1() throws DecodingException { @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new UsVa("z").getMspaCoveredTransaction(); - }); + Assertions.assertThrows( + DecodingException.class, + () -> { + new UsVa("z").getMspaCoveredTransaction(); + }); } } 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..9c810f08 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 @@ -1,9 +1,10 @@ package com.iab.gpp.encoder.section; -import org.junit.jupiter.api.Assertions; -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; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; 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,28 @@ 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()); } - } diff --git a/iabgpp-extras-jackson/pom.xml b/iabgpp-extras-jackson/pom.xml index b62612ba..7c92b506 100644 --- a/iabgpp-extras-jackson/pom.xml +++ b/iabgpp-extras-jackson/pom.xml @@ -7,7 +7,7 @@ iabgpp-core com.iabgpp - 4.0.0-RC1 + 4.0.0-SNAPSHOT iabgpp-extras-jackson @@ -24,7 +24,7 @@ com.iabgpp iabgpp-extras - 4.0.0-RC1 + 4.0.0-SNAPSHOT @@ -45,7 +45,22 @@ maven-surefire-plugin - 2.22.2 + + + org.jacoco + jacoco-maven-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.apache.maven.plugins + maven-source-plugin + + + com.diffplug.spotless + spotless-maven-plugin @@ -55,14 +70,6 @@ release - - org.apache.maven.plugins - maven-source-plugin - - - org.apache.maven.plugins - maven-javadoc-plugin - org.apache.maven.plugins maven-gpg-plugin diff --git a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/Loader.java b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/Loader.java index 158ced93..024b07f4 100644 --- a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/Loader.java +++ b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/Loader.java @@ -20,8 +20,6 @@ * #L% */ -import java.io.IOException; -import java.io.InputStream; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleAbstractTypeResolver; @@ -40,6 +38,8 @@ import com.iab.gpp.extras.jackson.gvl.Stack; import com.iab.gpp.extras.jackson.gvl.Vendor; import com.iab.gpp.extras.jackson.gvl.VendorUrl; +import java.io.IOException; +import java.io.InputStream; public class Loader { private ObjectMapper objectMapper = new ObjectMapper(); diff --git a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/cmp/Cmp.java b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/cmp/Cmp.java index eefc3bd3..963795b4 100644 --- a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/cmp/Cmp.java +++ b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/cmp/Cmp.java @@ -21,7 +21,6 @@ */ import com.fasterxml.jackson.annotation.JsonProperty; - import java.time.Instant; import java.util.Optional; @@ -35,7 +34,6 @@ public class Cmp implements com.iab.gpp.extras.cmp.Cmp { private Instant deletedDate; - /** * A CMP id: a numeric ID which is incrementally assigned and never re-used – inactive CMPs are * marked as deleted @@ -84,6 +82,8 @@ public Optional getDeletedDate() { */ @Override public boolean isDeleted() { - return Optional.ofNullable(this.deletedDate).map(deleteDate -> !deleteDate.isAfter(Instant.now())).orElse(false); + return Optional.ofNullable(this.deletedDate) + .map(deleteDate -> !deleteDate.isAfter(Instant.now())) + .orElse(false); } } diff --git a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/DataCategory.java b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/DataCategory.java index 375c5aea..d207ed2b 100644 --- a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/DataCategory.java +++ b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/DataCategory.java @@ -58,6 +58,4 @@ public String getName() { public String getDescription() { return description; } - - } diff --git a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/Gvl.java b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/Gvl.java index 2cbcdcc8..917a4fa2 100644 --- a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/Gvl.java +++ b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/Gvl.java @@ -20,12 +20,6 @@ * #L% */ - -import java.time.Instant; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; import com.iab.gpp.extras.gvl.DataCategory; import com.iab.gpp.extras.gvl.Feature; import com.iab.gpp.extras.gvl.Purpose; @@ -33,6 +27,11 @@ import com.iab.gpp.extras.gvl.SpecialPurpose; import com.iab.gpp.extras.gvl.Stack; import com.iab.gpp.extras.gvl.Vendor; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; public class Gvl implements com.iab.gpp.extras.gvl.Gvl { @@ -69,13 +68,13 @@ public int getVendorListVersion() { } /** - * A TCF Policy Version. The TCF MO will increment this value whenever a GVL change (such as adding - * a new Purpose or Feature or a change in Purpose wording) legally invalidates existing TC Strings - * and requires CMPs to re-establish transparency and consent from users. TCF Policy changes should - * be relatively infrequent and only occur when necessary to support changes in global mandate. If - * the policy version number in the latest GVL is different from the value in your TC String, then - * you need to re-establish transparency and consent for that user. A version 1 format TC String is - * considered to have a version value of 1. + * A TCF Policy Version. The TCF MO will increment this value whenever a GVL change (such as + * adding a new Purpose or Feature or a change in Purpose wording) legally invalidates existing TC + * Strings and requires CMPs to re-establish transparency and consent from users. TCF Policy + * changes should be relatively infrequent and only occur when necessary to support changes in + * global mandate. If the policy version number in the latest GVL is different from the value in + * your TC String, then you need to re-establish transparency and consent for that user. A version + * 1 format TC String is considered to have a version value of 1. * * @return tcf policy version */ diff --git a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/Overflow.java b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/Overflow.java index d837da26..35e5aa4b 100644 --- a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/Overflow.java +++ b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/Overflow.java @@ -20,7 +20,6 @@ * #L% */ - public class Overflow implements com.iab.gpp.extras.gvl.Overflow { private int httpGetLimit; diff --git a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/Purpose.java b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/Purpose.java index 12919c57..5504f6af 100644 --- a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/Purpose.java +++ b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/Purpose.java @@ -23,9 +23,7 @@ * #L% */ -/** - * A standard purpose - */ +/** A standard purpose */ public class Purpose implements com.iab.gpp.extras.gvl.Purpose { private int id; @@ -87,8 +85,8 @@ public Optional> getIllustrations() { } /** - * An optional flag where false means CMPs should never afford users the means to provide an opt-in - * consent choice + * An optional flag where false means CMPs should never afford users the means to provide an + * opt-in consent choice * * @return consentable boolean */ diff --git a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/SpecialFeature.java b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/SpecialFeature.java index f3e88141..0b70ffb6 100644 --- a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/SpecialFeature.java +++ b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/SpecialFeature.java @@ -25,6 +25,4 @@ * signal an opt-in choice as to whether vendors may employ the feature when performing any purpose * processing. See Policies for specifics. */ -public class SpecialFeature extends Feature implements com.iab.gpp.extras.gvl.SpecialFeature { - -} +public class SpecialFeature extends Feature implements com.iab.gpp.extras.gvl.SpecialFeature {} diff --git a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/SpecialPurpose.java b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/SpecialPurpose.java index f42f0617..09c7efba 100644 --- a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/SpecialPurpose.java +++ b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/SpecialPurpose.java @@ -20,9 +20,5 @@ * #L% */ -/** - * A special purpose declared as performed on the legal basis of a legitimate interest - */ -public class SpecialPurpose extends Purpose implements com.iab.gpp.extras.gvl.SpecialPurpose { - -} +/** A special purpose declared as performed on the legal basis of a legitimate interest */ +public class SpecialPurpose extends Purpose implements com.iab.gpp.extras.gvl.SpecialPurpose {} diff --git a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/Vendor.java b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/Vendor.java index de55cfee..30634ec1 100644 --- a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/Vendor.java +++ b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/Vendor.java @@ -20,12 +20,12 @@ * #L% */ -import java.time.Instant; -import java.util.List; -import java.util.Optional; import com.iab.gpp.extras.gvl.DataRetention; import com.iab.gpp.extras.gvl.Overflow; import com.iab.gpp.extras.gvl.VendorUrl; +import java.time.Instant; +import java.util.List; +import java.util.Optional; public class Vendor implements com.iab.gpp.extras.gvl.Vendor { @@ -51,8 +51,8 @@ public class Vendor implements com.iab.gpp.extras.gvl.Vendor { private List dataDeclaration; /** - * A vendor id: a numeric ID which is incrementally assigned and never re-used – deleted Vendors are - * just marked as deleted + * A vendor id: a numeric ID which is incrementally assigned and never re-used – deleted Vendors + * are just marked as deleted * * @return vendor id */ @@ -82,8 +82,8 @@ public List getPurposes() { } /** - * List of Purposes for which the vendor requires to be transparently disclosed as their legitimate - * interest + * List of Purposes for which the vendor requires to be transparently disclosed as their + * legitimate interest * * @return A {@link List} of purpose ids disclosed as legitimate interests */ @@ -104,8 +104,8 @@ public Optional> getImpConsPurposes() { /** * List of purposes where the vendor is flexible regarding the legal basis; they will perform the - * processing based on consent or a legitimate interest. The 'default' is determined by which of the - * other two mutually-exclusive purpose fields is used to declare the purpose for the vendor + * processing based on consent or a legitimate interest. The 'default' is determined by which of + * the other two mutually-exclusive purpose fields is used to declare the purpose for the vendor * * @return A {@link List} of flexible purpose ids */ @@ -167,7 +167,8 @@ public Optional getDeletedDate() { /** * object specifying the vendor's http GET request length limit. It is optional. If a vendor entry - * does not include this attribute then the vendor has no overflow options and none can be inferred. + * does not include this attribute then the vendor has no overflow options and none can be + * inferred. * * @return A {@link com.iab.gpp.extras.gvl.Overflow} object */ @@ -183,14 +184,17 @@ public Optional getOverflow() { */ @Override public boolean isDeleted() { - return Optional.ofNullable(this.deletedDate).map(deletedDate -> !deletedDate.isAfter(Instant.now())).orElse(false); + return Optional.ofNullable(this.deletedDate) + .map(deletedDate -> !deletedDate.isAfter(Instant.now())) + .orElse(false); } /** - * The number of seconds representing the longest potential duration for cookie storage on a device. + * The number of seconds representing the longest potential duration for cookie storage on a + * device. * - * @return The number, in seconds, of the longest potential duration for storage on a device, as set - * when using the cookie method of storage. + * @return The number, in seconds, of the longest potential duration for storage on a device, as + * set when using the cookie method of storage. */ @Override public Optional getCookieMaxAgeSeconds() { @@ -242,7 +246,7 @@ public Optional getDeviceStorageDisclosureUrl() { /** * dataRetention - * + * * @return dataRetention */ public Optional getDataRetention() { @@ -251,7 +255,7 @@ public Optional getDataRetention() { /** * urls - * + * * @return urls */ public Optional> getUrls() { @@ -260,7 +264,7 @@ public Optional> getUrls() { /** * dataDeclarations - * + * * @return dataDeclarations */ public Optional> getDataDeclaration() { diff --git a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/VendorUrl.java b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/VendorUrl.java index cf4d3b86..c42a3266 100644 --- a/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/VendorUrl.java +++ b/iabgpp-extras-jackson/src/main/java/com/iab/gpp/extras/jackson/gvl/VendorUrl.java @@ -60,5 +60,4 @@ public String getPrivacy() { public Optional getLegIntClaim() { return Optional.ofNullable(legIntClaim); } - } diff --git a/iabgpp-extras-jackson/src/test/java/com/iab/gpp/extras/jackson/cmp/CmpListTest.java b/iabgpp-extras-jackson/src/test/java/com/iab/gpp/extras/jackson/cmp/CmpListTest.java index 673ad24f..c23cbb84 100644 --- a/iabgpp-extras-jackson/src/test/java/com/iab/gpp/extras/jackson/cmp/CmpListTest.java +++ b/iabgpp-extras-jackson/src/test/java/com/iab/gpp/extras/jackson/cmp/CmpListTest.java @@ -1,11 +1,13 @@ package com.iab.gpp.extras.jackson.cmp; +import com.iab.gpp.extras.cmp.Cmp; +import com.iab.gpp.extras.cmp.CmpList; +import com.iab.gpp.extras.jackson.Loader; import java.io.IOException; import java.time.Instant; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import com.iab.gpp.extras.cmp.Cmp; /*- * #%L @@ -27,9 +29,6 @@ * #L% */ -import com.iab.gpp.extras.cmp.CmpList; -import com.iab.gpp.extras.jackson.Loader; - public class CmpListTest { private static CmpList cmpList; @@ -38,9 +37,12 @@ public class CmpListTest { @BeforeAll public static void setUpBeforeClass() throws IOException { - cmpList = new Loader().cmpList(CmpListTest.class.getClassLoader().getResourceAsStream("cmpList.json")); + cmpList = + new Loader() + .cmpList(CmpListTest.class.getClassLoader().getResourceAsStream("cmpList.json")); cmpThree = cmpList.getCmps().stream().filter(o -> o.getId() == 3).findFirst().orElse(null); - cmpTwentyThree = cmpList.getCmps().stream().filter(o -> o.getId() == 23).findFirst().orElse(null); + cmpTwentyThree = + cmpList.getCmps().stream().filter(o -> o.getId() == 23).findFirst().orElse(null); } @Test diff --git a/iabgpp-extras-jackson/src/test/java/com/iab/gpp/extras/jackson/gvl/GvlCanadaTest.java b/iabgpp-extras-jackson/src/test/java/com/iab/gpp/extras/jackson/gvl/GvlCanadaTest.java index 8f665014..27b024ca 100644 --- a/iabgpp-extras-jackson/src/test/java/com/iab/gpp/extras/jackson/gvl/GvlCanadaTest.java +++ b/iabgpp-extras-jackson/src/test/java/com/iab/gpp/extras/jackson/gvl/GvlCanadaTest.java @@ -2,103 +2,118 @@ import com.iab.gpp.extras.gvl.Gvl; import com.iab.gpp.extras.jackson.Loader; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - import java.io.IOException; import java.util.Arrays; import java.util.Collections; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class GvlCanadaTest { - @Test - public void test() throws IOException { - Gvl gvl = new Loader() - .globalVendorList(GvlV2Test.class.getClassLoader().getResourceAsStream("vendorlist/v2/ca/vendor-list.json")); - Assertions.assertFalse(gvl.getDataCategories().isPresent()); - Assertions.assertEquals(3, gvl.getFeatures().size()); - Assertions.assertEquals(2, gvl.getGvlSpecificationVersion()); - Assertions.assertNotNull(gvl.getLastUpdated()); - Assertions.assertEquals(10, gvl.getPurposes().size()); - Assertions.assertEquals(2, gvl.getSpecialFeatures().size()); - Assertions.assertEquals(2, gvl.getSpecialPurposes().size()); - Assertions.assertEquals(42, gvl.getStacks().size()); - Assertions.assertEquals(2, gvl.getTcfPolicyVersion()); - Assertions.assertEquals(45, gvl.getVendorListVersion()); - Assertions.assertEquals(36, gvl.getVendors().size()); + @Test + public void test() throws IOException { + Gvl gvl = + new Loader() + .globalVendorList( + GvlV2Test.class + .getClassLoader() + .getResourceAsStream("vendorlist/v2/ca/vendor-list.json")); + Assertions.assertFalse(gvl.getDataCategories().isPresent()); + Assertions.assertEquals(3, gvl.getFeatures().size()); + Assertions.assertEquals(2, gvl.getGvlSpecificationVersion()); + Assertions.assertNotNull(gvl.getLastUpdated()); + Assertions.assertEquals(10, gvl.getPurposes().size()); + Assertions.assertEquals(2, gvl.getSpecialFeatures().size()); + Assertions.assertEquals(2, gvl.getSpecialPurposes().size()); + Assertions.assertEquals(42, gvl.getStacks().size()); + Assertions.assertEquals(2, gvl.getTcfPolicyVersion()); + Assertions.assertEquals(45, gvl.getVendorListVersion()); + Assertions.assertEquals(36, gvl.getVendors().size()); - Assertions.assertEquals(1, gvl.getPurposes().get(0).getId()); - Assertions.assertEquals("Store and/or access information on a device", gvl.getPurposes().get(0).getName()); - Assertions.assertEquals( - "Cookies, device identifiers, or other information can be stored or accessed on your device for the purposes presented to you.", - gvl.getPurposes().get(0).getDescription()); - Assertions.assertTrue(gvl.getPurposes().get(0).getDescriptionLegal().isPresent()); - Assertions.assertEquals( - "Vendors can:\n* Store and access information on the device such as cookies and device identifiers presented to a user.", - gvl.getPurposes().get(0).getDescriptionLegal().get()); - Assertions.assertFalse(gvl.getPurposes().get(0).getIllustrations().isPresent()); + Assertions.assertEquals(1, gvl.getPurposes().get(0).getId()); + Assertions.assertEquals( + "Store and/or access information on a device", gvl.getPurposes().get(0).getName()); + Assertions.assertEquals( + "Cookies, device identifiers, or other information can be stored or accessed on your device for the purposes presented to you.", + gvl.getPurposes().get(0).getDescription()); + Assertions.assertTrue(gvl.getPurposes().get(0).getDescriptionLegal().isPresent()); + Assertions.assertEquals( + "Vendors can:\n* Store and access information on the device such as cookies and device identifiers presented to a user.", + gvl.getPurposes().get(0).getDescriptionLegal().get()); + Assertions.assertFalse(gvl.getPurposes().get(0).getIllustrations().isPresent()); - Assertions.assertEquals(1, gvl.getSpecialPurposes().get(0).getId()); - Assertions.assertEquals("Ensure security, prevent fraud, and debug", gvl.getSpecialPurposes().get(0).getName()); - Assertions.assertEquals( - "Your data can be used to monitor for and prevent fraudulent activity, and ensure systems and processes work properly and securely.", - gvl.getSpecialPurposes().get(0).getDescription()); - Assertions.assertTrue(gvl.getSpecialPurposes().get(0).getDescriptionLegal().isPresent()); - Assertions.assertEquals( - "To ensure security, prevent fraud and debug vendors can:\n* Ensure data are securely transmitted\n* Detect and prevent malicious, fraudulent, invalid, or illegal activity.\n* Ensure correct and efficient operation of systems and processes, including to monitor and enhance the performance of systems and processes engaged in permitted purposes\nVendors cannot:\n* Conduct any other data processing operation allowed under a different purpose under this purpose.\nNote: Data collected and used to ensure security, prevent fraud, and debug may include automatically-sent device characteristics for identification, precise geolocation data, and data obtained by actively scanning device characteristics for identification without separate disclosure and/or opt-in.", - gvl.getSpecialPurposes().get(0).getDescriptionLegal().get()); - Assertions.assertFalse(gvl.getSpecialPurposes().get(0).getIllustrations().isPresent()); + Assertions.assertEquals(1, gvl.getSpecialPurposes().get(0).getId()); + Assertions.assertEquals( + "Ensure security, prevent fraud, and debug", gvl.getSpecialPurposes().get(0).getName()); + Assertions.assertEquals( + "Your data can be used to monitor for and prevent fraudulent activity, and ensure systems and processes work properly and securely.", + gvl.getSpecialPurposes().get(0).getDescription()); + Assertions.assertTrue(gvl.getSpecialPurposes().get(0).getDescriptionLegal().isPresent()); + Assertions.assertEquals( + "To ensure security, prevent fraud and debug vendors can:\n* Ensure data are securely transmitted\n* Detect and prevent malicious, fraudulent, invalid, or illegal activity.\n* Ensure correct and efficient operation of systems and processes, including to monitor and enhance the performance of systems and processes engaged in permitted purposes\nVendors cannot:\n* Conduct any other data processing operation allowed under a different purpose under this purpose.\nNote: Data collected and used to ensure security, prevent fraud, and debug may include automatically-sent device characteristics for identification, precise geolocation data, and data obtained by actively scanning device characteristics for identification without separate disclosure and/or opt-in.", + gvl.getSpecialPurposes().get(0).getDescriptionLegal().get()); + Assertions.assertFalse(gvl.getSpecialPurposes().get(0).getIllustrations().isPresent()); - Assertions.assertEquals(1, gvl.getFeatures().get(0).getId()); - Assertions.assertEquals("Match and combine offline data sources", gvl.getFeatures().get(0).getName()); - Assertions.assertEquals( - "Data from offline data sources can be combined with your online activity in support of one or more purposes", - gvl.getFeatures().get(0).getDescription()); - Assertions.assertTrue(gvl.getFeatures().get(0).getDescriptionLegal().isPresent()); - Assertions.assertEquals( - "Vendors can:\n* Combine data obtained offline with data collected online in support of one or more Purposes or Special Purposes.", - gvl.getFeatures().get(0).getDescriptionLegal().get()); - Assertions.assertFalse(gvl.getFeatures().get(0).getIllustrations().isPresent()); + Assertions.assertEquals(1, gvl.getFeatures().get(0).getId()); + Assertions.assertEquals( + "Match and combine offline data sources", gvl.getFeatures().get(0).getName()); + Assertions.assertEquals( + "Data from offline data sources can be combined with your online activity in support of one or more purposes", + gvl.getFeatures().get(0).getDescription()); + Assertions.assertTrue(gvl.getFeatures().get(0).getDescriptionLegal().isPresent()); + Assertions.assertEquals( + "Vendors can:\n* Combine data obtained offline with data collected online in support of one or more Purposes or Special Purposes.", + gvl.getFeatures().get(0).getDescriptionLegal().get()); + Assertions.assertFalse(gvl.getFeatures().get(0).getIllustrations().isPresent()); - Assertions.assertEquals(1, gvl.getSpecialFeatures().get(0).getId()); - Assertions.assertEquals("Use precise geolocation data", gvl.getSpecialFeatures().get(0).getName()); - Assertions.assertEquals( - "Your precise geolocation data can be used in support of one or more purposes. This means your location can be accurate to within several meters.", - gvl.getSpecialFeatures().get(0).getDescription()); - Assertions.assertTrue(gvl.getSpecialFeatures().get(0).getDescriptionLegal().isPresent()); - Assertions.assertEquals( - "Vendors can:\n* Collect and process precise geolocation data in support of one or more purposes.\nN.B. Precise geolocation means that there are no restrictions on the precision of a user’s location; this can be accurate to within several meters.", - gvl.getSpecialFeatures().get(0).getDescriptionLegal().get()); - Assertions.assertFalse(gvl.getSpecialFeatures().get(0).getIllustrations().isPresent()); + Assertions.assertEquals(1, gvl.getSpecialFeatures().get(0).getId()); + Assertions.assertEquals( + "Use precise geolocation data", gvl.getSpecialFeatures().get(0).getName()); + Assertions.assertEquals( + "Your precise geolocation data can be used in support of one or more purposes. This means your location can be accurate to within several meters.", + gvl.getSpecialFeatures().get(0).getDescription()); + Assertions.assertTrue(gvl.getSpecialFeatures().get(0).getDescriptionLegal().isPresent()); + Assertions.assertEquals( + "Vendors can:\n* Collect and process precise geolocation data in support of one or more purposes.\nN.B. Precise geolocation means that there are no restrictions on the precision of a user’s location; this can be accurate to within several meters.", + gvl.getSpecialFeatures().get(0).getDescriptionLegal().get()); + Assertions.assertFalse(gvl.getSpecialFeatures().get(0).getIllustrations().isPresent()); - Assertions.assertEquals(1, gvl.getStacks().get(0).getId()); - Assertions.assertEquals("Precise geolocation data, and identification through device scanning", gvl.getStacks().get(0).getName()); - Assertions.assertEquals("Precise geolocation and information about device characteristics can be used.", gvl.getStacks().get(0).getDescription()); - Assertions.assertTrue(gvl.getStacks().get(0).getPurposes().isEmpty()); - Assertions.assertEquals(Arrays.asList(1, 2), gvl.getStacks().get(0).getSpecialFeatures()); + Assertions.assertEquals(1, gvl.getStacks().get(0).getId()); + Assertions.assertEquals( + "Precise geolocation data, and identification through device scanning", + gvl.getStacks().get(0).getName()); + Assertions.assertEquals( + "Precise geolocation and information about device characteristics can be used.", + gvl.getStacks().get(0).getDescription()); + Assertions.assertTrue(gvl.getStacks().get(0).getPurposes().isEmpty()); + Assertions.assertEquals(Arrays.asList(1, 2), gvl.getStacks().get(0).getSpecialFeatures()); - Assertions.assertEquals(2, gvl.getStacks().get(1).getId()); - Assertions.assertEquals("Basic ads, and ad measurement", gvl.getStacks().get(1).getName()); - Assertions.assertEquals("Basic ads can be served. Ad performance can be measured.", gvl.getStacks().get(1).getDescription()); - Assertions.assertEquals(Arrays.asList(2, 7), gvl.getStacks().get(1).getPurposes()); - Assertions.assertTrue(gvl.getStacks().get(1).getSpecialFeatures().isEmpty()); + Assertions.assertEquals(2, gvl.getStacks().get(1).getId()); + Assertions.assertEquals("Basic ads, and ad measurement", gvl.getStacks().get(1).getName()); + Assertions.assertEquals( + "Basic ads can be served. Ad performance can be measured.", + gvl.getStacks().get(1).getDescription()); + Assertions.assertEquals(Arrays.asList(2, 7), gvl.getStacks().get(1).getPurposes()); + Assertions.assertTrue(gvl.getStacks().get(1).getSpecialFeatures().isEmpty()); - Assertions.assertEquals(10, gvl.getVendors().get(0).getId()); - Assertions.assertFalse(gvl.getVendors().get(0).getDeletedDate().isPresent()); - Assertions.assertEquals("Index Exchange Inc. ", gvl.getVendors().get(0).getName()); - Assertions.assertEquals(Arrays.asList(2, 7), gvl.getVendors().get(0).getPurposes()); - Assertions.assertFalse(gvl.getVendors().get(0).getLegIntPurposes().isPresent()); - Assertions.assertTrue(gvl.getVendors().get(0).getImpConsPurposes().isPresent()); - Assertions.assertEquals(Collections.emptyList(), gvl.getVendors().get(0).getImpConsPurposes().get()); - Assertions.assertEquals(Arrays.asList(2, 7), gvl.getVendors().get(0).getFlexiblePurposes()); - Assertions.assertEquals(Arrays.asList(1, 2), gvl.getVendors().get(0).getSpecialPurposes()); - Assertions.assertEquals(Collections.singletonList(3), gvl.getVendors().get(0).getFeatures()); - Assertions.assertEquals(Collections.singletonList(1), gvl.getVendors().get(0).getSpecialFeatures()); - Assertions.assertTrue(gvl.getVendors().get(0).getUrls().isPresent()); - Assertions.assertEquals("https://www.indexexchange.com/privacy/", - gvl.getVendors().get(0).getUrls().get().get(0).getPrivacy()); - Assertions.assertEquals("en", - gvl.getVendors().get(0).getUrls().get().get(0).getLangId()); - Assertions.assertEquals(52, gvl.getVendors().get(1).getId()); - Assertions.assertFalse(gvl.getVendors().get(1).getDeletedDate().isPresent()); - } + Assertions.assertEquals(10, gvl.getVendors().get(0).getId()); + Assertions.assertFalse(gvl.getVendors().get(0).getDeletedDate().isPresent()); + Assertions.assertEquals("Index Exchange Inc. ", gvl.getVendors().get(0).getName()); + Assertions.assertEquals(Arrays.asList(2, 7), gvl.getVendors().get(0).getPurposes()); + Assertions.assertFalse(gvl.getVendors().get(0).getLegIntPurposes().isPresent()); + Assertions.assertTrue(gvl.getVendors().get(0).getImpConsPurposes().isPresent()); + Assertions.assertEquals( + Collections.emptyList(), gvl.getVendors().get(0).getImpConsPurposes().get()); + Assertions.assertEquals(Arrays.asList(2, 7), gvl.getVendors().get(0).getFlexiblePurposes()); + Assertions.assertEquals(Arrays.asList(1, 2), gvl.getVendors().get(0).getSpecialPurposes()); + Assertions.assertEquals(Collections.singletonList(3), gvl.getVendors().get(0).getFeatures()); + Assertions.assertEquals( + Collections.singletonList(1), gvl.getVendors().get(0).getSpecialFeatures()); + Assertions.assertTrue(gvl.getVendors().get(0).getUrls().isPresent()); + Assertions.assertEquals( + "https://www.indexexchange.com/privacy/", + gvl.getVendors().get(0).getUrls().get().get(0).getPrivacy()); + Assertions.assertEquals("en", gvl.getVendors().get(0).getUrls().get().get(0).getLangId()); + Assertions.assertEquals(52, gvl.getVendors().get(1).getId()); + Assertions.assertFalse(gvl.getVendors().get(1).getDeletedDate().isPresent()); + } } diff --git a/iabgpp-extras-jackson/src/test/java/com/iab/gpp/extras/jackson/gvl/GvlV2Test.java b/iabgpp-extras-jackson/src/test/java/com/iab/gpp/extras/jackson/gvl/GvlV2Test.java index 04ba44c9..f79f5731 100644 --- a/iabgpp-extras-jackson/src/test/java/com/iab/gpp/extras/jackson/gvl/GvlV2Test.java +++ b/iabgpp-extras-jackson/src/test/java/com/iab/gpp/extras/jackson/gvl/GvlV2Test.java @@ -20,20 +20,23 @@ * #L% */ +import com.iab.gpp.extras.gvl.Gvl; +import com.iab.gpp.extras.jackson.Loader; import java.io.IOException; import java.util.Arrays; -import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import com.iab.gpp.extras.gvl.Gvl; -import com.iab.gpp.extras.jackson.Loader; public class GvlV2Test { @Test public void test() throws IOException { - Gvl gvl = new Loader() - .globalVendorList(GvlV2Test.class.getClassLoader().getResourceAsStream("vendorlist/v2/vendor-list.json")); + Gvl gvl = + new Loader() + .globalVendorList( + GvlV2Test.class + .getClassLoader() + .getResourceAsStream("vendorlist/v2/vendor-list.json")); Assertions.assertFalse(gvl.getDataCategories().isPresent()); Assertions.assertEquals(3, gvl.getFeatures().size()); Assertions.assertEquals(2, gvl.getGvlSpecificationVersion()); @@ -47,7 +50,8 @@ public void test() throws IOException { Assertions.assertEquals(496, gvl.getVendors().size()); Assertions.assertEquals(1, gvl.getPurposes().get(0).getId()); - Assertions.assertEquals("Store and/or access information on a device", gvl.getPurposes().get(0).getName()); + Assertions.assertEquals( + "Store and/or access information on a device", gvl.getPurposes().get(0).getName()); Assertions.assertEquals( "Cookies, device identifiers, or other information can be stored or accessed on your device for the purposes presented to you.", gvl.getPurposes().get(0).getDescription()); @@ -58,7 +62,8 @@ public void test() throws IOException { Assertions.assertFalse(gvl.getPurposes().get(0).getIllustrations().isPresent()); Assertions.assertEquals(1, gvl.getSpecialPurposes().get(0).getId()); - Assertions.assertEquals("Ensure security, prevent fraud, and debug", gvl.getSpecialPurposes().get(0).getName()); + Assertions.assertEquals( + "Ensure security, prevent fraud, and debug", gvl.getSpecialPurposes().get(0).getName()); Assertions.assertEquals( "Your data can be used to monitor for and prevent fraudulent activity, and ensure systems and processes work properly and securely.", gvl.getSpecialPurposes().get(0).getDescription()); @@ -69,7 +74,8 @@ public void test() throws IOException { Assertions.assertFalse(gvl.getSpecialPurposes().get(0).getIllustrations().isPresent()); Assertions.assertEquals(1, gvl.getFeatures().get(0).getId()); - Assertions.assertEquals("Match and combine offline data sources", gvl.getFeatures().get(0).getName()); + Assertions.assertEquals( + "Match and combine offline data sources", gvl.getFeatures().get(0).getName()); Assertions.assertEquals( "Data from offline data sources can be combined with your online activity in support of one or more purposes", gvl.getFeatures().get(0).getDescription()); @@ -80,7 +86,8 @@ public void test() throws IOException { Assertions.assertFalse(gvl.getFeatures().get(0).getIllustrations().isPresent()); Assertions.assertEquals(1, gvl.getSpecialFeatures().get(0).getId()); - Assertions.assertEquals("Use precise geolocation data", gvl.getSpecialFeatures().get(0).getName()); + Assertions.assertEquals( + "Use precise geolocation data", gvl.getSpecialFeatures().get(0).getName()); Assertions.assertEquals( "Your precise geolocation data can be used in support of one or more purposes. This means your location can be accurate to within several meters.", gvl.getSpecialFeatures().get(0).getDescription()); @@ -91,32 +98,39 @@ public void test() throws IOException { Assertions.assertFalse(gvl.getSpecialFeatures().get(0).getIllustrations().isPresent()); Assertions.assertEquals(1, gvl.getStacks().get(0).getId()); - Assertions.assertEquals("Precise geolocation data, and identification through device scanning", gvl.getStacks().get(0).getName()); - Assertions.assertEquals("Precise geolocation and information about device characteristics can be used.", gvl.getStacks().get(0).getDescription()); + Assertions.assertEquals( + "Precise geolocation data, and identification through device scanning", + gvl.getStacks().get(0).getName()); + Assertions.assertEquals( + "Precise geolocation and information about device characteristics can be used.", + gvl.getStacks().get(0).getDescription()); Assertions.assertTrue(gvl.getStacks().get(0).getPurposes().isEmpty()); Assertions.assertEquals(Arrays.asList(1, 2), gvl.getStacks().get(0).getSpecialFeatures()); - + Assertions.assertEquals(2, gvl.getStacks().get(1).getId()); Assertions.assertEquals("Basic ads, and ad measurement", gvl.getStacks().get(1).getName()); - Assertions.assertEquals("Basic ads can be served. Ad performance can be measured.", gvl.getStacks().get(1).getDescription()); + Assertions.assertEquals( + "Basic ads can be served. Ad performance can be measured.", + gvl.getStacks().get(1).getDescription()); Assertions.assertEquals(Arrays.asList(2, 7), gvl.getStacks().get(1).getPurposes()); Assertions.assertTrue(gvl.getStacks().get(1).getSpecialFeatures().isEmpty()); - - Assertions.assertEquals(8, gvl.getVendors().get(0).getId()); + + Assertions.assertEquals(8, gvl.getVendors().get(0).getId()); Assertions.assertFalse(gvl.getVendors().get(0).getDeletedDate().isPresent()); Assertions.assertEquals("Emerse Sverige AB", gvl.getVendors().get(0).getName()); Assertions.assertEquals(Arrays.asList(1, 3, 4), gvl.getVendors().get(0).getPurposes()); Assertions.assertTrue(gvl.getVendors().get(0).getLegIntPurposes().isPresent()); - Assertions.assertEquals(Arrays.asList(2, 7, 8, 9), gvl.getVendors().get(0).getLegIntPurposes().get()); - Assertions.assertEquals(Arrays.asList(2, 9), gvl.getVendors().get(0).getFlexiblePurposes()); - Assertions.assertEquals(Arrays.asList(1, 2), gvl.getVendors().get(0).getSpecialPurposes()); - Assertions.assertEquals(Arrays.asList(1, 2), gvl.getVendors().get(0).getFeatures()); + Assertions.assertEquals( + Arrays.asList(2, 7, 8, 9), gvl.getVendors().get(0).getLegIntPurposes().get()); + Assertions.assertEquals(Arrays.asList(2, 9), gvl.getVendors().get(0).getFlexiblePurposes()); + Assertions.assertEquals(Arrays.asList(1, 2), gvl.getVendors().get(0).getSpecialPurposes()); + Assertions.assertEquals(Arrays.asList(1, 2), gvl.getVendors().get(0).getFeatures()); Assertions.assertTrue(gvl.getVendors().get(0).getSpecialFeatures().isEmpty()); Assertions.assertTrue(gvl.getVendors().get(0).getPolicyUrl().isPresent()); - Assertions.assertEquals("https://www.emerse.com/privacy-policy/", gvl.getVendors().get(0).getPolicyUrl().get()); - - Assertions.assertEquals(9, gvl.getVendors().get(1).getId()); + Assertions.assertEquals( + "https://www.emerse.com/privacy-policy/", gvl.getVendors().get(0).getPolicyUrl().get()); + + Assertions.assertEquals(9, gvl.getVendors().get(1).getId()); Assertions.assertTrue(gvl.getVendors().get(1).getDeletedDate().isPresent()); } - } diff --git a/iabgpp-extras-jackson/src/test/java/com/iab/gpp/extras/jackson/gvl/GvlV3Test.java b/iabgpp-extras-jackson/src/test/java/com/iab/gpp/extras/jackson/gvl/GvlV3Test.java index e27831f1..3a554b71 100644 --- a/iabgpp-extras-jackson/src/test/java/com/iab/gpp/extras/jackson/gvl/GvlV3Test.java +++ b/iabgpp-extras-jackson/src/test/java/com/iab/gpp/extras/jackson/gvl/GvlV3Test.java @@ -20,21 +20,24 @@ * #L% */ +import com.iab.gpp.extras.gvl.Gvl; +import com.iab.gpp.extras.jackson.Loader; import java.io.IOException; import java.util.Arrays; import java.util.Collections; - import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import com.iab.gpp.extras.gvl.Gvl; -import com.iab.gpp.extras.jackson.Loader; public class GvlV3Test { @Test public void test() throws IOException { - Gvl gvl = new Loader() - .globalVendorList(GvlV3Test.class.getClassLoader().getResourceAsStream("vendorlist/v3.0/vendor-list.json")); + Gvl gvl = + new Loader() + .globalVendorList( + GvlV3Test.class + .getClassLoader() + .getResourceAsStream("vendorlist/v3.0/vendor-list.json")); Assertions.assertTrue(gvl.getDataCategories().isPresent()); Assertions.assertEquals(3, gvl.getFeatures().size()); Assertions.assertEquals(3, gvl.getGvlSpecificationVersion()); @@ -46,64 +49,91 @@ public void test() throws IOException { Assertions.assertEquals(4, gvl.getTcfPolicyVersion()); Assertions.assertEquals(7, gvl.getVendorListVersion()); Assertions.assertEquals(376, gvl.getVendors().size()); - + Assertions.assertEquals(1, gvl.getPurposes().get(0).getId()); - Assertions.assertEquals("Store and/or access information on a device", gvl.getPurposes().get(0).getName()); - Assertions.assertEquals("Cookies, device or similar online identifiers (e.g. login-based identifiers, randomly assigned identifiers, network based identifiers) together with other information (e.g. browser type and information, language, screen size, supported technologies etc.) can be stored or read on your device to recognise it each time it connects to an app or to a website, for one or several of the purposes presented here. ", gvl.getPurposes().get(0).getDescription()); + Assertions.assertEquals( + "Store and/or access information on a device", gvl.getPurposes().get(0).getName()); + Assertions.assertEquals( + "Cookies, device or similar online identifiers (e.g. login-based identifiers, randomly assigned identifiers, network based identifiers) together with other information (e.g. browser type and information, language, screen size, supported technologies etc.) can be stored or read on your device to recognise it each time it connects to an app or to a website, for one or several of the purposes presented here. ", + gvl.getPurposes().get(0).getDescription()); Assertions.assertFalse(gvl.getPurposes().get(0).getDescriptionLegal().isPresent()); Assertions.assertTrue(gvl.getPurposes().get(0).getIllustrations().isPresent()); Assertions.assertEquals(1, gvl.getPurposes().get(0).getIllustrations().get().size()); - + Assertions.assertEquals(1, gvl.getSpecialPurposes().get(0).getId()); - Assertions.assertEquals("Ensure security, prevent and detect fraud, and fix errors\n", gvl.getSpecialPurposes().get(0).getName()); - Assertions.assertEquals("Your data can be used to monitor for and prevent unusual and possibly fraudulent activity (for example, regarding advertising, ad clicks by bots), and ensure systems and processes work properly and securely. It can also be used to correct any problems you, the publisher or the advertiser may encounter in the delivery of content and ads and in your interaction with them.", gvl.getSpecialPurposes().get(0).getDescription()); + Assertions.assertEquals( + "Ensure security, prevent and detect fraud, and fix errors\n", + gvl.getSpecialPurposes().get(0).getName()); + Assertions.assertEquals( + "Your data can be used to monitor for and prevent unusual and possibly fraudulent activity (for example, regarding advertising, ad clicks by bots), and ensure systems and processes work properly and securely. It can also be used to correct any problems you, the publisher or the advertiser may encounter in the delivery of content and ads and in your interaction with them.", + gvl.getSpecialPurposes().get(0).getDescription()); Assertions.assertFalse(gvl.getSpecialPurposes().get(0).getDescriptionLegal().isPresent()); Assertions.assertTrue(gvl.getSpecialPurposes().get(0).getIllustrations().isPresent()); Assertions.assertEquals(1, gvl.getSpecialPurposes().get(0).getIllustrations().get().size()); - + Assertions.assertEquals(1, gvl.getFeatures().get(0).getId()); - Assertions.assertEquals("Match and combine data from other data sources", gvl.getFeatures().get(0).getName()); - Assertions.assertEquals("Information about your activity on this service may be matched and combined with other information relating to you and originating from various sources (for instance your activity on a separate online service, your use of a loyalty card in-store, or your answers to a survey), in support of the purposes explained in this notice.", gvl.getFeatures().get(0).getDescription()); + Assertions.assertEquals( + "Match and combine data from other data sources", gvl.getFeatures().get(0).getName()); + Assertions.assertEquals( + "Information about your activity on this service may be matched and combined with other information relating to you and originating from various sources (for instance your activity on a separate online service, your use of a loyalty card in-store, or your answers to a survey), in support of the purposes explained in this notice.", + gvl.getFeatures().get(0).getDescription()); Assertions.assertFalse(gvl.getFeatures().get(0).getDescriptionLegal().isPresent()); Assertions.assertTrue(gvl.getFeatures().get(0).getIllustrations().isPresent()); Assertions.assertEquals(0, gvl.getFeatures().get(0).getIllustrations().get().size()); - + Assertions.assertEquals(1, gvl.getSpecialFeatures().get(0).getId()); - Assertions.assertEquals("Use precise geolocation data", gvl.getSpecialFeatures().get(0).getName()); - Assertions.assertEquals("With your acceptance, your precise location (within a radius of less than 500 metres) may be used in support of the purposes explained in this notice.", gvl.getSpecialFeatures().get(0).getDescription()); + Assertions.assertEquals( + "Use precise geolocation data", gvl.getSpecialFeatures().get(0).getName()); + Assertions.assertEquals( + "With your acceptance, your precise location (within a radius of less than 500 metres) may be used in support of the purposes explained in this notice.", + gvl.getSpecialFeatures().get(0).getDescription()); Assertions.assertFalse(gvl.getSpecialFeatures().get(0).getDescriptionLegal().isPresent()); Assertions.assertTrue(gvl.getSpecialFeatures().get(0).getIllustrations().isPresent()); Assertions.assertEquals(0, gvl.getSpecialFeatures().get(0).getIllustrations().get().size()); - + Assertions.assertEquals(1, gvl.getStacks().get(0).getId()); - Assertions.assertEquals("Precise geolocation data, and identification through device scanning", gvl.getStacks().get(0).getName()); - Assertions.assertEquals("Precise geolocation and information about device characteristics can be used.\n\n", gvl.getStacks().get(0).getDescription()); + Assertions.assertEquals( + "Precise geolocation data, and identification through device scanning", + gvl.getStacks().get(0).getName()); + Assertions.assertEquals( + "Precise geolocation and information about device characteristics can be used.\n\n", + gvl.getStacks().get(0).getDescription()); Assertions.assertTrue(gvl.getStacks().get(0).getPurposes().isEmpty()); Assertions.assertEquals(Arrays.asList(1, 2), gvl.getStacks().get(0).getSpecialFeatures()); - + Assertions.assertEquals(2, gvl.getStacks().get(1).getId()); - Assertions.assertEquals("Advertising based on limited data and advertising measurement", gvl.getStacks().get(1).getName()); - Assertions.assertEquals("Advertising can be presented based on limited data. Advertising performance can be measured.", gvl.getStacks().get(1).getDescription()); + Assertions.assertEquals( + "Advertising based on limited data and advertising measurement", + gvl.getStacks().get(1).getName()); + Assertions.assertEquals( + "Advertising can be presented based on limited data. Advertising performance can be measured.", + gvl.getStacks().get(1).getDescription()); Assertions.assertEquals(Arrays.asList(2, 7), gvl.getStacks().get(1).getPurposes()); Assertions.assertTrue(gvl.getStacks().get(1).getSpecialFeatures().isEmpty()); - + Assertions.assertEquals(1, gvl.getDataCategories().get().get(0).getId()); Assertions.assertEquals("IP addresses", gvl.getDataCategories().get().get(0).getName()); - Assertions.assertEquals("Your IP address is a number assigned by your Internet Service Provider to any Internet connection. It is not always specific to your device and is not always a stable identifier.\nIt is used to route information on the Internet and display online content (including ads) on your connected device.", gvl.getDataCategories().get().get(0).getDescription()); - - Assertions.assertEquals(1, gvl.getVendors().get(0).getId()); + Assertions.assertEquals( + "Your IP address is a number assigned by your Internet Service Provider to any Internet connection. It is not always specific to your device and is not always a stable identifier.\nIt is used to route information on the Internet and display online content (including ads) on your connected device.", + gvl.getDataCategories().get().get(0).getDescription()); + + Assertions.assertEquals(1, gvl.getVendors().get(0).getId()); Assertions.assertFalse(gvl.getVendors().get(0).getDeletedDate().isPresent()); - Assertions.assertEquals("Exponential Interactive, Inc d/b/a VDX.tv", gvl.getVendors().get(0).getName()); - Assertions.assertEquals(Arrays.asList(1, 2, 3, 4, 7, 8, 9, 10), gvl.getVendors().get(0).getPurposes()); + Assertions.assertEquals( + "Exponential Interactive, Inc d/b/a VDX.tv", gvl.getVendors().get(0).getName()); + Assertions.assertEquals( + Arrays.asList(1, 2, 3, 4, 7, 8, 9, 10), gvl.getVendors().get(0).getPurposes()); Assertions.assertTrue(gvl.getVendors().get(0).getLegIntPurposes().isPresent()); - Assertions.assertEquals(Collections.emptyList(), gvl.getVendors().get(0).getLegIntPurposes().get()); - Assertions.assertEquals(Arrays.asList(7, 8, 9, 10), gvl.getVendors().get(0).getFlexiblePurposes()); - Assertions.assertEquals(Arrays.asList(1, 2), gvl.getVendors().get(0).getSpecialPurposes()); - Assertions.assertEquals(Arrays.asList(1, 2, 3), gvl.getVendors().get(0).getFeatures()); + Assertions.assertEquals( + Collections.emptyList(), gvl.getVendors().get(0).getLegIntPurposes().get()); + Assertions.assertEquals( + Arrays.asList(7, 8, 9, 10), gvl.getVendors().get(0).getFlexiblePurposes()); + Assertions.assertEquals(Arrays.asList(1, 2), gvl.getVendors().get(0).getSpecialPurposes()); + Assertions.assertEquals(Arrays.asList(1, 2, 3), gvl.getVendors().get(0).getFeatures()); Assertions.assertTrue(gvl.getVendors().get(0).getSpecialFeatures().isEmpty()); Assertions.assertFalse(gvl.getVendors().get(0).getPolicyUrl().isPresent()); Assertions.assertTrue(gvl.getVendors().get(0).getCookieMaxAgeSeconds().isPresent()); - Assertions.assertEquals(7776000, gvl.getVendors().get(0).getCookieMaxAgeSeconds().get()); + Assertions.assertEquals(7776000, gvl.getVendors().get(0).getCookieMaxAgeSeconds().get()); Assertions.assertTrue(gvl.getVendors().get(0).getUsesCookies().isPresent()); Assertions.assertTrue(gvl.getVendors().get(0).getUsesCookies().get()); Assertions.assertTrue(gvl.getVendors().get(0).getCookieRefresh().isPresent()); @@ -111,34 +141,45 @@ public void test() throws IOException { Assertions.assertTrue(gvl.getVendors().get(0).getUsesNonCookieAccess().isPresent()); Assertions.assertFalse(gvl.getVendors().get(0).getUsesNonCookieAccess().get()); Assertions.assertTrue(gvl.getVendors().get(0).getDataRetention().isPresent()); - Assertions.assertTrue(gvl.getVendors().get(0).getDataRetention().get().getStdRetention().isPresent()); - Assertions.assertEquals(397, gvl.getVendors().get(0).getDataRetention().get().getStdRetention().get()); + Assertions.assertTrue( + gvl.getVendors().get(0).getDataRetention().get().getStdRetention().isPresent()); + Assertions.assertEquals( + 397, gvl.getVendors().get(0).getDataRetention().get().getStdRetention().get()); Assertions.assertTrue(gvl.getVendors().get(0).getDataRetention().get().getPurposes().isEmpty()); - Assertions.assertTrue(gvl.getVendors().get(0).getDataRetention().get().getSpecialPurposes().isEmpty()); + Assertions.assertTrue( + gvl.getVendors().get(0).getDataRetention().get().getSpecialPurposes().isEmpty()); Assertions.assertTrue(gvl.getVendors().get(0).getUrls().isPresent()); Assertions.assertEquals(1, gvl.getVendors().get(0).getUrls().get().size()); Assertions.assertEquals("en", gvl.getVendors().get(0).getUrls().get().get(0).getLangId()); - Assertions.assertEquals("https://vdx.tv/privacy/", gvl.getVendors().get(0).getUrls().get().get(0).getPrivacy()); - Assertions.assertTrue(gvl.getVendors().get(0).getUrls().get().get(0).getLegIntClaim().isPresent()); - Assertions.assertEquals("https://cdnx.exponential.com/wp-content/uploads/2018/04/Balancing-Assessment-for-Legitimate-Interest-Publishers-v2.pdf", gvl.getVendors().get(0).getUrls().get().get(0).getLegIntClaim().get()); + Assertions.assertEquals( + "https://vdx.tv/privacy/", gvl.getVendors().get(0).getUrls().get().get(0).getPrivacy()); + Assertions.assertTrue( + gvl.getVendors().get(0).getUrls().get().get(0).getLegIntClaim().isPresent()); + Assertions.assertEquals( + "https://cdnx.exponential.com/wp-content/uploads/2018/04/Balancing-Assessment-for-Legitimate-Interest-Publishers-v2.pdf", + gvl.getVendors().get(0).getUrls().get().get(0).getLegIntClaim().get()); Assertions.assertTrue(gvl.getVendors().get(0).getDataDeclaration().isPresent()); - Assertions.assertEquals(Arrays.asList(1, 3, 4, 6, 8, 10, 11), gvl.getVendors().get(0).getDataDeclaration().get()); + Assertions.assertEquals( + Arrays.asList(1, 3, 4, 6, 8, 10, 11), gvl.getVendors().get(0).getDataDeclaration().get()); Assertions.assertTrue(gvl.getVendors().get(0).getDeviceStorageDisclosureUrl().isPresent()); - Assertions.assertEquals("https://vdxtv.expo.workers.dev", gvl.getVendors().get(0).getDeviceStorageDisclosureUrl().get()); - - Assertions.assertEquals(12, gvl.getVendors().get(4).getId()); + Assertions.assertEquals( + "https://vdxtv.expo.workers.dev", + gvl.getVendors().get(0).getDeviceStorageDisclosureUrl().get()); + + Assertions.assertEquals(12, gvl.getVendors().get(4).getId()); Assertions.assertFalse(gvl.getVendors().get(4).getDeletedDate().isPresent()); Assertions.assertEquals("BeeswaxIO Corporation", gvl.getVendors().get(4).getName()); - Assertions.assertEquals(Arrays.asList(1, 2, 3, 4, 7), gvl.getVendors().get(4).getPurposes()); + Assertions.assertEquals(Arrays.asList(1, 2, 3, 4, 7), gvl.getVendors().get(4).getPurposes()); Assertions.assertTrue(gvl.getVendors().get(4).getLegIntPurposes().isPresent()); - Assertions.assertEquals(Collections.emptyList(), gvl.getVendors().get(4).getLegIntPurposes().get()); - Assertions.assertEquals(Collections.emptyList(), gvl.getVendors().get(4).getFlexiblePurposes()); - Assertions.assertEquals(Arrays.asList(1, 2), gvl.getVendors().get(4).getSpecialPurposes()); - Assertions.assertEquals(Arrays.asList(1, 3), gvl.getVendors().get(4).getFeatures()); - Assertions.assertEquals(Arrays.asList(1), gvl.getVendors().get(4).getSpecialFeatures()); + Assertions.assertEquals( + Collections.emptyList(), gvl.getVendors().get(4).getLegIntPurposes().get()); + Assertions.assertEquals(Collections.emptyList(), gvl.getVendors().get(4).getFlexiblePurposes()); + Assertions.assertEquals(Arrays.asList(1, 2), gvl.getVendors().get(4).getSpecialPurposes()); + Assertions.assertEquals(Arrays.asList(1, 3), gvl.getVendors().get(4).getFeatures()); + Assertions.assertEquals(Arrays.asList(1), gvl.getVendors().get(4).getSpecialFeatures()); Assertions.assertFalse(gvl.getVendors().get(4).getPolicyUrl().isPresent()); Assertions.assertTrue(gvl.getVendors().get(4).getCookieMaxAgeSeconds().isPresent()); - Assertions.assertEquals(34109999, gvl.getVendors().get(4).getCookieMaxAgeSeconds().get()); + Assertions.assertEquals(34109999, gvl.getVendors().get(4).getCookieMaxAgeSeconds().get()); Assertions.assertTrue(gvl.getVendors().get(4).getUsesCookies().isPresent()); Assertions.assertTrue(gvl.getVendors().get(4).getUsesCookies().get()); Assertions.assertTrue(gvl.getVendors().get(4).getCookieRefresh().isPresent()); @@ -146,26 +187,40 @@ public void test() throws IOException { Assertions.assertTrue(gvl.getVendors().get(4).getUsesNonCookieAccess().isPresent()); Assertions.assertTrue(gvl.getVendors().get(4).getUsesNonCookieAccess().get()); Assertions.assertTrue(gvl.getVendors().get(4).getDataRetention().isPresent()); - Assertions.assertTrue(gvl.getVendors().get(4).getDataRetention().get().getStdRetention().isPresent()); - Assertions.assertEquals(0, gvl.getVendors().get(4).getDataRetention().get().getStdRetention().get()); - Assertions.assertEquals(1, gvl.getVendors().get(4).getDataRetention().get().getPurposes().size()); - Assertions.assertEquals(4320, gvl.getVendors().get(4).getDataRetention().get().getPurposes().get(7)); - Assertions.assertEquals(2, gvl.getVendors().get(4).getDataRetention().get().getSpecialPurposes().size()); - Assertions.assertEquals(392, gvl.getVendors().get(4).getDataRetention().get().getSpecialPurposes().get(1)); - Assertions.assertEquals(4320, gvl.getVendors().get(4).getDataRetention().get().getSpecialPurposes().get(2)); + Assertions.assertTrue( + gvl.getVendors().get(4).getDataRetention().get().getStdRetention().isPresent()); + Assertions.assertEquals( + 0, gvl.getVendors().get(4).getDataRetention().get().getStdRetention().get()); + Assertions.assertEquals( + 1, gvl.getVendors().get(4).getDataRetention().get().getPurposes().size()); + Assertions.assertEquals( + 4320, gvl.getVendors().get(4).getDataRetention().get().getPurposes().get(7)); + Assertions.assertEquals( + 2, gvl.getVendors().get(4).getDataRetention().get().getSpecialPurposes().size()); + Assertions.assertEquals( + 392, gvl.getVendors().get(4).getDataRetention().get().getSpecialPurposes().get(1)); + Assertions.assertEquals( + 4320, gvl.getVendors().get(4).getDataRetention().get().getSpecialPurposes().get(2)); Assertions.assertTrue(gvl.getVendors().get(4).getUrls().isPresent()); Assertions.assertEquals(1, gvl.getVendors().get(4).getUrls().get().size()); Assertions.assertEquals("en", gvl.getVendors().get(4).getUrls().get().get(0).getLangId()); - Assertions.assertEquals("https://www.beeswax.com/privacy/", gvl.getVendors().get(4).getUrls().get().get(0).getPrivacy()); - Assertions.assertTrue(gvl.getVendors().get(4).getUrls().get().get(0).getLegIntClaim().isPresent()); - Assertions.assertEquals("https://www.beeswax.com/privacy/", gvl.getVendors().get(4).getUrls().get().get(0).getLegIntClaim().get()); + Assertions.assertEquals( + "https://www.beeswax.com/privacy/", + gvl.getVendors().get(4).getUrls().get().get(0).getPrivacy()); + Assertions.assertTrue( + gvl.getVendors().get(4).getUrls().get().get(0).getLegIntClaim().isPresent()); + Assertions.assertEquals( + "https://www.beeswax.com/privacy/", + gvl.getVendors().get(4).getUrls().get().get(0).getLegIntClaim().get()); Assertions.assertTrue(gvl.getVendors().get(4).getDataDeclaration().isPresent()); - Assertions.assertEquals(Arrays.asList(1, 2, 3, 4, 6, 8, 9, 11), gvl.getVendors().get(4).getDataDeclaration().get()); + Assertions.assertEquals( + Arrays.asList(1, 2, 3, 4, 6, 8, 9, 11), gvl.getVendors().get(4).getDataDeclaration().get()); Assertions.assertTrue(gvl.getVendors().get(4).getDeviceStorageDisclosureUrl().isPresent()); - Assertions.assertEquals("https://beeswax.com/devicedisclosure.json", gvl.getVendors().get(4).getDeviceStorageDisclosureUrl().get()); - + Assertions.assertEquals( + "https://beeswax.com/devicedisclosure.json", + gvl.getVendors().get(4).getDeviceStorageDisclosureUrl().get()); + Assertions.assertTrue(gvl.getVendor(26).getCookieRefresh().isPresent()); Assertions.assertFalse(gvl.getVendor(26).getCookieRefresh().get()); } - } diff --git a/iabgpp-extras/pom.xml b/iabgpp-extras/pom.xml index b14f682e..3025474c 100644 --- a/iabgpp-extras/pom.xml +++ b/iabgpp-extras/pom.xml @@ -7,7 +7,7 @@ com.iabgpp iabgpp-core - 4.0.0-RC1 + 4.0.0-SNAPSHOT iabgpp-extras @@ -17,7 +17,22 @@ maven-surefire-plugin - 2.22.2 + + + org.jacoco + jacoco-maven-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.apache.maven.plugins + maven-source-plugin + + + com.diffplug.spotless + spotless-maven-plugin @@ -27,14 +42,6 @@ release - - org.apache.maven.plugins - maven-source-plugin - - - org.apache.maven.plugins - maven-javadoc-plugin - org.apache.maven.plugins maven-gpg-plugin diff --git a/iabgpp-extras/src/main/java/com/iab/gpp/extras/cmp/CmpList.java b/iabgpp-extras/src/main/java/com/iab/gpp/extras/cmp/CmpList.java index 5f3c3d4a..9bf72400 100644 --- a/iabgpp-extras/src/main/java/com/iab/gpp/extras/cmp/CmpList.java +++ b/iabgpp-extras/src/main/java/com/iab/gpp/extras/cmp/CmpList.java @@ -46,5 +46,4 @@ public interface CmpList { * @return {@link Cmp} object */ Cmp getCmp(int cmpId); - } diff --git a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/DataCategory.java b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/DataCategory.java index e7e62cc3..4d54ae7c 100644 --- a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/DataCategory.java +++ b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/DataCategory.java @@ -25,5 +25,4 @@ public interface DataCategory { * @return description */ String getDescription(); - } diff --git a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/DataRetention.java b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/DataRetention.java index 12615dfa..ec11c2f1 100644 --- a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/DataRetention.java +++ b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/DataRetention.java @@ -1,6 +1,5 @@ package com.iab.gpp.extras.gvl; -import java.util.List; import java.util.Map; import java.util.Optional; @@ -49,5 +48,4 @@ public interface DataRetention { * @return specialPurposes */ Map getSpecialPurposes(); - } diff --git a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/Gvl.java b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/Gvl.java index a1a6e545..057820a2 100644 --- a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/Gvl.java +++ b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/Gvl.java @@ -106,8 +106,8 @@ public interface Gvl { /** * A list of data categories - * @since 3.0 * + * @since 3.0 * @return A {@link List} of {@link DataCategory} objects */ Optional> getDataCategories(); diff --git a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/Overflow.java b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/Overflow.java index 12a74b0e..638236c0 100644 --- a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/Overflow.java +++ b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/Overflow.java @@ -9,9 +9,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -20,7 +20,6 @@ * #L% */ - public interface Overflow { /** diff --git a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/Purpose.java b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/Purpose.java index 2f2812d7..38a17ff5 100644 --- a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/Purpose.java +++ b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/Purpose.java @@ -23,9 +23,7 @@ * #L% */ -/** - * A standard purpose - */ +/** A standard purpose */ public interface Purpose { /** @@ -51,20 +49,22 @@ public interface Purpose { /** * Legal description of the purpose + * * @return legal description string */ Optional getDescriptionLegal(); /** * A list of illustrations + * * @since 3.0 * @return A {@link List} of strings */ Optional> getIllustrations(); /** - * An optional flag where false means CMPs should never afford users the means to provide an opt-in - * consent choice + * An optional flag where false means CMPs should never afford users the means to provide an + * opt-in consent choice * * @return consentable boolean */ diff --git a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/SpecialFeature.java b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/SpecialFeature.java index c6691277..40501d6c 100644 --- a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/SpecialFeature.java +++ b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/SpecialFeature.java @@ -25,6 +25,4 @@ * signal an opt-in choice as to whether vendors may employ the feature when performing any purpose * processing. See Policies for specifics. */ -public interface SpecialFeature extends Feature { - -} +public interface SpecialFeature extends Feature {} diff --git a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/SpecialPurpose.java b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/SpecialPurpose.java index f288572f..d987d30b 100644 --- a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/SpecialPurpose.java +++ b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/SpecialPurpose.java @@ -20,9 +20,5 @@ * #L% */ -/** - * A special purpose declared as performed on the legal basis of a legitimate interest - */ -public interface SpecialPurpose extends Purpose { - -} +/** A special purpose declared as performed on the legal basis of a legitimate interest */ +public interface SpecialPurpose extends Purpose {} diff --git a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/Vendor.java b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/Vendor.java index 480a21b7..f17062e2 100644 --- a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/Vendor.java +++ b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/Vendor.java @@ -27,8 +27,8 @@ public interface Vendor { /** - * A vendor id: a numeric ID which is incrementally assigned and never re-used – deleted Vendors are - * just marked as deleted + * A vendor id: a numeric ID which is incrementally assigned and never re-used – deleted Vendors + * are just marked as deleted * * @return vendor id */ @@ -49,8 +49,8 @@ public interface Vendor { List getPurposes(); /** - * List of Purposes for which the vendor requires to be transparently disclosed as their legitimate - * interest + * List of Purposes for which the vendor requires to be transparently disclosed as their + * legitimate interest * * @return A {@link List} of purpose ids disclosed as legitimate interests */ @@ -66,8 +66,8 @@ public interface Vendor { /** * List of purposes where the vendor is flexible regarding the legal basis; they will perform the - * processing based on consent or a legitimate interest. The 'default' is determined by which of the - * other two mutually-exclusive purpose fields is used to declare the purpose for the vendor + * processing based on consent or a legitimate interest. The 'default' is determined by which of + * the other two mutually-exclusive purpose fields is used to declare the purpose for the vendor * * @return A {@link List} of flexible purpose ids */ @@ -97,6 +97,7 @@ public interface Vendor { /** * GDPR/privacy policy page URL + * * @deprecated since 3.0 * @return policy url string */ @@ -111,7 +112,8 @@ public interface Vendor { /** * object specifying the vendor's http GET request length limit. It is optional. If a vendor entry - * does not include this attribute then the vendor has no overflow options and none can be inferred. + * does not include this attribute then the vendor has no overflow options and none can be + * inferred. * * @return A {@link Overflow} object */ @@ -125,23 +127,23 @@ public interface Vendor { boolean isDeleted(); /** - * The number of seconds representing the longest potential duration for cookie storage on a device. - * If a Vendor uses multiple cookies with differing durations, cookieMaxAgeSeconds represents the - * cookie with the longest duration. Note: cookies are the only method of storage or device access - * that permit a predictable duration to be set. This is required only if usesCookies is set to - * true, else optional - * - * @return The number, in seconds, of the longest potential duration for storage on a device, as set - * when using the cookie method of storage. A negative number or a 0 indicate session - * storage similar to the Set-Cookie spec. A "-100" value no longer indicates no cookie - * usage. Note: this only includes what is declared when the storage is set and does not - * consider duration extensions should storage be refreshed + * The number of seconds representing the longest potential duration for cookie storage on a + * device. If a Vendor uses multiple cookies with differing durations, cookieMaxAgeSeconds + * represents the cookie with the longest duration. Note: cookies are the only method of storage + * or device access that permit a predictable duration to be set. This is required only if + * usesCookies is set to true, else optional + * + * @return The number, in seconds, of the longest potential duration for storage on a device, as + * set when using the cookie method of storage. A negative number or a 0 indicate session + * storage similar to the Set-Cookie spec. A "-100" value no longer indicates no cookie usage. + * Note: this only includes what is declared when the storage is set and does not consider + * duration extensions should storage be refreshed */ Optional getCookieMaxAgeSeconds(); /** * This boolean field indicates whether the vendor uses cookie storage (session or otherwise). - * + * * @return True indicates cookie storage is used */ Optional getUsesCookies(); @@ -149,47 +151,49 @@ public interface Vendor { /** * This true or false field indicates whether any cookies in scope for cookieMaxAgeSeconds are * refreshed after being initially set. - * + * * @return True indicates the vendor refreshes this cookie */ - Optional getCookieRefresh(); + Optional getCookieRefresh(); /** * This boolean field indicates whether the vendor uses other, non-cookie methods of storage or * accessing information already stored on a user’s device. Examples of non-cookie storage and * access may be localStorage, indexDB, mobile ad IDs, etc. - * + * * @return True indicates non-cookie access is used */ - Optional getUsesNonCookieAccess(); + Optional getUsesNonCookieAccess(); /** * Link to a recommended, vendor-hosted, secure URL for disclosing additional storage information - * + * * @return Location of vendor-hosted deviceStorage.json file */ Optional getDeviceStorageDisclosureUrl(); /** * This object indicates how long vendors retain user's data for each declared purpose + * * @since 3.0 - * * @return {@link DataRetention} object */ Optional getDataRetention(); /** - * This list indicates unique urls to privacy policies by language and link to an - * explanation of their legitimate interests at stake + * This list indicates unique urls to privacy policies by language and link to an explanation of + * their legitimate interests at stake + * * @since 3.0 * @return A {@link List} of {@link VendorUrl} objects */ Optional> getUrls(); /** - * This list of integers indicates data categories {@link DataCategory} that vendors collect and process - * @since 3.0 + * This list of integers indicates data categories {@link DataCategory} that vendors collect and + * process * + * @since 3.0 * @return A {@link List} of integers */ Optional> getDataDeclaration(); diff --git a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/VendorUrl.java b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/VendorUrl.java index 7a495de7..af548f64 100644 --- a/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/VendorUrl.java +++ b/iabgpp-extras/src/main/java/com/iab/gpp/extras/gvl/VendorUrl.java @@ -47,5 +47,4 @@ public interface VendorUrl { * @return legIntClaim */ Optional getLegIntClaim(); - } diff --git a/pom.xml b/pom.xml index b79ba53c..4a7e7d61 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.iabgpp iabgpp-core - 4.0.0-RC1 + 4.0.0-SNAPSHOT IAB GPP Core Library https://github.com/IABTechLabs/iabtcf-java Encode and decode consent information with the IAB GPP v3.0. @@ -62,6 +62,50 @@ + + maven-surefire-plugin + 2.22.2 + + + org.jacoco + jacoco-maven-plugin + 0.8.14 + + + + prepare-agent + + + + report + test + + report + + + + + + com.diffplug.spotless + spotless-maven-plugin + 3.2.1 + + + + 1.33.0 + + + + + + + + check + + verify + + + org.apache.maven.plugins maven-source-plugin @@ -80,6 +124,9 @@ org.apache.maven.plugins maven-javadoc-plugin 3.3.1 + + public + attach-javadoc @@ -113,14 +160,6 @@ release - - org.apache.maven.plugins - maven-source-plugin - - - org.apache.maven.plugins - maven-javadoc-plugin - org.apache.maven.plugins maven-gpg-plugin