From a6862dc82f41661539cc36affb34d7c0963b2e9c Mon Sep 17 00:00:00 2001 From: Chad Huff Date: Thu, 29 Jan 2026 10:38:37 -0700 Subject: [PATCH 1/2] Minnesota --- README.md | 451 ++++++++++++------ .../java/com/iab/gpp/encoder/GppModel.java | 36 +- .../com/iab/gpp/encoder/field/UsMnField.java | 48 ++ .../com/iab/gpp/encoder/section/Sections.java | 1 + .../com/iab/gpp/encoder/section/UsMn.java | 143 ++++++ .../gpp/encoder/segment/UsDeCoreSegment.java | 3 +- .../gpp/encoder/segment/UsMnCoreSegment.java | 98 ++++ .../gpp/encoder/segment/UsMnGpcSegment.java | 61 +++ .../com/iab/gpp/encoder/GppModelTest.java | 36 +- .../FibonacciIntegerRangeEncoderTest.java | 2 +- .../encoder/FixedIntegerRangeEncoderTest.java | 2 +- .../gpp/encoder/section/.UsNatV1Test.java.swp | Bin 16384 -> 0 bytes .../com/iab/gpp/encoder/section/UsMnTest.java | 171 +++++++ 13 files changed, 860 insertions(+), 192 deletions(-) create mode 100644 iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsMnField.java create mode 100644 iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsMn.java create mode 100644 iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMnCoreSegment.java create mode 100644 iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMnGpcSegment.java delete mode 100644 iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/.UsNatV1Test.java.swp create mode 100644 iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/UsMnTest.java diff --git a/README.md b/README.md index b4c3ee2b..fa9345d3 100644 --- a/README.md +++ b/README.md @@ -115,151 +115,312 @@ 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| - +| 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 array of size 12 | +| tcfeuv2 | 2 | PurposeConsents | Boolean array of size 24 | +| tcfeuv2 | 2 | PurposeLegitimateInterests | Boolean array of size 24 | +| tcfeuv2 | 2 | PurposeOneTreatment | Boolean | +| tcfeuv2 | 2 | PublisherCountryCode | 2 character country code | +| tcfeuv2 | 2 | VendorConsents | Integer array of variable size | +| tcfeuv2 | 2 | VendorLegitimateInterests | Integer array of variable size | +| tcfeuv2 | 2 | PublisherRestrictions | Integer array of variable size | +| tcfeuv2 | 2 | PublisherPurposesSegmentType | 3 bit int. Value is 3 | +| tcfeuv2 | 2 | PublisherConsents | Boolean array of size 24 | +| tcfeuv2 | 2 | PublisherLegitimateInterests | Boolean array of size 24 | +| tcfeuv2 | 2 | NumCustomPurposes | 6 bit int | +| tcfeuv2 | 2 | PublisherCustomConsents | Boolean array where size is set by the NumCustomPurposes field | +| tcfeuv2 | 2 | PublisherCustomLegitimateInterests | Boolean array where size is set by the NumCustomPurposes field | +| tcfeuv2 | 2 | VendorsAllowedSegmentType | 3 bit int. Value is 2 | +| tcfeuv2 | 2 | VendorsAllowed | Integer array of variable size | +| tcfeuv2 | 2 | VendorsDisclosedSegmentType | 3 bit int. Value is 1 | +| tcfeuv2 | 2 | VendorsDisclosed | Integer array 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 array of size 12 | +| tcfcav1 | 5 | PurposesExpressConsent | Boolean array of size 24 | +| tcfcav1 | 5 | PurposesImpliedConsent | Boolean array of size 24 | +| tcfcav1 | 5 | VendorExpressConsent | Integer array of variable size | +| tcfcav1 | 5 | VendorImpliedConsent | Integer array of variable size | +| tcfcav1 | 5 | PubRestrictions | RangeEntry list of variable size | +| tcfcav1 | 5 | PubPurposesSegmentType | 3 bit int. Value is 3 | +| tcfcav1 | 5 | PubPurposesExpressConsent | Boolean array of size 24 | +| tcfcav1 | 5 | PubPurposesImpliedConsent | Boolean array of size 24 | +| tcfcav1 | 5 | NumCustomPurposes | 6 bit int | +| tcfcav1 | 5 | CustomPurposesExpressConsent | Boolean array where size is set by the NumCustomPurposes field | +| tcfcav1 | 5 | CustomPurposesImpliedConsent | Boolean array 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 array of size 16. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | KnownChildSensitiveDataConsents | 2 bit int array of size 3. 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 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 array of size 9. 0=Not applicable, 1=Yes, 2=No | +| usca | 8 | KnownChildSensitiveDataConsents | 2 bit int array 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 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 array 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 array 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. Deafult 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 array 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 array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usct | 12 | KnownChildSensitiveDataConsents | 2 bit int array 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 is true | +| usct | 12 | Gpc | Boolean | +| usfl | 13 | Version | 6 bit int. Value is 1 | +| usfl | 13 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | KnownChildSensitiveDataConsents | 2 bit int array of size 3. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | Version | 6 bit int. Value is 1 | +| usmt | 14 | SharingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | KnownChildSensitiveDataConsents | 2 bit int array of size 3. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | GpcSegmentType | 2 bit int. Value is 1 | +| usmt | 14 | GpcSegmentIncluded | Boolean. Default is true | +| usmt | 14 | Gpc | Boolean | +| usor | 15 | Version | 6 bit int. Value is 1 | +| usor | 15 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | SensitiveDataProcessing | 2 bit int array of size 11. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | KnownChildSensitiveDataConsents | 2 bit int array of size 3. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | GpcSegmentType | 2 bit int. Value is 1 | +| usor | 15 | GpcSegmentIncluded | Boolean. Default is true | +| usor | 15 | Gpc | Boolean | +| ustx | 16 | Version | 6 bit int. Value is 1 | +| ustx | 16 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | GpcSegmentType | 2 bit int. Value is 1 | +| ustx | 16 | GpcSegmentIncluded | Boolean. Default is true | +| ustx | 16 | Gpc | Boolean | +| usde | 17 | Version | 6 bit int. Value is 1 | +| usde | 17 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | SensitiveDataProcessing | 2 bit int array of size 9. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | KnownChildSensitiveDataConsents | 2 bit int array of size 5. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | GpcSegmentType | 2 bit int. Value is 1 | +| usde | 17 | GpcSegmentIncluded | Boolean. Default is true | +| usde | 17 | Gpc | Boolean | +| usia | 18 | Version | 6 bit int. Value is 1 | +| usia | 18 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | SensitiveDataOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | GpcSegmentType | 2 bit int. Value is 1 | +| usia | 18 | GpcSegmentIncluded | Boolean. Default is true | +| usia | 18 | Gpc | Boolean | +| usne | 19 | Version | 6 bit int. Value is 1 | +| usne | 19 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | GpcSegmentType | 2 bit int. Value is 1 | +| usne | 19 | GpcSegmentIncluded | Boolean. Default is true | +| usne | 19 | Gpc | Boolean | +| usnh | 20 | Version | 6 bit int. Value is 1 | +| usnh | 20 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | KnownChildSensitiveDataConsents | 2 bit int array of size 3. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | GpcSegmentType | 2 bit int. Value is 1 | +| usnh | 20 | GpcSegmentIncluded | Boolean. Default is true | +| usnh | 20 | Gpc | Boolean | +| usnj | 21 | Version | 6 bit int. Value is 1 | +| usnj | 21 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | SensitiveDataProcessing | 2 bit int array of size 10. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | KnownChildSensitiveDataConsents | 2 bit int array of size 5. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | GpcSegmentType | 2 bit int. Value is 1 | +| usnj | 21 | GpcSegmentIncluded | Boolean. Default is true | +| usnj | 21 | Gpc | Boolean | +| ustn | 22 | Version | 6 bit int. Value is 1 | +| ustn | 22 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | GpcSegmentType | 2 bit int. Value is 1 | +| ustn | 22 | GpcSegmentIncluded | Boolean. Default is true | +| ustn | 22 | Gpc | Boolean | +| usmn | 23 | Version | 6 bit int. Value is 1 | +| usmn | 23 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmn | 23 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmn | 23 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmn | 23 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmn | 23 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmn | 23 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usmn | 23 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmn | 23 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmn | 23 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmn | 23 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmn | 23 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmn | 23 | GpcSegmentType | 2 bit int. Value is 1 | +| usmn | 23 | GpcSegmentIncluded | Boolean. Default is true | +| usmn | 23 | 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/src/main/java/com/iab/gpp/encoder/GppModel.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/GppModel.java index b4f8cba3..2eef8aa5 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 @@ -10,28 +10,7 @@ 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.section.EncodableSection; -import com.iab.gpp.encoder.section.HeaderV1; -import com.iab.gpp.encoder.section.Sections; -import com.iab.gpp.encoder.section.TcfCaV1; -import com.iab.gpp.encoder.section.TcfEuV2; -import com.iab.gpp.encoder.section.UsCa; -import com.iab.gpp.encoder.section.UsCo; -import com.iab.gpp.encoder.section.UsCt; -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.UsMt; -import com.iab.gpp.encoder.section.UsNat; -import com.iab.gpp.encoder.section.UsNe; -import com.iab.gpp.encoder.section.UsNh; -import com.iab.gpp.encoder.section.UsNj; -import com.iab.gpp.encoder.section.UsOr; -import com.iab.gpp.encoder.section.UsTn; -import com.iab.gpp.encoder.section.UsTx; -import com.iab.gpp.encoder.section.UsUt; -import com.iab.gpp.encoder.section.UsVa; -import com.iab.gpp.encoder.section.UspV1; +import com.iab.gpp.encoder.section.*; public class GppModel { private Map sections = new HashMap<>(); @@ -119,6 +98,9 @@ public void setFieldValue(String sectionName, String fieldName, Object value) { } else if (sectionName.equals(UsTn.NAME)) { section = new UsTn(); this.sections.put(UsTn.NAME, section); + } else if (sectionName.equals(UsMn.NAME)) { + section = new UsMn(); + this.sections.put(UsMn.NAME, section); } } else { section = this.sections.get(sectionName); @@ -316,6 +298,10 @@ public UsTn getUsTnSection() { return (UsTn) getSection(UsTn.NAME); } + public UsMn getUsMnSection() { + return (UsMn) getSection(UsMn.NAME); + } + public List getSectionIds() { if (!this.decoded) { this.sections = this.decodeModel(this.encodedString); @@ -427,6 +413,9 @@ protected Map decodeModel(String str) { } else if (sectionIds.get(i).equals(UsTn.ID)) { UsTn section = new UsTn(encodedSections[i + 1]); sections.put(UsTn.NAME, section); + } else if (sectionIds.get(i).equals(UsMn.ID)) { + UsMn section = new UsMn(encodedSections[i + 1]); + sections.put(UsMn.NAME, section); } } } @@ -537,6 +526,9 @@ public void decodeSection(String sectionName, String encodedString) { }else if (sectionName.equals(UsTn.NAME)) { section = new UsTn(); this.sections.put(UsTn.NAME, section); + }else if (sectionName.equals(UsMn.NAME)) { + section = new UsMn(); + this.sections.put(UsMn.NAME, section); } } else { section = this.sections.get(sectionName); 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..c86f828f --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsMnField.java @@ -0,0 +1,48 @@ +package com.iab.gpp.encoder.field; + +import java.util.Arrays; +import java.util.List; + +public class UsMnField { + + public static String VERSION = "Version"; + public static String PROCESSING_NOTICE = "ProcessingNotice"; + public static String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; + public static String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; + public static String SALE_OPT_OUT = "SaleOptOut"; + public static String TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut"; + public static String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; + public static String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; + public static String ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent"; + public static String MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; + public static String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; + public static String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + + public static String GPC_SEGMENT_TYPE = "GpcSegmentType"; + public static String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded"; + public static String GPC = "Gpc"; + + //@formatter:off + public static List USMN_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { + 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 + }); + //@formatter:on + + //@formatter:off + public static List USMN_GPC_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { + UsMnField.GPC_SEGMENT_TYPE, + UsMnField.GPC + }); + //@formatter:on +} 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 index 976805d3..fb69587c 100644 --- 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 @@ -34,6 +34,7 @@ public class Sections { 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_ID_NAME_MAP.put(UsMn.ID, UsMn.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/UsMn.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsMn.java new file mode 100644 index 00000000..bb91f2a6 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsMn.java @@ -0,0 +1,143 @@ +package com.iab.gpp.encoder.section; + +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 java.util.ArrayList; +import java.util.List; + +public class UsMn extends AbstractLazilyEncodableSection { + + public static int ID = 23; + public static int VERSION = 1; + public static String NAME = "usmn"; + + public UsMn() { + super(); + } + + public UsMn(String encodedString) { + super(); + 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 List initializeSegments() { + List segments = new ArrayList<>(); + segments.add(new UsDeCoreSegment()); + segments.add(new UsDeGpcSegment()); + return segments; + } + + @Override + protected List decodeSection(String encodedString) { + List segments = initializeSegments(); + + if (encodedString != null && !encodedString.isEmpty()) { + String[] encodedSegments = encodedString.split("\\."); + + if (encodedSegments.length > 0) { + segments.get(0).decode(encodedSegments[0]); + } + + if (encodedSegments.length > 1) { + segments.get(1).setFieldValue(UsDeField.GPC_SEGMENT_INCLUDED, true); + segments.get(1).decode(encodedSegments[1]); + } else { + segments.get(1).setFieldValue(UsDeField.GPC_SEGMENT_INCLUDED, false); + } + } + + return segments; + } + + @Override + protected String encodeSection(List segments) { + List encodedSegments = new ArrayList<>(); + + if (!segments.isEmpty()) { + encodedSegments.add(segments.get(0).encode()); + if (segments.size() >= 2 && segments.get(1).getFieldValue(UsDeField.GPC_SEGMENT_INCLUDED).equals(true)) { + encodedSegments.add(segments.get(1).encode()); + } + } + + return String.join(".", encodedSegments); + } + + + public Integer getProcessingNotice() { + return (Integer) this.getFieldValue(UsDeField.PROCESSING_NOTICE); + } + + public Integer getSaleOptOutNotice() { + return (Integer) this.getFieldValue(UsDeField.SALE_OPT_OUT_NOTICE); + } + + public Integer getTargetedAdvertisingOptOutNotice() { + return (Integer) this.getFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE); + } + + public Integer getSaleOptOut() { + return (Integer) this.getFieldValue(UsDeField.SALE_OPT_OUT); + } + + 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); + } + + @SuppressWarnings("unchecked") + public List getKnownChildSensitiveDataConsents() { + return (List) this.getFieldValue(UsDeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); + } + + public Integer getAdditionalDataProcessingConsent() { + return (Integer) this.getFieldValue(UsDeField.ADDITIONAL_DATA_PROCESSING_CONSENT); + } + + public Integer getMspaCoveredTransaction() { + return (Integer) this.getFieldValue(UsDeField.MSPA_COVERED_TRANSACTION); + } + + public Integer getMspaOptOutOptionMode() { + return (Integer) this.getFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE); + } + + public Integer getMspaServiceProviderMode() { + return (Integer) this.getFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE); + } + + 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/segment/UsDeCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsDeCoreSegment.java index a011faa0..72953219 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsDeCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsDeCoreSegment.java @@ -11,7 +11,6 @@ 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.field.UsVaField; import com.iab.gpp.encoder.section.UsDe; public class UsDeCoreSegment extends AbstractLazilyEncodableSegment { @@ -61,7 +60,7 @@ protected EncodableBitStringFields initializeFields() { fields.put(UsDeField.SENSITIVE_DATA_PROCESSING, new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0, 0)) .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsVaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + 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, diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMnCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMnCoreSegment.java new file mode 100644 index 00000000..14a3beaf --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMnCoreSegment.java @@ -0,0 +1,98 @@ +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.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.UsMnField; +import com.iab.gpp.encoder.section.UsMn; + +import java.util.Arrays; +import java.util.List; +import java.util.function.Predicate; + +public class UsMnCoreSegment extends AbstractLazilyEncodableSegment { + + private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); + private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); + + public UsMnCoreSegment() { + super(); + } + + public UsMnCoreSegment(String encodedString) { + super(); + this.decode(encodedString); + } + + @Override + public List getFieldNames() { + return UsMnField.USMN_CORE_SEGMENT_FIELD_NAMES; + } + + @Override + protected EncodableBitStringFields initializeFields() { + Predicate nullableBooleanAsTwoBitIntegerValidator = (n -> n >= 0 && n <= 2); + Predicate nonNullableBooleanAsTwoBitIntegerValidator = (n -> n >= 1 && n <= 2); + Predicate> nullableBooleanAsTwoBitIntegerListValidator = (l -> { + for (int n : l) { + if (n < 0 || n > 2) { + return false; + } + } + return true; + }); + + EncodableBitStringFields fields = new EncodableBitStringFields(); + fields.put(UsMnField.VERSION, new EncodableFixedInteger(6, UsMn.VERSION)); + fields.put(UsMnField.PROCESSING_NOTICE, + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); + fields.put(UsMnField.SALE_OPT_OUT_NOTICE, + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); + fields.put(UsMnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); + fields.put(UsMnField.SALE_OPT_OUT, + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); + fields.put(UsMnField.TARGETED_ADVERTISING_OPT_OUT, + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); + fields.put(UsMnField.SENSITIVE_DATA_PROCESSING, + new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0, 0)) + .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); + fields.put(UsMnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0)) + .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); + fields.put(UsMnField.ADDITIONAL_DATA_PROCESSING_CONSENT, + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); + fields.put(UsMnField.MSPA_COVERED_TRANSACTION, + new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator)); + fields.put(UsMnField.MSPA_OPT_OUT_OPTION_MODE, + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); + fields.put(UsMnField.MSPA_SERVICE_PROVIDER_MODE, + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); + return fields; + } + + @Override + protected String encodeSegment(EncodableBitStringFields fields) { + String bitString = bitStringEncoder.encode(fields, getFieldNames()); + String encodedString = base64UrlEncoder.encode(bitString); + return encodedString; + } + + @Override + protected void decodeSegment(String encodedString, EncodableBitStringFields fields) { + if (encodedString == null || encodedString.isEmpty()) { + this.fields.reset(fields); + } + try { + String bitString = base64UrlEncoder.decode(encodedString); + bitStringEncoder.decode(bitString, getFieldNames(), fields); + } catch (Exception e) { + throw new DecodingException("Unable to decode UsMnCoreSegment '" + encodedString + "'", e); + } + } + +} diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMnGpcSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMnGpcSegment.java new file mode 100644 index 00000000..fbeb9df0 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMnGpcSegment.java @@ -0,0 +1,61 @@ +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.BitStringEncoder; +import com.iab.gpp.encoder.datatype.EncodableBoolean; +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.UsMnField; + +import java.util.List; + +public class UsMnGpcSegment extends AbstractLazilyEncodableSegment { + + private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); + private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); + + public UsMnGpcSegment() { + super(); + } + + public UsMnGpcSegment(String encodedString) { + super(); + this.decode(encodedString); + } + + @Override + public List getFieldNames() { + return UsMnField.USMN_GPC_SEGMENT_FIELD_NAMES; + } + + @Override + protected EncodableBitStringFields initializeFields() { + EncodableBitStringFields fields = new EncodableBitStringFields(); + fields.put(UsMnField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); + fields.put(UsMnField.GPC_SEGMENT_INCLUDED, new EncodableBoolean(true)); + fields.put(UsMnField.GPC, new EncodableBoolean(false)); + return fields; + } + + @Override + protected String encodeSegment(EncodableBitStringFields fields) { + String bitString = bitStringEncoder.encode(fields, getFieldNames()); + String encodedString = base64UrlEncoder.encode(bitString); + return encodedString; + } + + @Override + protected void decodeSegment(String encodedString, EncodableBitStringFields fields) { + if(encodedString == null || encodedString.isEmpty()) { + this.fields.reset(fields); + } + try { + String bitString = base64UrlEncoder.decode(encodedString); + bitStringEncoder.decode(bitString, getFieldNames(), fields); + } catch (Exception e) { + throw new DecodingException("Unable to decode UsMnGpcSegment '" + 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 d1890a59..6f1bc118 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 @@ -4,22 +4,11 @@ import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Arrays; + +import com.iab.gpp.encoder.field.*; 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.UsFlField; -import com.iab.gpp.encoder.field.UsMtField; -import com.iab.gpp.encoder.field.UsNatField; -import com.iab.gpp.encoder.field.UsOrField; -import com.iab.gpp.encoder.field.UsTxField; -import com.iab.gpp.encoder.field.UsUtField; -import com.iab.gpp.encoder.field.UsVaField; -import com.iab.gpp.encoder.field.UspV1Field; import com.iab.gpp.encoder.section.TcfCaV1; import com.iab.gpp.encoder.section.TcfEuV2; import com.iab.gpp.encoder.section.UsCa; @@ -28,6 +17,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; @@ -92,6 +82,7 @@ public void testEncodeDefaultAll() { Assertions.assertEquals(false, gppModel.hasSection(UsNh.NAME)); Assertions.assertEquals(false, gppModel.hasSection(UsNj.NAME)); Assertions.assertEquals(false, gppModel.hasSection(UsTn.NAME)); + Assertions.assertEquals(false, gppModel.hasSection(UsMn.NAME)); gppModel.setFieldValue(TcfEuV2.NAME, TcfEuV2Field.VERSION, TcfEuV2.VERSION); gppModel.setFieldValue(TcfEuV2.NAME, TcfCaV1Field.CREATED, utcDateTime); @@ -110,12 +101,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)); @@ -137,10 +129,11 @@ 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", + "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", gppString); } @@ -413,7 +406,7 @@ public void testDecodeDefaults() { @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 +428,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 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 f0cb813f..1cae6e34 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 @@ -102,6 +102,6 @@ public void testDecode8() { @Test public void testGiantRange() { String max = FibonacciIntegerEncoder.encode(FibonacciIntegerRangeEncoder.MAX_SIZE + 1); - Assertions.assertEquals(List.of(), FibonacciIntegerRangeEncoder.decode("000000000001111" + max)); + Assertions.assertEquals(new ArrayList<>(), FibonacciIntegerRangeEncoder.decode("000000000001111" + max)); } } 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 769763ea..b781cd4c 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 @@ -132,6 +132,6 @@ public void testDecode10() { @Test public void testGiantRange() { String max = FibonacciIntegerEncoder.encode(FibonacciIntegerRangeEncoder.MAX_SIZE + 1); - Assertions.assertEquals(List.of(), FixedIntegerRangeEncoder.decode("00000000000110000000000000001" + max)); + Assertions.assertEquals(new ArrayList<>(), FixedIntegerRangeEncoder.decode("00000000000110000000000000001" + max)); } } diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/.UsNatV1Test.java.swp b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/section/.UsNatV1Test.java.swp deleted file mode 100644 index 686ae751e38ab4870c28793ce259a9eb4aa5eaa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI3UyKt)9LI;hry!v4pz+1E@X(re%N<4{M8nc9N5l0G-MylQr0#9!?w0Fy*WK+M z|4Dez7@v$WknrLQ2@fR3m|%19M8uaAy;=NC9qd!@9K z$ZGm-)0{{YY*Vb7x>oHdb<#JOoHp$V$I^6~G_(O@sMP|{<+)*_@!4=>Nkac9+K)-*fZ;m`GY}z=? zHQ@?y1-JrS0j>a7fGfZi;0kaB9wG%?tB;&Qf0wg9o9umA+xr7{)Y*BfE&Xqn9+dy3 zE&V=A56Y>mf}oyzEd6y>?pj;=Uo3ryrEg&k4$9wU=})nAt1X?K=5Jg9t^iknE5H@t z3UCFu0$c&E09Sx3z!i8X70@b#Jc*v)@)pu~{vWL0uWumaNALr<3eEr*>;h}R_4P;x zSHNX(37iFIfDQUV0>r@+YGcqBUK=587hwl$-FaKqAc zZe19iPu^bawW-{bi59VYD&OWbJvDmul(N4Edm!W>7vUZycI=nL{d2fS0S9x^f%oim z-KeVFcQ;zpA8rxLq*vjl1FN1h$6|#Tla^__0``rI*kmqZ-#GKqwm9l7Kt$FGf9h+gX#$TBlKH8Xmf z-o?6WRKLu~A|0Jb-dE*zMgPJ{pd-m2vPBexVHXAu}?~h=H_Z)^rrbZE-qBG$r zGW)#VZ~f^=KkxPEngyR9mY#n*XEUF56L{wqw?`YFcx(6rNo{7li-Vkk2JZ zXLu(T>fFAXIbBPQ8`X+JYmVU>Q}kcjpEYXK3@C+b57mhw(y8O%E4pB>!ULpgHU^tk zqzV*v4bMVjyt=f*E|A{JYE{}>!B*Laj7h^Cc4%;oE-<)Z8RihP(W;&-&M9n9) { + new UsMn("z").getProcessingNotice(); + }); + } +} From 62a4b7b0749b5a3c80fde9384edceda8b942ff1e Mon Sep 17 00:00:00 2001 From: Chad Huff Date: Mon, 2 Feb 2026 10:54:19 -0700 Subject: [PATCH 2/2] Fix section references --- .../com/iab/gpp/encoder/section/UsMn.java | 44 +++++++++---------- .../gpp/encoder/segment/UsIaCoreSegment.java | 3 +- .../gpp/encoder/segment/UsNeCoreSegment.java | 3 +- .../gpp/encoder/segment/UsTxCoreSegment.java | 3 +- 4 files changed, 24 insertions(+), 29 deletions(-) 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 index bb91f2a6..995965e0 100644 --- 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 @@ -1,9 +1,7 @@ package com.iab.gpp.encoder.section; -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.field.UsMnField; +import com.iab.gpp.encoder.segment.*; import java.util.ArrayList; import java.util.List; @@ -41,8 +39,8 @@ public int getVersion() { @Override protected List initializeSegments() { List segments = new ArrayList<>(); - segments.add(new UsDeCoreSegment()); - segments.add(new UsDeGpcSegment()); + segments.add(new UsMnCoreSegment()); + segments.add(new UsMnGpcSegment()); return segments; } @@ -58,10 +56,10 @@ protected List decodeSection(String encodedString) { } if (encodedSegments.length > 1) { - segments.get(1).setFieldValue(UsDeField.GPC_SEGMENT_INCLUDED, true); + segments.get(1).setFieldValue(UsMnField.GPC_SEGMENT_INCLUDED, true); segments.get(1).decode(encodedSegments[1]); } else { - segments.get(1).setFieldValue(UsDeField.GPC_SEGMENT_INCLUDED, false); + segments.get(1).setFieldValue(UsMnField.GPC_SEGMENT_INCLUDED, false); } } @@ -74,7 +72,7 @@ protected String encodeSection(List segments) { if (!segments.isEmpty()) { encodedSegments.add(segments.get(0).encode()); - if (segments.size() >= 2 && segments.get(1).getFieldValue(UsDeField.GPC_SEGMENT_INCLUDED).equals(true)) { + if (segments.size() >= 2 && segments.get(1).getFieldValue(UsMnField.GPC_SEGMENT_INCLUDED).equals(true)) { encodedSegments.add(segments.get(1).encode()); } } @@ -84,60 +82,60 @@ protected String encodeSection(List segments) { public Integer getProcessingNotice() { - return (Integer) this.getFieldValue(UsDeField.PROCESSING_NOTICE); + return (Integer) this.getFieldValue(UsMnField.PROCESSING_NOTICE); } public Integer getSaleOptOutNotice() { - return (Integer) this.getFieldValue(UsDeField.SALE_OPT_OUT_NOTICE); + return (Integer) this.getFieldValue(UsMnField.SALE_OPT_OUT_NOTICE); } public Integer getTargetedAdvertisingOptOutNotice() { - return (Integer) this.getFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE); + return (Integer) this.getFieldValue(UsMnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE); } public Integer getSaleOptOut() { - return (Integer) this.getFieldValue(UsDeField.SALE_OPT_OUT); + return (Integer) this.getFieldValue(UsMnField.SALE_OPT_OUT); } public Integer getTargetedAdvertisingOptOut() { - return (Integer) this.getFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT); + return (Integer) this.getFieldValue(UsMnField.TARGETED_ADVERTISING_OPT_OUT); } @SuppressWarnings("unchecked") public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsDeField.SENSITIVE_DATA_PROCESSING); + return (List) this.getFieldValue(UsMnField.SENSITIVE_DATA_PROCESSING); } @SuppressWarnings("unchecked") public List getKnownChildSensitiveDataConsents() { - return (List) this.getFieldValue(UsDeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); + return (List) this.getFieldValue(UsMnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); } public Integer getAdditionalDataProcessingConsent() { - return (Integer) this.getFieldValue(UsDeField.ADDITIONAL_DATA_PROCESSING_CONSENT); + return (Integer) this.getFieldValue(UsMnField.ADDITIONAL_DATA_PROCESSING_CONSENT); } public Integer getMspaCoveredTransaction() { - return (Integer) this.getFieldValue(UsDeField.MSPA_COVERED_TRANSACTION); + return (Integer) this.getFieldValue(UsMnField.MSPA_COVERED_TRANSACTION); } public Integer getMspaOptOutOptionMode() { - return (Integer) this.getFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE); + return (Integer) this.getFieldValue(UsMnField.MSPA_OPT_OUT_OPTION_MODE); } public Integer getMspaServiceProviderMode() { - return (Integer) this.getFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE); + return (Integer) this.getFieldValue(UsMnField.MSPA_SERVICE_PROVIDER_MODE); } public Integer getGpcSegmentType() { - return (Integer) this.getFieldValue(UsDeField.GPC_SEGMENT_TYPE); + return (Integer) this.getFieldValue(UsMnField.GPC_SEGMENT_TYPE); } public Boolean getGpcSegmentIncluded() { - return (Boolean) this.getFieldValue(UsDeField.GPC_SEGMENT_INCLUDED); + return (Boolean) this.getFieldValue(UsMnField.GPC_SEGMENT_INCLUDED); } public Boolean getGpc() { - return (Boolean) this.getFieldValue(UsDeField.GPC); + return (Boolean) this.getFieldValue(UsMnField.GPC); } } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsIaCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsIaCoreSegment.java index 9cd9a917..aa3bd706 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsIaCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsIaCoreSegment.java @@ -11,7 +11,6 @@ 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.field.UsVaField; import com.iab.gpp.encoder.section.UsIa; public class UsIaCoreSegment extends AbstractLazilyEncodableSegment { @@ -63,7 +62,7 @@ protected EncodableBitStringFields initializeFields() { fields.put(UsIaField.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, + 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)); diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNeCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNeCoreSegment.java index 7a98c30f..626b9c93 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNeCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNeCoreSegment.java @@ -11,7 +11,6 @@ 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.field.UsVaField; import com.iab.gpp.encoder.section.UsNe; public class UsNeCoreSegment extends AbstractLazilyEncodableSegment { @@ -61,7 +60,7 @@ protected EncodableBitStringFields initializeFields() { fields.put(UsNeField.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, + 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)); diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTxCoreSegment.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTxCoreSegment.java index 53463d20..a983a2ce 100644 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTxCoreSegment.java +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTxCoreSegment.java @@ -11,7 +11,6 @@ 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.field.UsVaField; import com.iab.gpp.encoder.section.UsTx; public class UsTxCoreSegment extends AbstractLazilyEncodableSegment { @@ -61,7 +60,7 @@ protected EncodableBitStringFields initializeFields() { fields.put(UsTxField.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, + 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));