diff --git a/.github/workflows/main.yml b/.github/workflows/4.x-release.yml similarity index 97% rename from .github/workflows/main.yml rename to .github/workflows/4.x-release.yml index f40adc9e..95820f3d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/4.x-release.yml @@ -8,13 +8,13 @@ # GPG_PASSPHRASE - Passphrase for the GPG key # PAT - Personal access token with repo scope (for pushing commits/tags) # -name: IABGPP-Java Release +name: IABGPP-Java 4.X Release on: workflow_dispatch: inputs: version: - description: 'The release version (e.g., 3.x.x)' + description: 'The release version (e.g., 4.x.x)' required: true default: '' @@ -66,7 +66,7 @@ jobs: # Pull latest changes from master - name: Pull latest changes - run: git pull origin master + run: git pull origin 4.X # Set the release version in pom.xml - name: Set release version diff --git a/.github/workflows/main-workflow.yml b/.github/workflows/main-workflow.yml new file mode 100644 index 00000000..95820f3d --- /dev/null +++ b/.github/workflows/main-workflow.yml @@ -0,0 +1,109 @@ +# Release to Maven Central via Central Publisher Portal +# https://central.sonatype.org/publish/publish-portal-guide/ +# +# Required GitHub secrets (Settings → Secrets and variables → Actions): +# CENTRAL_TOKEN_USERNAME - Portal token username (from https://central.sonatype.com/usertoken) +# CENTRAL_TOKEN_PASSWORD - Portal token password (from same page; save on first view, cannot be retrieved later) +# GPG_SECRET_KEY - Armored GPG private key for signing +# GPG_PASSPHRASE - Passphrase for the GPG key +# PAT - Personal access token with repo scope (for pushing commits/tags) +# +name: IABGPP-Java 4.X Release + +on: + workflow_dispatch: + inputs: + version: + description: 'The release version (e.g., 4.x.x)' + required: true + default: '' + +jobs: + release: + runs-on: ubuntu-latest + steps: + # Checkout the repository with full history for tagging + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # Set up Java + - name: Set up Java + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '21' + + # Import GPG secret key for signing + - name: Import GPG key + run: | + echo "${{ secrets.GPG_SECRET_KEY }}" > secret_key.asc + gpg --import --no-tty --batch secret_key.asc || { echo "GPG import failed"; cat secret_key.asc; exit 1; } + rm -f secret_key.asc + + # Generate settings.xml with Central Publisher Portal token credentials + # Token from: https://central.sonatype.com/usertoken + - name: Create settings.xml + env: + CENTRAL_TOKEN_USERNAME: ${{ secrets.CENTRAL_TOKEN_USERNAME }} + CENTRAL_TOKEN_PASSWORD: ${{ secrets.CENTRAL_TOKEN_PASSWORD }} + run: | + mkdir -p ~/.m2 + cat > ~/.m2/settings.xml << EOF + + + + central + ${CENTRAL_TOKEN_USERNAME} + ${CENTRAL_TOKEN_PASSWORD} + + + + EOF + + # Pull latest changes from master + - name: Pull latest changes + run: git pull origin 4.X + + # Set the release version in pom.xml + - name: Set release version + run: mvn versions:set -DnewVersion=${{ github.event.inputs.version }} -DgenerateBackupPoms=false + + # Build and deploy to Central Publisher Portal (mvn deploy uploads bundle and publishes) + - name: Deploy release + run: | + echo "pinentry-mode loopback" > ~/.gnupg/gpg.conf + echo "use-agent" >> ~/.gnupg/gpg.conf + export GPG_TTY=$(tty || echo /dev/tty) + mvn clean deploy --settings ~/.m2/settings.xml -Dgpg.passphrase="${{ secrets.GPG_PASSPHRASE }}" -Prelease + + # Commit the release version and create a tag + - name: Commit and tag release + run: | + git config user.email "mayank@iabtechlab.com" + git config user.name "Mayank Mishra" + git add . + git commit -m "${{ github.event.inputs.version }}" + git tag "${{ github.event.inputs.version }}" + + # Set the next snapshot version + - name: Set next snapshot version + run: mvn versions:set -DnextSnapshot=true -DgenerateBackupPoms=false + + # Commit the snapshot version + - name: Commit snapshot version + run: | + NEW_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) + git add . + git commit -m "$NEW_VERSION" + + # Push commits and tags to GitHub + - name: Push changes + run: | + git status + git push; git push --tags + env: + GITHUB_TOKEN: ${{ secrets.PAT }} diff --git a/README.md b/README.md index fa9345d3..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,314 +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 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/pom.xml b/iabgpp-encoder/pom.xml index bf84bbbc..fbae54d6 100644 --- a/iabgpp-encoder/pom.xml +++ b/iabgpp-encoder/pom.xml @@ -7,7 +7,7 @@ com.iabgpp iabgpp-core - 3.2.6-SNAPSHOT + 4.0.0-RC1 iabgpp-encoder @@ -27,7 +27,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 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 2eef8aa5..22da774b 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,560 +1,380 @@ package com.iab.gpp.encoder; +import com.iab.gpp.encoder.datatype.IntegerSet; +import com.iab.gpp.encoder.error.DecodingException; +import com.iab.gpp.encoder.error.InvalidFieldException; +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.SlicedCharSequence; +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.UsMn; +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 java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -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.section.*; - -public class GppModel { - private Map sections = new HashMap<>(); - - private String encodedString; +import java.util.PrimitiveIterator; +import java.util.function.Supplier; + +public class GppModel extends AbstractEncodable { + + // NOTE: we generally 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<>(); + + // ADDING A NEW SECTION: + // register section constructors here and add get*Section() method below + 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); + } + } - 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); } - 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 = null; - if (!this.sections.containsKey(sectionName)) { - if (sectionName.equals(TcfCaV1.NAME)) { - section = new TcfCaV1(); - this.sections.put(TcfCaV1.NAME, section); - } else if (sectionName.equals(TcfEuV2.NAME)) { - section = new TcfEuV2(); - this.sections.put(TcfEuV2.NAME, section); - } else if (sectionName.equals(UspV1.NAME)) { - section = new UspV1(); - this.sections.put(UspV1.NAME, section); - } else if (sectionName.equals(UsNat.NAME)) { - section = new UsNat(); - this.sections.put(UsNat.NAME, section); - } else if (sectionName.equals(UsCa.NAME)) { - section = new UsCa(); - this.sections.put(UsCa.NAME, section); - } else if (sectionName.equals(UsVa.NAME)) { - section = new UsVa(); - this.sections.put(UsVa.NAME, section); - } else if (sectionName.equals(UsCo.NAME)) { - section = new UsCo(); - this.sections.put(UsCo.NAME, section); - } else if (sectionName.equals(UsUt.NAME)) { - section = new UsUt(); - this.sections.put(UsUt.NAME, section); - } else if (sectionName.equals(UsCt.NAME)) { - section = new UsCt(); - this.sections.put(UsCt.NAME, section); - } else if (sectionName.equals(UsFl.NAME)) { - section = new UsFl(); - this.sections.put(UsFl.NAME, section); - } else if (sectionName.equals(UsMt.NAME)) { - section = new UsMt(); - this.sections.put(UsMt.NAME, section); - } else if (sectionName.equals(UsOr.NAME)) { - section = new UsOr(); - this.sections.put(UsOr.NAME, section); - } else if (sectionName.equals(UsTx.NAME)) { - section = new UsTx(); - this.sections.put(UsTx.NAME, section); - } else if (sectionName.equals(UsDe.NAME)) { - section = new UsDe(); - this.sections.put(UsDe.NAME, section); - } else if (sectionName.equals(UsIa.NAME)) { - section = new UsIa(); - this.sections.put(UsIa.NAME, section); - } else if (sectionName.equals(UsNe.NAME)) { - section = new UsNe(); - this.sections.put(UsNe.NAME, section); - } else if (sectionName.equals(UsNh.NAME)) { - section = new UsNh(); - this.sections.put(UsNh.NAME, section); - } else if (sectionName.equals(UsNj.NAME)) { - section = new UsNj(); - this.sections.put(UsNj.NAME, section); - } 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); + private EncodableSection getOrCreateSection(Integer sectionId) { + EncodableSection section = this.sections.get(sectionId); + if (section == null) { + 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()); } - } else { - section = this.sections.get(sectionName); } + return section; + } + 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; - } - - if (this.sections.containsKey(sectionName)) { - return this.sections.get(sectionName).getFieldValue(fieldName); + public Object getFieldValue(int sectionId, FieldKey fieldName) { + EncodableSection field = getSection(sectionId); + if (field != null) { + return field.getFieldValue(fieldName); } else { return null; } } - 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; - } - - if (this.sections.containsKey(sectionName)) { - return this.sections.get(sectionName).hasField(fieldName); + public boolean hasField(int sectionId, FieldKey fieldName) { + EncodableSection field = getSection(sectionId); + if (field != null) { + return field.hasField(fieldName); } else { return false; } } - 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; - } - - if (this.sections.containsKey(sectionName)) { - return this.sections.get(sectionName); - } else { - return null; - } - } - - public void deleteSection(int sectionId) { - deleteSection(Sections.SECTION_ID_NAME_MAP.get(sectionId)); + public EncodableSection getSection(String sectionName) { + return getSection(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; - } + deleteSection(SECTION_NAME_TO_ID.get(sectionName)); + } - if (this.sections.containsKey(sectionName)) { - this.sections.remove(sectionName); - 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 UsMn getUsMnSection() { - return (UsMn) getSection(UsMn.NAME); + return (UsMn) getSection(UsMn.ID); } - public List getSectionIds() { - if (!this.decoded) { - this.sections = this.decodeModel(this.encodedString); - this.dirty = false; - this.decoded = true; - } - - List sectionIds = new ArrayList<>(); - for (int i = 0; i < Sections.SECTION_ORDER.size(); i++) { - String sectionName = Sections.SECTION_ORDER.get(i); - if (this.sections.containsKey(sectionName)) { - EncodableSection section = this.sections.get(sectionName); - sectionIds.add(section.getId()); - } - } - return sectionIds; - } - - protected String encodeModel(Map sections) { - List encodedSections = new ArrayList<>(); - List sectionIds = new ArrayList<>(); - for (int i = 0; i < Sections.SECTION_ORDER.size(); i++) { - String sectionName = Sections.SECTION_ORDER.get(i); - if (sections.containsKey(sectionName)) { - EncodableSection section = sections.get(sectionName); - encodedSections.add(section.encode()); - sectionIds.add(section.getId()); - } - } + public IntegerSet getSectionIds() { + ensureDecode(); + return 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.encode()); - - String encodedString = encodedSections.stream().collect(Collectors.joining("~")); - return encodedString; + 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()) { - String[] encodedSections = str.split("~"); - HeaderV1 header = new HeaderV1(encodedSections[0]); - sections.put(HeaderV1.NAME, header); - - @SuppressWarnings("unchecked") - List sectionIds = (List) header.getFieldValue("SectionIds"); - for (int i = 0; i < sectionIds.size(); i++) { - if (sectionIds.get(i).equals(TcfEuV2.ID)) { - TcfEuV2 section = new TcfEuV2(encodedSections[i + 1]); - sections.put(TcfEuV2.NAME, section); - } else if (sectionIds.get(i).equals(TcfCaV1.ID)) { - TcfCaV1 section = new TcfCaV1(encodedSections[i + 1]); - sections.put(TcfCaV1.NAME, section); - } else if (sectionIds.get(i).equals(UspV1.ID)) { - UspV1 section = new UspV1(encodedSections[i + 1]); - sections.put(UspV1.NAME, section); - } else if (sectionIds.get(i).equals(UsCa.ID)) { - UsCa section = new UsCa(encodedSections[i + 1]); - sections.put(UsCa.NAME, section); - } else if (sectionIds.get(i).equals(UsNat.ID)) { - UsNat section = new UsNat(encodedSections[i + 1]); - sections.put(UsNat.NAME, section); - } else if (sectionIds.get(i).equals(UsVa.ID)) { - UsVa section = new UsVa(encodedSections[i + 1]); - sections.put(UsVa.NAME, section); - } else if (sectionIds.get(i).equals(UsCo.ID)) { - UsCo section = new UsCo(encodedSections[i + 1]); - sections.put(UsCo.NAME, section); - } else if (sectionIds.get(i).equals(UsUt.ID)) { - UsUt section = new UsUt(encodedSections[i + 1]); - sections.put(UsUt.NAME, section); - } else if (sectionIds.get(i).equals(UsCt.ID)) { - UsCt section = new UsCt(encodedSections[i + 1]); - sections.put(UsCt.NAME, section); - } else if (sectionIds.get(i).equals(UsFl.ID)) { - UsFl section = new UsFl(encodedSections[i + 1]); - sections.put(UsFl.NAME, section); - } else if (sectionIds.get(i).equals(UsMt.ID)) { - UsMt section = new UsMt(encodedSections[i + 1]); - sections.put(UsMt.NAME, section); - } else if (sectionIds.get(i).equals(UsOr.ID)) { - UsOr section = new UsOr(encodedSections[i + 1]); - sections.put(UsOr.NAME, section); - } else if (sectionIds.get(i).equals(UsTx.ID)) { - UsTx section = new UsTx(encodedSections[i + 1]); - sections.put(UsTx.NAME, section); - } else if (sectionIds.get(i).equals(UsDe.ID)) { - UsDe section = new UsDe(encodedSections[i + 1]); - sections.put(UsDe.NAME, section); - } else if (sectionIds.get(i).equals(UsIa.ID)) { - UsIa section = new UsIa(encodedSections[i + 1]); - sections.put(UsIa.NAME, section); - } else if (sectionIds.get(i).equals(UsNe.ID)) { - UsNe section = new UsNe(encodedSections[i + 1]); - sections.put(UsNe.NAME, section); - } else if (sectionIds.get(i).equals(UsNh.ID)) { - UsNh section = new UsNh(encodedSections[i + 1]); - sections.put(UsNh.NAME, section); - } else if (sectionIds.get(i).equals(UsNj.ID)) { - UsNj section = new UsNj(encodedSections[i + 1]); - sections.put(UsNj.NAME, section); - } 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); + List encodedSections = SlicedCharSequence.split(str, '~'); + header.decode(encodedSections.get(0)); + + PrimitiveIterator.OfInt it = header.getSectionsIds().iterator(); + int i = 1; + while (it.hasNext()) { + 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) { - if (!this.decoded) { - this.sections = this.decodeModel(this.encodedString); - this.dirty = false; - this.decoded = true; - } + return encodeSection(SECTION_NAME_TO_ID.get(sectionName)); + } - if (this.sections.containsKey(sectionName)) { - return this.sections.get(sectionName).encode(); + public String encodeSection(int sectionId) { + EncodableSection section = getSection(sectionId); + if (section != null) { + return section.encode(); } else { return null; } } - 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; - } - - EncodableSection section = null; - if (!this.sections.containsKey(sectionName)) { - if (sectionName.equals(TcfEuV2.NAME)) { - section = new TcfEuV2(); - this.sections.put(TcfEuV2.NAME, section); - } else if (sectionName.equals(TcfCaV1.NAME)) { - section = new TcfCaV1(); - this.sections.put(TcfCaV1.NAME, section); - } else if (sectionName.equals(UspV1.NAME)) { - section = new UspV1(); - this.sections.put(UspV1.NAME, section); - } else if (sectionName.equals(UsNat.NAME)) { - section = new UsNat(); - this.sections.put(UsNat.NAME, section); - } else if (sectionName.equals(UsCa.NAME)) { - section = new UsCa(); - this.sections.put(UsCa.NAME, section); - } else if (sectionName.equals(UsVa.NAME)) { - section = new UsVa(); - this.sections.put(UsVa.NAME, section); - } else if (sectionName.equals(UsCo.NAME)) { - section = new UsCo(); - this.sections.put(UsCo.NAME, section); - } else if (sectionName.equals(UsUt.NAME)) { - section = new UsUt(); - this.sections.put(UsUt.NAME, section); - } else if (sectionName.equals(UsCt.NAME)) { - section = new UsCt(); - this.sections.put(UsCt.NAME, section); - } else if (sectionName.equals(UsFl.NAME)) { - section = new UsFl(); - this.sections.put(UsFl.NAME, section); - } else if (sectionName.equals(UsMt.NAME)) { - section = new UsMt(); - this.sections.put(UsMt.NAME, section); - } else if (sectionName.equals(UsOr.NAME)) { - section = new UsOr(); - this.sections.put(UsOr.NAME, section); - } else if (sectionName.equals(UsTx.NAME)) { - section = new UsTx(); - this.sections.put(UsTx.NAME, section); - }else if (sectionName.equals(UsDe.NAME)) { - section = new UsDe(); - this.sections.put(UsDe.NAME, section); - }else if (sectionName.equals(UsIa.NAME)) { - section = new UsIa(); - this.sections.put(UsIa.NAME, section); - }else if (sectionName.equals(UsNe.NAME)) { - section = new UsNe(); - this.sections.put(UsNe.NAME, section); - }else if (sectionName.equals(UsNh.NAME)) { - section = new UsNh(); - this.sections.put(UsNh.NAME, section); - }else if (sectionName.equals(UsNj.NAME)) { - section = new UsNj(); - this.sections.put(UsNj.NAME, section); - }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); - } + decodeSection(SECTION_NAME_TO_ID.get(sectionName), encodedString); + } + 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; } - + @Override + public void setDirty(boolean dirty) { + header.setDirty(dirty); + for (Integer sectionId : header.getSectionsIds()) { + EncodableSection section = sections.get(sectionId); + if (section != null) { + section.setDirty(dirty); + } + } + } } 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 a5434073..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,79 +1,97 @@ package com.iab.gpp.encoder.base64; -import java.util.Map; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import com.iab.gpp.encoder.datatype.encoder.FixedIntegerEncoder; +import com.iab.gpp.encoder.bitstring.BitSet; +import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; +import java.util.Arrays; public abstract class AbstractBase64UrlEncoder { - abstract protected String pad(String 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 String DICT = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; - // prettier-ignore - private static Map REVERSE_DICT = Stream - .of(new Object[][] {{'A', 0}, {'B', 1}, {'C', 2}, {'D', 3}, {'E', 4}, {'F', 5}, {'G', 6}, {'H', 7}, {'I', 8}, - {'J', 9}, {'K', 10}, {'L', 11}, {'M', 12}, {'N', 13}, {'O', 14}, {'P', 15}, {'Q', 16}, {'R', 17}, {'S', 18}, - {'T', 19}, {'U', 20}, {'V', 21}, {'W', 22}, {'X', 23}, {'Y', 24}, {'Z', 25}, {'a', 26}, {'b', 27}, {'c', 28}, - {'d', 29}, {'e', 30}, {'f', 31}, {'g', 32}, {'h', 33}, {'i', 34}, {'j', 35}, {'k', 36}, {'l', 37}, {'m', 38}, - {'n', 39}, {'o', 40}, {'p', 41}, {'q', 42}, {'r', 43}, {'s', 44}, {'t', 45}, {'u', 46}, {'v', 47}, {'w', 48}, - {'x', 49}, {'y', 50}, {'z', 51}, {'0', 52}, {'1', 53}, {'2', 54}, {'3', 55}, {'4', 56}, {'5', 57}, {'6', 58}, - {'7', 59}, {'8', 60}, {'9', 61}, {'-', 62}, {'_', 63}}) - .collect(Collectors.toMap(data -> (Character) data[0], data -> (Integer) data[1])); + private static final String DICT = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; - private static Pattern BITSTRING_VERIFICATION_PATTERN = Pattern.compile("^[0-1]*$", Pattern.CASE_INSENSITIVE); - private static Pattern BASE64URL_VERIFICATION_PATTERN = - Pattern.compile("^[A-Za-z0-9\\-_]*$", Pattern.CASE_INSENSITIVE); + private static final int REVERSE_DICT_SIZE = 128; + private static final int[] REVERSE_DICT = new int[REVERSE_DICT_SIZE]; - public String encode(String bitString) { - // should only be 0 or 1 - if (!BITSTRING_VERIFICATION_PATTERN.matcher(bitString).matches()) { - throw new EncodingException("Unencodable Base64Url '" + bitString + "'"); + static { + Arrays.fill(REVERSE_DICT, NO_SYMBOL); + for (int i = 0; i < DICT.length(); i++) { + REVERSE_DICT[DICT.charAt(i)] = i; } + } - bitString = pad(bitString); - - String str = ""; - - int index = 0; - while (index <= bitString.length() - 6) { - String s = bitString.substring(index, index + 6); - + public StringBuilder encode(BitString bitString) { + pad(bitString); + int length = bitString.length(); + StringBuilder str = new StringBuilder(length / BASE64_BITS); + while (bitString.hasRemaining()) { try { - int n = FixedIntegerEncoder.decode(s); - Character c = AbstractBase64UrlEncoder.DICT.charAt(n); - str += c; - index += 6; + int n = bitString.readInt(BASE64_BITS); + str.append(DICT.charAt(n)); } catch (DecodingException e) { throw new EncodingException("Unencodable Base64Url '" + bitString + "'"); } } - return str; } - public String decode(String str) { - // should contain only characters from the base64url set - if (!BASE64URL_VERIFICATION_PATTERN.matcher(str).matches()) { + public BitString decode(CharSequence str) { + 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 (length > limit) { + remainder(str, words, length, src, dst); + } + return new BitString(new BitSet(words), bitLength); + } catch (ArrayIndexOutOfBoundsException e) { throw new DecodingException("Undecodable Base64URL string"); } + } - String bitString = ""; - - for (int i = 0; i < str.length(); i++) { - char c = str.charAt(i); - Integer n = AbstractBase64UrlEncoder.REVERSE_DICT.get(c); - String s = FixedIntegerEncoder.encode(n, 6); - bitString += s; + 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 bitString; + 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 4ebd7be7..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,38 +1,33 @@ package com.iab.gpp.encoder.base64; -import java.util.Arrays; +import com.iab.gpp.encoder.bitstring.BitString; -public class CompressedBase64UrlEncoder extends AbstractBase64UrlEncoder { +public final class CompressedBase64UrlEncoder extends AbstractBase64UrlEncoder { + + private static final CompressedBase64UrlEncoder instance = new CompressedBase64UrlEncoder(); + + private CompressedBase64UrlEncoder() {} - private static CompressedBase64UrlEncoder instance = new CompressedBase64UrlEncoder(); - - private CompressedBase64UrlEncoder() { - - } - public static CompressedBase64UrlEncoder getInstance() { return instance; } - + @Override - protected String pad(String bitString) { - char[] chars1 = null; - if(bitString.length() % 8 > 0) { - chars1 = new char[8 - (bitString.length() % 8)]; - } else { - chars1 = new char[0]; + protected void pad(BitString bitString) { + int remainder = bitString.length() % 8; + if (remainder > 0) { + int padding = 8 - remainder; + for (int i = 0; i < padding; i++) { + bitString.writeBoolean(false); + } } - Arrays.fill(chars1, '0'); - - char[] chars2 = null; - if((bitString.length() + chars1.length) % 6 > 0) { - chars2 = new char[6 - ((bitString.length() + chars1.length) % 6)]; - } else { - chars2 = new char[0]; + + remainder = bitString.length() % 6; + if (remainder > 0) { + int padding = 6 - remainder; + for (int i = 0; i < padding; i++) { + bitString.writeBoolean(false); + } } - Arrays.fill(chars2, '0'); - - return bitString + new String(chars1) + new String(chars2); } - } 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 78ffe719..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 java.util.Arrays; +import com.iab.gpp.encoder.bitstring.BitString; -public class TraditionalBase64UrlEncoder extends AbstractBase64UrlEncoder { +public final class TraditionalBase64UrlEncoder extends AbstractBase64UrlEncoder { + + private static final TraditionalBase64UrlEncoder instance = new TraditionalBase64UrlEncoder(); + + private TraditionalBase64UrlEncoder() {} - private static TraditionalBase64UrlEncoder instance = new TraditionalBase64UrlEncoder(); - - private TraditionalBase64UrlEncoder() { - - } - public static TraditionalBase64UrlEncoder getInstance() { return instance; } - + @Override - protected String pad(String bitString) { - if(bitString.length() % 24 > 0) { - char[] chars = new char[24 - (bitString.length() % 24)]; - Arrays.fill(chars, '0'); - return bitString + new String(chars); - } else { - return 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.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 new file mode 100644 index 00000000..f876bd04 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitString.java @@ -0,0 +1,222 @@ +package com.iab.gpp.encoder.bitstring; + +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 final BitSet bitSet; + private int readIndex; + private int writeIndex; + + public BitString(BitSet bitSet, int length) { + this.bitSet = bitSet; + this.writeIndex = length; + } + + public BitString() { + this(new BitSet(), 0); + } + + public static final BitString of(String str) { + int length = str.length(); + BitString out = new BitString(new BitSet(length), 0); + for (int i = 0; i < length; i++) { + char c = str.charAt(i); + if (c == TRUE) { + out.writeBoolean(true); + } else if (c == FALSE) { + out.writeBoolean(false); + } else { + throw new DecodingException("Invalid bit string"); + } + } + return out; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(length()); + for (int i = 0; i < writeIndex; i++) { + sb.append(bitSet.get(i) ? TRUE : FALSE); + } + return sb.toString(); + } + + 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 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); + } + + // used for usnat v1 to v2 conversion, see note in UsNatCoreSegment + public int peekInt(int length) { + return bitSet.readInt(0, length); + } + + // 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); + } + } + + public long readLong(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.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; + } + } + } + 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"); + } + 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/BitStringEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/bitstring/BitStringEncoder.java deleted file mode 100644 index 12bcb182..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 class BitStringEncoder { - - private static BitStringEncoder instance = new BitStringEncoder(); - - private BitStringEncoder() { - - } - - public static BitStringEncoder getInstance() { - return instance; - } - - public String encode(EncodableBitStringFields fields, List fieldNames) { - String bitString = ""; - for (int i = 0; i < fieldNames.size(); i++) { - String fieldName = fieldNames.get(i); - if (fields.containsKey(fieldName)) { - AbstractEncodableBitStringDataType field = fields.get(fieldName); - bitString += field.encode(); - } else { - throw new EncodingException("Field not found: '" + fieldName + "'"); - } - } - - return bitString; - } - - public void decode(String bitString, List fieldNames, EncodableBitStringFields fields) { - int index = 0; - for (int i = 0; i < fieldNames.size(); i++) { - String fieldName = fieldNames.get(i); - if (fields.containsKey(fieldName)) { - AbstractEncodableBitStringDataType field = fields.get(fieldName); - try { - String substring = field.substring(bitString, index); - field.decode(substring); - index += substring.length(); - } catch (SubstringException e) { - if(field.getHardFailIfMissing()) { - throw new DecodingException("Unable to decode " + fieldName, e); - } else { - return; - } - } catch (Exception e) { - throw new DecodingException("Unable to decode " + fieldName, e); - } - } else { - throw new DecodingException("Field not found: '" + fieldName + "'"); - } - } - } -} 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..bbfbfea4 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/AbstractDirtyableBitStringDataType.java @@ -0,0 +1,33 @@ +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()); + } + + @Override + protected abstract boolean isPresent(T value); + + @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 07d9588c..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,57 +1,30 @@ package com.iab.gpp.encoder.datatype; -import java.util.Collection; +import com.iab.gpp.encoder.bitstring.BitString; +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.segment.EncodableSegment; import java.util.function.Predicate; -import java.util.stream.Collectors; -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 Predicate validator = null; - protected T value; +public abstract class AbstractEncodableBitStringDataType & FieldKey, T> + extends DataType { - protected AbstractEncodableBitStringDataType(boolean hardFailIfMissing) { - this.hardFailIfMissing = hardFailIfMissing; - } - - public AbstractEncodableBitStringDataType withValidator(Predicate validator) { - this.validator = validator; - return this; - } - - public boolean hasValue() { - return this.value != null; + protected AbstractEncodableBitStringDataType(String name, Predicate validator) { + super(name, validator); } - public T getValue() { - return this.value; + @Override + public final void encode( + BitString writer, Object[] values, int index, EncodableSegment segment) { + encode(writer, get(values, index), segment); } - @SuppressWarnings("unchecked") - public void setValue(Object value) { - T v = (T) value; - if (validator == null || validator.test(v)) { - this.value = v; - } else { - if (v instanceof Collection) { - throw new ValidationException("Invalid value '" - + ((Collection) v).stream().map(i -> i.toString()).collect(Collectors.joining(",")) + "'"); - } else { - throw new ValidationException("Invalid value '" + v + "'"); - } - } - - } + protected abstract void encode(BitString writer, T value, EncodableSegment segment); - public boolean getHardFailIfMissing() { - return this.hardFailIfMissing; + @Override + public final void decode( + BitString reader, Object[] values, int index, EncodableSegment segment) { + values[index] = decode(reader, segment); } - public abstract String encode(); - - public abstract void decode(String bitString); - - public abstract String substring(String bitString, int fromIndex) throws SubstringException; - + 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 8a0d2c07..e93944ee 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,7 +1,95 @@ package com.iab.gpp.encoder.datatype; -public interface DataType { - boolean hasValue(); - T getValue(); - void setValue(Object value); +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; + } + + @SuppressWarnings("unchecked") + public final boolean isPresent(Object[] values, int index) { + T value = (T) values[index]; + return value != null && isPresent(value); + } + + protected boolean isPresent(T value) { + return true; + } + + 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 699e0d26..f01470e5 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,110 +1,70 @@ package com.iab.gpp.encoder.datatype; -import java.util.ArrayList; -import java.util.List; -import com.iab.gpp.encoder.datatype.encoder.FixedIntegerEncoder; +import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.datatype.encoder.FixedIntegerRangeEncoder; -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 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; - protected EncodableArrayOfFixedIntegerRanges(int keyBitStringLength, int typeBitStringLength) { - super(true); + public EncodableArrayOfFixedIntegerRanges( + String name, int keyBitStringLength, int typeBitStringLength) { + super(name, null); this.keyBitStringLength = keyBitStringLength; this.typeBitStringLength = typeBitStringLength; } - public EncodableArrayOfFixedIntegerRanges(int keyBitStringLength, int typeBitStringLength, List value) { - super(true); - this.keyBitStringLength = keyBitStringLength; - this.typeBitStringLength = typeBitStringLength; - setValue(value); + @Override + public String toString() { + return name + "=N-ArrayOfRanges(" + keyBitStringLength + "," + typeBitStringLength + ")"; } - - public EncodableArrayOfFixedIntegerRanges(int keyBitStringLength, int typeBitStringLength, List value, boolean hardFailIfMissing) { - super(hardFailIfMissing); - this.keyBitStringLength = keyBitStringLength; - this.typeBitStringLength = typeBitStringLength; - setValue(value); + + @Override + protected DirtyableList initialize() { + return new DirtyableList<>(); } @Override - public String encode() { - try { - List entries = this.value; - - StringBuilder sb = new StringBuilder(); - sb.append(FixedIntegerEncoder.encode(entries.size(), 12)); - for (RangeEntry entry : entries) { - sb.append(FixedIntegerEncoder.encode(entry.getKey(), keyBitStringLength)) - .append(FixedIntegerEncoder.encode(entry.getType(), typeBitStringLength)) - .append(FixedIntegerRangeEncoder.encode(entry.getIds())); - } - - return sb.toString(); - } catch (Exception e) { - throw new EncodingException(e); - } + protected boolean isPresent(DirtyableList value) { + return !value.isEmpty(); } @Override - public void decode(String bitString) { - try { - List entries = new ArrayList<>(); - - int size = FixedIntegerEncoder.decode(bitString.substring(0, 12)); - int index = 12; - for (int i = 0; i < size; i++) { - int key = FixedIntegerEncoder.decode(bitString.substring(index, index + keyBitStringLength)); - index += keyBitStringLength; - - int type = FixedIntegerEncoder.decode(bitString.substring(index, index + typeBitStringLength)); - index += typeBitStringLength; - - String substring = new EncodableFixedIntegerRange().substring(bitString, index); - List ids = FixedIntegerRangeEncoder.decode(substring); - index += substring.length(); - - entries.add(new RangeEntry(key, type, ids)); - } - - this.value = entries; - } catch (Exception e) { - throw new DecodingException(e); + 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 String substring(String bitString, int fromIndex) throws SubstringException { - try { - StringBuilder sb = new StringBuilder(); - sb.append(bitString.substring(fromIndex, fromIndex + 12)); - - int size = FixedIntegerEncoder.decode(sb.toString()); - - int index = fromIndex + sb.length(); - for (int i = 0; i < size; i++) { - String keySubstring = bitString.substring(index, index + keyBitStringLength); - index += keySubstring.length(); - sb.append(keySubstring); - - String typeSubstring = bitString.substring(index, index + typeBitStringLength); - index += typeSubstring.length(); - sb.append(typeSubstring); - - String rangeSubstring = new EncodableFixedIntegerRange().substring(bitString, index); - index += rangeSubstring.length(); - sb.append(rangeSubstring); - } - - return sb.toString(); - } 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 340be3ab..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,46 +1,31 @@ package com.iab.gpp.encoder.datatype; -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.bitstring.BitString; +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.segment.EncodableSegment; -public class EncodableBoolean extends AbstractEncodableBitStringDataType { +public final class EncodableBoolean & FieldKey> + extends AbstractEncodableBitStringDataType { - protected EncodableBoolean() { - super(true); - } - - public EncodableBoolean(Boolean value) { - super(true); - setValue(value); - } + private final Boolean initial; - public EncodableBoolean(Boolean value, boolean hardFailIfMissing) { - super(hardFailIfMissing); - setValue(value); + public EncodableBoolean(String name, Boolean initial) { + super(name, null); + this.initial = initial; } - public String encode() { - try { - return BooleanEncoder.encode(this.value); - } catch (Exception e) { - throw new EncodingException(e); - } + @Override + protected Boolean initialize() { + return initial; } - public void decode(String 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 String substring(String 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 94d416a6..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableDataType.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -public interface EncodableDataType extends DataType { - String encode(); - - void decode(String 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 a96c46f4..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,47 +1,30 @@ package com.iab.gpp.encoder.datatype; -import java.time.ZonedDateTime; +import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.datatype.encoder.DatetimeEncoder; -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.time.Instant; -public class EncodableDatetime extends AbstractEncodableBitStringDataType { +public final class EncodableDatetime & FieldKey> + extends AbstractEncodableBitStringDataType { - protected EncodableDatetime() { - super(true); + public EncodableDatetime(String name) { + super(name, null); } - public EncodableDatetime(ZonedDateTime value) { - super(true); - setValue(value); + @Override + protected Instant initialize() { + return Instant.EPOCH; } - public EncodableDatetime(ZonedDateTime value, boolean hardFailIfMissing) { - super(hardFailIfMissing); - setValue(value); + @Override + protected void encode(BitString builder, Instant value, EncodableSegment segment) { + DatetimeEncoder.encode(builder, value); } - public String encode() { - try { - return DatetimeEncoder.encode(this.value); - } catch (Exception e) { - throw new EncodingException(e); - } - } - - public void decode(String bitString) { - try { - this.value = DatetimeEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } - } - - public String substring(String 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 3da64a15..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,51 +1,31 @@ package com.iab.gpp.encoder.datatype; -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.bitstring.BitString; +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.segment.EncodableSegment; -public 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 String encode() { - try { - return FibonacciIntegerEncoder.encode(this.value); - } catch (Exception e) { - throw new EncodingException(e); - } + @Override + protected Integer initialize() { + return initial; } - public void decode(String 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 String substring(String bitString, int fromIndex) throws SubstringException { - try { - int index = bitString.indexOf("11", 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 53ab2eb2..7ac2ffd2 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,70 +1,43 @@ package com.iab.gpp.encoder.datatype; -import java.util.ArrayList; -import java.util.List; -import java.util.TreeSet; +import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.datatype.encoder.FibonacciIntegerRangeEncoder; -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.Collection; -public class EncodableFibonacciIntegerRange extends AbstractEncodableBitStringDataType> { +public final class EncodableFibonacciIntegerRange & FieldKey> + extends AbstractDirtyableBitStringDataType { - protected EncodableFibonacciIntegerRange() { - super(true); + public EncodableFibonacciIntegerRange(String name) { + super(name, null); } - public EncodableFibonacciIntegerRange(List value) { - super(true); - setValue(value); - } - - public EncodableFibonacciIntegerRange(List value, boolean hardFailIfMissing) { - super(hardFailIfMissing); - setValue(value); - } - - public String encode() { - try { - return FibonacciIntegerRangeEncoder.encode(this.value); - } catch (Exception e) { - throw new EncodingException(e); - } + @Override + public IntegerSet initialize() { + return new IntegerSet(); } - public void decode(String bitString) { - try { - this.value = FibonacciIntegerRangeEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } + @Override + protected boolean isPresent(IntegerSet value) { + return !value.isEmpty(); } - public String substring(String bitString, int fromIndex) throws SubstringException { - try { - int count = FixedIntegerEncoder.decode(bitString.substring(fromIndex, fromIndex + 12)); - int index = fromIndex + 12; - for (int i = 0; i < count; i++) { - if (bitString.charAt(index) == '1') { - index = bitString.indexOf("11", bitString.indexOf("11", index + 1) + 2) + 2; - } else { - index = bitString.indexOf("11", 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) { - super.setValue(new ArrayList<>(new TreeSet<>((List) value))); + protected IntegerSet decode(BitString reader, EncodableSegment segment) { + return FibonacciIntegerRangeEncoder.decode(reader); } + @SuppressWarnings("unchecked") @Override - public List getValue() { - return new ArrayList<>(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 5e6890d9..a22eb31b 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,76 +1,51 @@ 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.datatype.encoder.FixedBitfieldEncoder; -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 class EncodableFixedBitfield extends AbstractEncodableBitStringDataType> { +public final class EncodableFixedBitfield & FieldKey> + extends AbstractDirtyableBitStringDataType { - private int numElements; + private final int numElements; - protected EncodableFixedBitfield(int numElements) { - super(true); + public EncodableFixedBitfield(String name, int numElements) { + super(name, null); this.numElements = numElements; } - protected EncodableFixedBitfield(int numElements, boolean hardFailIfMissing) { - super(hardFailIfMissing); - this.numElements = numElements; - } - - public EncodableFixedBitfield(List value) { - super(true); - this.numElements = value.size(); - setValue(value); - } - - public EncodableFixedBitfield(List value, boolean hardFailIfMissing) { - super(hardFailIfMissing); - this.numElements = value.size(); - setValue(value); + @Override + public String toString() { + return name + "=Bitfield(" + numElements + ")"; } - public String encode() { - try { - return FixedBitfieldEncoder.encode(this.value, this.numElements); - } catch (Exception e) { - throw new EncodingException(e); - } + @Override + protected IntegerSet initialize() { + return new IntegerSet(numElements); } - public void decode(String bitString) { - try { - this.value = FixedBitfieldEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } + @Override + protected boolean isPresent(IntegerSet value) { + return !value.isEmpty(); } - public String substring(String 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) { - List v = new ArrayList<>((List) value); - for (int i = v.size(); i < numElements; i++) { - v.add(false); - } - if (v.size() > numElements) { - v = v.subList(0, numElements); - } - super.setValue(v); + protected IntegerSet decode(BitString reader, EncodableSegment segment) { + return reader.readIntegerSet(this.numElements); } + @SuppressWarnings("unchecked") @Override - public List getValue() { - return new ArrayList<>(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 9fd25fb0..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,51 +1,44 @@ package com.iab.gpp.encoder.datatype; -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.bitstring.BitString; +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.segment.EncodableSegment; +import java.util.function.Predicate; -public 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); } - public EncodableFixedInteger(int bitStringLength, Integer value, boolean hardFailIfMissing) { - super(hardFailIfMissing); - this.bitStringLength = bitStringLength; - setValue(value); + @Override + public String toString() { + return name + "=Int(" + bitStringLength + ")"; } - public String encode() { - try { - return FixedIntegerEncoder.encode(this.value, this.bitStringLength); - } catch (Exception e) { - throw new EncodingException(e); - } + @Override + protected Integer initialize() { + return initial; } - public void decode(String 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 String substring(String 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 f491e5ee..a0ced76d 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,75 +1,61 @@ 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.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 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 EncodableFixedIntegerList(int elementBitStringLength, List value, boolean hardFailIfMissing) { - super(hardFailIfMissing); - this.elementBitStringLength = elementBitStringLength; - this.numElements = value.size(); - setValue(value); + @Override + protected FixedIntegerList initialize() { + return new FixedIntegerList(elementBitStringLength, numElements); } - public String encode() { - try { - return FixedIntegerListEncoder.encode(this.value, this.elementBitStringLength, this.numElements); - } catch (Exception e) { - throw new EncodingException(e); - } + @Override + protected boolean isPresent(FixedIntegerList value) { + return value.isPresent(); } - public void decode(String 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 String substring(String 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); + 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); } - if (v.size() > numElements) { - v = v.subList(0, numElements); - } - super.setValue(v); - } - - @Override - public List getValue() { - return new ArrayList<>(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 7fdbd5a8..51f37ffd 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,70 +1,43 @@ package com.iab.gpp.encoder.datatype; -import java.util.ArrayList; -import java.util.List; -import java.util.TreeSet; -import com.iab.gpp.encoder.datatype.encoder.FixedIntegerEncoder; +import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.datatype.encoder.FixedIntegerRangeEncoder; -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 class EncodableFixedIntegerRange extends AbstractEncodableBitStringDataType> { +public final class EncodableFixedIntegerRange & FieldKey> + extends AbstractDirtyableBitStringDataType { - protected EncodableFixedIntegerRange() { - super(true); + public EncodableFixedIntegerRange(String name) { + super(name, null); } - public EncodableFixedIntegerRange(List value) { - super(true); - setValue(value); - } - - public EncodableFixedIntegerRange(List value, boolean hardFailIfMissing) { - super(hardFailIfMissing); - setValue(value); - } - - public String encode() { - try { - return FixedIntegerRangeEncoder.encode(this.value); - } catch (Exception e) { - throw new EncodingException(e); - } + @Override + protected IntegerSet initialize() { + return new IntegerSet(); } - public void decode(String bitString) { - try { - this.value = FixedIntegerRangeEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } + @Override + protected boolean isPresent(IntegerSet value) { + return !value.isEmpty(); } - public String substring(String bitString, int fromIndex) throws SubstringException { - try { - int count = FixedIntegerEncoder.decode(bitString.substring(fromIndex, fromIndex + 12)); - int index = fromIndex + 12; - for (int i = 0; i < count; i++) { - if (bitString.charAt(index) == '1') { - 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) { - super.setValue(new ArrayList<>(new TreeSet<>((List) value))); + protected IntegerSet decode(BitString reader, EncodableSegment segment) { + return FixedIntegerRangeEncoder.decode(reader); } + @SuppressWarnings("unchecked") @Override - public List getValue() { - return new ArrayList<>(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 4cea9b48..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,51 +1,39 @@ package com.iab.gpp.encoder.datatype; +import com.iab.gpp.encoder.bitstring.BitString; 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 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); - } - - public EncodableFixedString(int stringLength, String value, boolean hardFailIfMissing) { - super(hardFailIfMissing); - this.stringLength = stringLength; - setValue(value); + @Override + public String toString() { + return name + "=String(" + stringLength + ")"; } - public String encode() { - try { - return FixedStringEncoder.encode(this.value, this.stringLength); - } catch (Exception e) { - throw new EncodingException(e); - } + @Override + protected String initialize() { + return initial; } - public void decode(String 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 String substring(String 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 cb1a0991..a0a05742 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,73 +1,47 @@ package com.iab.gpp.encoder.datatype; -import java.util.ArrayList; -import java.util.List; -import java.util.function.IntSupplier; +import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.datatype.encoder.FixedBitfieldEncoder; -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 com.iab.gpp.encoder.segment.SegmentValueProvider; +import java.util.Collection; -public class EncodableFlexibleBitfield extends AbstractEncodableBitStringDataType> { +public final class EncodableFlexibleBitfield & FieldKey> + extends AbstractDirtyableBitStringDataType { - private IntSupplier getLengthSupplier; + private final SegmentValueProvider getLengthSupplier; - protected EncodableFlexibleBitfield(IntSupplier getLengthSupplier) { - super(true); - this.getLengthSupplier = getLengthSupplier; + public EncodableFlexibleBitfield(String name, E key) { + super(name, null); + this.getLengthSupplier = new SegmentValueProvider<>(key); } - public EncodableFlexibleBitfield(IntSupplier getLengthSupplier, List value) { - super(true); - this.getLengthSupplier = getLengthSupplier; - this.setValue(value); - } - - public EncodableFlexibleBitfield(IntSupplier getLengthSupplier, List value, boolean hardFailIfMissing) { - super(hardFailIfMissing); - this.getLengthSupplier = getLengthSupplier; - this.setValue(value); - } - - public String encode() { - try { - return FixedBitfieldEncoder.encode(this.value, this.getLengthSupplier.getAsInt()); - } catch (Exception e) { - throw new EncodingException(e); - } + @Override + protected IntegerSet initialize() { + return new IntegerSet(); } - public void decode(String bitString) { - try { - this.value = FixedBitfieldEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } + @Override + protected boolean isPresent(IntegerSet value) { + return !value.isEmpty(); } - public String substring(String 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) { - int numElements = this.getLengthSupplier.getAsInt(); - List v = new ArrayList<>((List) value); - for (int i = v.size(); i < numElements; i++) { - v.add(false); - } - if (v.size() > numElements) { - v = v.subList(0, numElements); - } - super.setValue(v); + protected IntegerSet decode(BitString reader, EncodableSegment segment) { + return reader.readIntegerSet(getLengthSupplier.extract(segment)); } + @SuppressWarnings("unchecked") @Override - public List getValue() { - return new ArrayList<>(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 2e49855f..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/EncodableOptimizedFibonacciRange.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -import java.util.ArrayList; -import java.util.List; -import java.util.TreeSet; -import com.iab.gpp.encoder.datatype.encoder.FixedIntegerEncoder; -import com.iab.gpp.encoder.datatype.encoder.OptimizedFibonacciRangeEncoder; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.error.EncodingException; - -public 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 String encode() { - try { - return OptimizedFibonacciRangeEncoder.encode(this.value); - } catch (Exception e) { - throw new EncodingException(e); - } - } - - public void decode(String bitString) { - try { - this.value = OptimizedFibonacciRangeEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } - } - - public String substring(String bitString, int fromIndex) throws SubstringException { - try { - int max = FixedIntegerEncoder.decode(bitString.substring(fromIndex, fromIndex + 16)); - if (bitString.charAt(fromIndex + 16) == '1') { - return (bitString.substring(fromIndex, fromIndex + 17) - + new EncodableFibonacciIntegerRange().substring(bitString, fromIndex + 17)); - } else { - return bitString.substring(fromIndex, fromIndex + 17 + max); - } - } catch (Exception e) { - throw new SubstringException(e); - } - } - - @SuppressWarnings("unchecked") - @Override - public void setValue(Object value) { - super.setValue(new ArrayList<>(new TreeSet<>((List) value))); - } - - @Override - public List getValue() { - return new ArrayList<>(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 57f4b8e9..b333b244 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,68 +1,43 @@ package com.iab.gpp.encoder.datatype; -import java.util.ArrayList; -import java.util.List; -import java.util.TreeSet; -import com.iab.gpp.encoder.datatype.encoder.FixedIntegerEncoder; +import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.datatype.encoder.OptimizedFixedRangeEncoder; -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 EncodableOptimizedFixedRange & FieldKey> + extends AbstractDirtyableBitStringDataType { -public class EncodableOptimizedFixedRange extends AbstractEncodableBitStringDataType> { - - protected EncodableOptimizedFixedRange() { - super(true); - } - - public EncodableOptimizedFixedRange(List value) { - super(true); - setValue(value); - } - - public EncodableOptimizedFixedRange(List value, boolean hardFailIfMissing) { - super(hardFailIfMissing); - setValue(value); + public EncodableOptimizedFixedRange(String name) { + super(name, null); } - public String encode() { - try { - return OptimizedFixedRangeEncoder.encode(this.value); - } catch (Exception e) { - throw new EncodingException(e); - } + @Override + protected IntegerSet initialize() { + return new IntegerSet(); } - public void decode(String bitString) { - try { - this.value = OptimizedFixedRangeEncoder.decode(bitString); - } catch (Exception e) { - throw new DecodingException(e); - } + @Override + protected boolean isPresent(IntegerSet value) { + return !value.isEmpty(); } - public String substring(String bitString, int fromIndex) throws SubstringException { - try { - int max = FixedIntegerEncoder.decode(bitString.substring(fromIndex, fromIndex + 16)); - if (bitString.charAt(fromIndex + 16) == '1') { - return bitString.substring(fromIndex, fromIndex + 17) - + new EncodableFixedIntegerRange().substring(bitString, fromIndex + 17); - } 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) { - super.setValue(new ArrayList<>(new TreeSet<>((List) value))); + protected IntegerSet decode(BitString reader, EncodableSegment segment) { + return OptimizedFixedRangeEncoder.decode(reader); } + @SuppressWarnings("unchecked") @Override - public List getValue() { - return new ArrayList<>(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..99778d41 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/FixedIntegerList.java @@ -0,0 +1,102 @@ +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); + } + + public boolean isPresent() { + int start = offset; + int end = start + elementBitStringLength * numElements; + for (int i = start; i < end; i++) { + if (bitSet.get(i)) { + return true; + } + } + return false; + } + + @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/IntegerCache.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/IntegerCache.java new file mode 100644 index 00000000..79b9aa8b --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/IntegerCache.java @@ -0,0 +1,22 @@ +package com.iab.gpp.encoder.datatype; + +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; + } + } + + static Integer valueOf(int i) { + 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/IntegerSet.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/IntegerSet.java new file mode 100644 index 00000000..19c02996 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/IntegerSet.java @@ -0,0 +1,222 @@ +package com.iab.gpp.encoder.datatype; + +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.stream.IntStream; +import java.util.stream.StreamSupport; + +/** + * 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; + + private boolean dirty; + private final BitSet bitSet; + private final int from; + private final int to; + private final int adjustment; + + public IntegerSet(BitSet bitSet, int from, int to, int adjustment) { + this.bitSet = bitSet; + this.from = from; + this.to = to; + this.adjustment = adjustment; + } + + public IntegerSet(int limit) { + this(new BitSet(limit), 0, limit, 0); + } + + public IntegerSet() { + this(new BitSet(), 0, MAX_COLLECTION_SIZE, 0); + } + + @Override + public int size() { + OfInt it = iterator(); + int count = 0; + while (it.hasNext()) { + it.next(); + count++; + } + return count; + } + + private int getOffset(int value) { + int offset = from - adjustment + value; + if (offset < from) { + throw new IndexOutOfBoundsException("Negative index provided"); + } + return offset; + } + + @Override + public void clear() { + dirty = true; + bitSet.clear(from, to); + } + + @Override + public boolean isEmpty() { + return bitSet.nextSetBit(from) == -1; + } + + public boolean containsInt(int value) { + if (value < adjustment) { + return false; + } + int offset = getOffset(value); + return offset < to && bitSet.get(offset); + } + + @Override + public OfInt iterator() { + return new OfInt() { + int cursor = bitSet.nextSetBit(from); + + @Override + public boolean hasNext() { + return cursor < to && cursor != -1; + } + + @Override + public Integer next() { + return IntegerCache.valueOf(nextInt()); + } + + @Override + public int nextInt() { + if (!this.hasNext()) { + throw new NoSuchElementException(); + } + int next = cursor; + cursor = bitSet.nextSetBit(cursor + 1); + return next - from + adjustment; + } + }; + } + + @Override + public Spliterator.OfInt spliterator() { + return Spliterators.spliteratorUnknownSize( + iterator(), + Spliterator.ORDERED | Spliterator.DISTINCT | Spliterator.IMMUTABLE | Spliterator.NONNULL); + } + + public IntStream intStream() { + return StreamSupport.intStream(spliterator(), false); + } + + private static final void logOutOfRange(int value) { + LOGGER.warning("Exceeding IntegerBitSet.MAX_COLLECTION_SIZE: " + value); + } + + public void addRange(int start, int end) { + if (end < start) { + throw new IllegalArgumentException("Negative length range"); + } + int realStart = getOffset(start); + int realEnd = getOffset(end); + if (realStart >= to) { + logOutOfRange(start); + return; + } + if (realEnd > to) { + logOutOfRange(end); + realEnd = to; + } + dirty = true; + bitSet.set(realStart, realEnd); + } + + public boolean addInt(int value) { + int offset = getOffset(value); + if (offset >= to) { + logOutOfRange(value); + return false; + } + boolean present = !bitSet.set(offset, true); + dirty = true; + return present; + } + + public boolean removeInt(int value) { + int offset = getOffset(value); + if (offset >= to) { + logOutOfRange(value); + return false; + } + 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; + } + 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/RangeEntry.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/RangeEntry.java index 0237ed18..1bfc6ce3 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,14 +1,23 @@ package com.iab.gpp.encoder.datatype; -import java.util.List; +import java.util.Collection; -public class RangeEntry { +public final class RangeEntry implements Dirtyable { + private boolean dirty; private int key; private int type; - private List ids; + private final IntegerSet ids; - public RangeEntry(int key, int type, List ids) { + public RangeEntry(int key, int type, Collection ids) { + super(); + this.key = key; + this.type = type; + this.ids = new IntegerSet(); + this.ids.addAll(ids); + } + + RangeEntry(int key, int type, IntegerSet ids) { super(); this.key = key; this.type = type; @@ -20,6 +29,7 @@ public int getKey() { } public void setKey(int key) { + this.dirty = true; this.key = key; } @@ -28,15 +38,33 @@ public int getType() { } public void setType(int type) { + this.dirty = true; this.type = type; } - public List getIds() { + public IntegerSet getIds() { return ids; } - public void setIds(List ids) { - this.ids = ids; + 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); + } + + @Override + public String toString() { + return "{key=" + key + ", type=" + type + ", ids=" + ids + "}"; + } } 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 new file mode 100644 index 00000000..62d3af2f --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/UnencodableBoolean.java @@ -0,0 +1,31 @@ +package com.iab.gpp.encoder.datatype; + +import com.iab.gpp.encoder.bitstring.BitString; +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.segment.EncodableSegment; + +public final class UnencodableBoolean & FieldKey> + extends AbstractEncodableBitStringDataType { + + private final Boolean initial; + + public UnencodableBoolean(String name, Boolean initial) { + super(name, null); + this.initial = initial; + } + + @Override + protected Boolean initialize() { + return initial; + } + + @Override + protected void encode(BitString writer, Boolean value, EncodableSegment segment) { + // pass + } + + @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 4ef9c256..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,49 +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 class UnencodableCharacter implements DataType { +public final class UnencodableCharacter & FieldKey> + extends DataType { - 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 UnencodableCharacter(String name, Character initial, Predicate validator) { + super(name, validator); + this.initial = initial; } - public void setValidator(Predicate validator) { - this.validator = validator; - } - @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; - } else { - throw new ValidationException("Invalid value '" + c + "'"); - } - } - } 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 60dcddfd..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,49 +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 class UnencodableInteger implements DataType { +public final class UnencodableInteger & FieldKey> extends DataType { - 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 UnencodableInteger(String name, Integer initial) { + super(name, null); + this.initial = initial; } - public void setValidator(Predicate validator) { - this.validator = validator; - } - @Override - public boolean hasValue() { - return this.value != null; + protected Integer initialize() { + return initial; } - - @Override - public Integer getValue() { - return this.value; - } - - @Override - public void setValue(Object value) { - Integer i = (Integer)value; - if(validator.test(i)) { - this.value = i; - } else { - throw new ValidationException("Invalid value '" + i + "'"); - } - } - } diff --git a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/ArrayOfRangesEntryEncoder.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/ArrayOfRangesEntryEncoder.java deleted file mode 100644 index de1449b3..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/ArrayOfRangesEntryEncoder.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.iab.gpp.encoder.datatype.encoder; - -import java.util.regex.Pattern; -import com.iab.gpp.encoder.error.DecodingException; - -public class ArrayOfRangesEntryEncoder { - - private static Pattern BITSTRING_VERIFICATION_PATTERN = Pattern.compile("^[0-1]*$", Pattern.CASE_INSENSITIVE); - - public static String encode(long value, int bitStringLength) { - String bitString = ""; - while (value > 0) { - if ((value & 1) == 1) { - bitString = "1" + bitString; - } else { - bitString = "0" + bitString; - } - value = value >> 1; - } - - while (bitString.length() < bitStringLength) { - bitString = "0" + bitString; - } - - return bitString; - } - - public static long decode(String bitString) throws DecodingException { - if (!BITSTRING_VERIFICATION_PATTERN.matcher(bitString).matches()) { - throw new DecodingException("Undecodable FixedLong '" + bitString + "'"); - } - - long value = 0; - - for (int i = 0; i < bitString.length(); i++) { - if (bitString.charAt(bitString.length() - (i + 1)) == '1') { - value += 1L << i; - } - } - - return value; - } -} 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 20e6cbd0..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/BooleanEncoder.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.iab.gpp.encoder.datatype.encoder; - -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.error.EncodingException; - -public class BooleanEncoder { - public static String encode(Boolean value) { - if (value == true) { - return "1"; - } else if (value == false) { - return "0"; - } else { - throw new EncodingException("Unencodable Boolean '" + value + "'"); - } - } - - public static boolean decode(String bitString) { - if (bitString.equals("1")) { - return true; - } else if (bitString.equals("0")) { - return false; - } else { - throw new DecodingException("Undecodable Boolean '" + bitString + "'"); - } - } -} 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 77f6f344..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,27 +1,22 @@ package com.iab.gpp.encoder.datatype.encoder; -import java.time.Instant; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.util.regex.Pattern; +import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.error.DecodingException; +import java.time.Instant; public class DatetimeEncoder { - private static Pattern BITSTRING_VERIFICATION_PATTERN = Pattern.compile("^[0-1]*$", Pattern.CASE_INSENSITIVE); - public static String encode(ZonedDateTime value) { + private DatetimeEncoder() {} + + public static void encode(BitString builder, Instant value) { if (value != null) { - return FixedLongEncoder.encode(value.toInstant().toEpochMilli() / 100, 36); + builder.writeLong(value.toEpochMilli() / 100, 36); } else { - return FixedLongEncoder.encode(0, 36); + builder.writeLong(0, 36); } } - public static ZonedDateTime decode(String bitString) throws DecodingException { - if (!BITSTRING_VERIFICATION_PATTERN.matcher(bitString).matches() || bitString.length() != 36) { - throw new DecodingException("Undecodable Datetime '" + bitString + "'"); - } - - return ZonedDateTime.ofInstant(Instant.ofEpochMilli(FixedLongEncoder.decode(bitString) * 100L), ZoneId.of("UTC")); + 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 281b27da..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,72 +1,22 @@ package com.iab.gpp.encoder.datatype.encoder; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Pattern; -import com.iab.gpp.encoder.error.DecodingException; - public class FibonacciIntegerEncoder { - private static Pattern BITSTRING_VERIFICATION_PATTERN = Pattern.compile("^[0-1]*$", Pattern.CASE_INSENSITIVE); - - public static String encode(int value) { - List fib = new ArrayList(); - if (value >= 1) { - fib.add(1); - - if (value >= 2) { - fib.add(2); - - int i = 2; - while (value >= fib.get(i - 1) + fib.get(i - 2)) { - fib.add(fib.get(i - 1) + fib.get(i - 2)); - i++; - } - } - } - - String bitString = "1"; - for (int i = fib.size() - 1; i >= 0; i--) { - int f = fib.get(i); - if (value >= f) { - bitString = "1" + bitString; - value -= f; - } else { - bitString = "0" + bitString; - } - } - - return bitString; - } + private FibonacciIntegerEncoder() {} - public static int decode(String bitString) throws DecodingException { - // enforce a length restriction to avoid overflows - // 2^16 has a bit string length of 24 - if (bitString.length() > 24) { - throw new DecodingException("FibonacciInteger too long"); - } - if (!BITSTRING_VERIFICATION_PATTERN.matcher(bitString).matches() || bitString.length() < 2 - || bitString.indexOf("11") != bitString.length() - 2) { - throw new DecodingException("Undecodable FibonacciInteger '" + bitString + "'"); - } + // this is the length of the longest fibonacci encoded string of all 1's + // which does not overflow a 32-bit integer + public static final int FIBONACCI_LIMIT = 42; + public static final int[] FIBONACCI_NUMBERS = new int[FIBONACCI_LIMIT]; - int value = 0; - - List fib = new ArrayList<>(); - for (int i = 0; i < bitString.length() - 1; i++) { + static { + for (int i = 0; i < FIBONACCI_LIMIT; i++) { if (i == 0) { - fib.add(1); + FIBONACCI_NUMBERS[i] = 1; } else if (i == 1) { - fib.add(2); + FIBONACCI_NUMBERS[i] = 2; } else { - fib.add(fib.get(i - 1) + fib.get(i - 2)); - } - } - - for (int i = 0; i < bitString.length() - 1; i++) { - if (bitString.charAt(i) == '1') { - value += fib.get(i); + FIBONACCI_NUMBERS[i] = FIBONACCI_NUMBERS[i - 1] + FIBONACCI_NUMBERS[i - 2]; } } - return value; } } 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 daafa795..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,100 +1,70 @@ package com.iab.gpp.encoder.datatype.encoder; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.logging.Logger; -import java.util.regex.Pattern; +import com.iab.gpp.encoder.bitstring.BitString; +import com.iab.gpp.encoder.datatype.IntegerSet; import com.iab.gpp.encoder.error.DecodingException; +import java.util.Collection; public class FibonacciIntegerRangeEncoder { + private FibonacciIntegerRangeEncoder() {} - private static final Logger LOGGER = Logger.getLogger(FibonacciIntegerRangeEncoder.class.getName()); - // NOTE: This is a value roughly the 2x the size of this list - // https://tools.iabtechlab.com/transparencycenter/explorer/business/gpp - static final int MAX_SIZE = 8192; - private static Pattern BITSTRING_VERIFICATION_PATTERN = Pattern.compile("^[0-1]*$", Pattern.CASE_INSENSITIVE); - - public static String encode(List value) { - Collections.sort(value); - - List> groups = new ArrayList<>(); - + public static int encode(BitString builder, Collection value) { + BitString rangeBuilder = new BitString(); + int groupStart = -1; + int last = Integer.MIN_VALUE; int offset = 0; - int groupStartIndex = 0; - while (groupStartIndex < value.size()) { - int groupEndIndex = groupStartIndex; - while (groupEndIndex < value.size() - 1 && value.get(groupEndIndex) + 1 == value.get(groupEndIndex + 1)) { - groupEndIndex++; + int groupCount = 0; + for (Integer item : value) { + if (last != (item - 1)) { + if (groupStart > 0) { + groupCount++; + writeGroup(rangeBuilder, groupStart, last, offset); + offset = last; + } + groupStart = item; } - - groups.add(value.subList(groupStartIndex, groupEndIndex + 1)); - - groupStartIndex = groupEndIndex + 1; + last = item; } - - String bitString = FixedIntegerEncoder.encode(groups.size(), 12); - for (int i = 0; i < groups.size(); i++) { - if (groups.get(i).size() == 1) { - int v = groups.get(i).get(0) - offset; - offset = groups.get(i).get(0); - bitString += "0" + FibonacciIntegerEncoder.encode(v); - } else { - int startVal = groups.get(i).get(0) - offset; - offset = groups.get(i).get(0); - int endVal = groups.get(i).get(groups.get(i).size() - 1) - offset; - offset = groups.get(i).get(groups.get(i).size() - 1); - bitString += "1" + FibonacciIntegerEncoder.encode(startVal) + FibonacciIntegerEncoder.encode(endVal); - } + if (groupStart > 0) { + groupCount++; + writeGroup(rangeBuilder, groupStart, last, offset); } - return bitString; + builder.writeInt(groupCount, 12); + builder.write(rangeBuilder); + return last; } - public static List decode(String bitString) throws DecodingException { - if (!BITSTRING_VERIFICATION_PATTERN.matcher(bitString).matches() || bitString.length() < 12) { - throw new DecodingException("Undecodable FibonacciIntegerRange '" + bitString + "'"); + private static void writeGroup(BitString builder, int groupStart, int last, int offset) { + int base = groupStart - offset; + int span = last - groupStart; + if (span == 0) { + builder.writeBoolean(false); + builder.writeFibonacci(base); + } else { + builder.writeBoolean(true); + builder.writeFibonacci(base); + builder.writeFibonacci(span); } + } - List value = new ArrayList<>(); - int count = FixedIntegerEncoder.decode(bitString.substring(0, 12)); - + 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.substring(startIndex, startIndex + 1)); - startIndex++; - - if (group == true) { - int index = bitString.indexOf("11", startIndex); - int start = FibonacciIntegerEncoder.decode(bitString.substring(startIndex, index + 2)) + offset; + boolean group = reader.readBoolean(); + if (group) { + int start = reader.readFibonacci() + offset; offset = start; - startIndex = index + 2; - - index = bitString.indexOf("11", startIndex); - int end = FibonacciIntegerEncoder.decode(bitString.substring(startIndex, index + 2)) + offset; + int end = reader.readFibonacci() + offset; offset = end; - startIndex = index + 2; - - if (value.size() + (end - start) > MAX_SIZE) { - LOGGER.warning("FibonacciIntegerRange has too many values"); - break; - } - for (int j = start; j <= end; j++) { - value.add(j); - } + value.addRange(start, end + 1); } else { - int index = bitString.indexOf("11", startIndex); - int val = FibonacciIntegerEncoder.decode(bitString.substring(startIndex, index + 2)) + offset; + int val = reader.readFibonacci() + offset; offset = val; - if (value.size() == MAX_SIZE) { - LOGGER.warning("FibonacciIntegerRange has too many values"); - break; - } - value.add(val); - startIndex = index + 2; + value.addInt(val); } } - 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 6c922263..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,41 +1,14 @@ package com.iab.gpp.encoder.datatype.encoder; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Pattern; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.error.EncodingException; +import com.iab.gpp.encoder.bitstring.BitString; +import com.iab.gpp.encoder.datatype.IntegerSet; public class FixedBitfieldEncoder { + private FixedBitfieldEncoder() {} - private static Pattern BITSTRING_VERIFICATION_PATTERN = Pattern.compile("^[0-1]*$", Pattern.CASE_INSENSITIVE); - - public static String encode(List value, int bitStringLength) { - if (value.size() > bitStringLength) { - throw new EncodingException("Too many values '" + value.size() + "'"); - } - - String bitString = ""; - for (int i = 0; i < value.size(); i++) { - bitString += BooleanEncoder.encode(value.get(i)); - } - - while (bitString.length() < bitStringLength) { - bitString += "0"; - } - - return bitString; - } - - public static List decode(String bitString) { - if (!BITSTRING_VERIFICATION_PATTERN.matcher(bitString).matches()) { - throw new DecodingException("Undecodable FixedBitfield '" + bitString + "'"); - } - - List value = new ArrayList<>(); - for (int i = 0; i < bitString.length(); i++) { - value.add(BooleanEncoder.decode(bitString.substring(i, i + 1))); + public static void encode(BitString builder, IntegerSet value, int bitStringLength) { + for (int i = 0; i < bitStringLength; i++) { + builder.writeBoolean(value.containsInt(i)); } - return value; } } 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 dfc6802f..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerEncoder.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.iab.gpp.encoder.datatype.encoder; - -import java.util.regex.Pattern; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.error.EncodingException; - -public class FixedIntegerEncoder { - - private static Pattern BITSTRING_VERIFICATION_PATTERN = Pattern.compile("^[0-1]*$", Pattern.CASE_INSENSITIVE); - - public static String encode(int value, int bitStringLength) { - // let bitString = value.toString(2); - - String bitString = ""; - while (value > 0) { - if ((value & 1) == 1) { - bitString = "1" + bitString; - } else { - bitString = "0" + bitString; - } - value = value >> 1; - } - - if (bitString.length() > bitStringLength) { - throw new EncodingException( - "Numeric value '" + value + "' is too large for a bit string length of '" + bitStringLength + "'"); - } - - while (bitString.length() < bitStringLength) { - bitString = "0" + bitString; - } - - return bitString; - } - - public static int decode(String bitString) throws DecodingException { - if (!BITSTRING_VERIFICATION_PATTERN.matcher(bitString).matches()) { - throw new DecodingException("Undecodable FixedInteger '" + bitString + "'"); - } - int value = 0; - - for (int i = 0; i < bitString.length(); i++) { - if (bitString.charAt(bitString.length() - (i + 1)) == '1') { - value += 1 << i; - } - } - - 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 044dfe26..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,63 +1,27 @@ package com.iab.gpp.encoder.datatype.encoder; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Pattern; -import com.iab.gpp.encoder.error.DecodingException; +import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.error.EncodingException; +import java.util.List; public class FixedIntegerListEncoder { + private FixedIntegerListEncoder() {} - private static Pattern BITSTRING_VERIFICATION_PATTERN = Pattern.compile("^[0-1]*$", Pattern.CASE_INSENSITIVE); - - public static String encode(List value, int elementBitStringLength, int numElements) { - if(value.size() > 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() + "'"); } - - String bitString = ""; - for (int i = 0; i < value.size(); i++) { - bitString += FixedIntegerEncoder.encode(value.get(i), elementBitStringLength); - } - while (bitString.length() < elementBitStringLength * numElements) { - bitString += "0"; + for (int i = 0; i < numElements; i++) { + if (i < length) { + builder.writeInt(value.get(i), elementBitStringLength); + } else { + for (int j = 0; j < elementBitStringLength; j++) { + builder.writeBoolean(false); + } + } } - - return bitString; - } - - public static List decode(String bitString, int elementBitStringLength, int numElements) - throws DecodingException { - if (!BITSTRING_VERIFICATION_PATTERN.matcher(bitString).matches()) { - throw new DecodingException("Undecodable FixedIntegerList '" + bitString + "'"); - } - - if (bitString.length() > elementBitStringLength * numElements) { - throw new DecodingException("Undecodable FixedIntegerList '" + bitString + "'"); - } - - if (bitString.length() % elementBitStringLength != 0) { - throw new DecodingException("Undecodable FixedIntegerList '" + bitString + "'"); - } - - while (bitString.length() < elementBitStringLength * numElements) { - bitString += "0"; - } - - if (bitString.length() > elementBitStringLength * numElements) { - bitString = bitString.substring(0, elementBitStringLength * numElements); - } - - List value = new ArrayList<>(); - for (int i = 0; i < bitString.length(); i += elementBitStringLength) { - value.add(FixedIntegerEncoder.decode(bitString.substring(i, 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 335952bf..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,89 +1,61 @@ package com.iab.gpp.encoder.datatype.encoder; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.logging.Logger; -import java.util.regex.Pattern; +import com.iab.gpp.encoder.bitstring.BitString; +import com.iab.gpp.encoder.datatype.IntegerSet; import com.iab.gpp.encoder.error.DecodingException; +import java.util.Collection; public class FixedIntegerRangeEncoder { - - private static final Logger LOGGER = Logger.getLogger(FixedIntegerRangeEncoder.class.getName()); - // NOTE: This is a value roughly the 2x the size of this list - // https://tools.iabtechlab.com/transparencycenter/explorer/business/gpp - private static final int MAX_SIZE = 8192; - private static Pattern BITSTRING_VERIFICATION_PATTERN = Pattern.compile("^[0-1]*$", Pattern.CASE_INSENSITIVE); - - public static String encode(List value) { - Collections.sort(value); - - List> groups = new ArrayList<>(); - - int groupStartIndex = 0; - while (groupStartIndex < value.size()) { - int groupEndIndex = groupStartIndex; - while (groupEndIndex < value.size() - 1 && value.get(groupEndIndex) + 1 == value.get(groupEndIndex + 1)) { - groupEndIndex++; + private FixedIntegerRangeEncoder() {} + + public static int encode(BitString builder, Collection value) { + BitString rangeBuilder = new BitString(); + int groupStart = -1; + int last = Integer.MIN_VALUE; + int groupCount = 0; + for (Integer item : value) { + if (last != (item - 1)) { + if (groupStart > 0) { + groupCount++; + writeGroup(rangeBuilder, groupStart, last); + } + groupStart = item; } - - groups.add(value.subList(groupStartIndex, groupEndIndex + 1)); - - groupStartIndex = groupEndIndex + 1; + last = item; } - - String bitString = FixedIntegerEncoder.encode(groups.size(), 12); - for (int i = 0; i < groups.size(); i++) { - if (groups.get(i).size() == 1) { - bitString += "0" + FixedIntegerEncoder.encode(groups.get(i).get(0), 16); - } else { - bitString += "1" + FixedIntegerEncoder.encode(groups.get(i).get(0), 16) - + FixedIntegerEncoder.encode(groups.get(i).get(groups.get(i).size() - 1), 16); - } + if (groupStart > 0) { + groupCount++; + writeGroup(rangeBuilder, groupStart, last); } - return bitString; + builder.writeInt(groupCount, 12); + builder.write(rangeBuilder); + return last; } - public static List decode(String bitString) throws DecodingException { - if (!BITSTRING_VERIFICATION_PATTERN.matcher(bitString).matches() || bitString.length() < 12) { - throw new DecodingException("Undecodable FixedIntegerRange '" + bitString + "'"); + private static void writeGroup(BitString builder, int groupStart, int last) { + if (groupStart == last) { + builder.writeBoolean(false); + builder.writeInt(groupStart, 16); + } else { + builder.writeBoolean(true); + builder.writeInt(groupStart, 16); + builder.writeInt(last, 16); } + } - List value = new ArrayList<>(); - int count = FixedIntegerEncoder.decode(bitString.substring(0, 12)); - 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.substring(startIndex, startIndex + 1)); - startIndex++; - - if (group == true) { - int start = FixedIntegerEncoder.decode(bitString.substring(startIndex, startIndex + 16)); - startIndex += 16; - - int end = FixedIntegerEncoder.decode(bitString.substring(startIndex, startIndex + 16)); - startIndex += 16; - - if (end < start) { - throw new DecodingException("FixedIntegerRange has invalid range"); - } - if (value.size() + (end - start) > MAX_SIZE) { - LOGGER.warning("FixedIntegerRange has too many values"); - break; - } - for (int j = start; j <= end; j++) { - value.add(j); - } + boolean group = reader.readBoolean(); + if (group) { + int start = reader.readInt(16); + int end = reader.readInt(16); + value.addRange(start, end + 1); } else { - int val = FixedIntegerEncoder.decode(bitString.substring(startIndex, startIndex + 16)); - if (value.size() == MAX_SIZE) { - LOGGER.warning("FixedIntegerRange has too many values"); - break; - } - value.add(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 c244a601..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/FixedLongEncoder.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.iab.gpp.encoder.datatype.encoder; - -import java.util.regex.Pattern; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.error.EncodingException; - -public class FixedLongEncoder { - - private static Pattern BITSTRING_VERIFICATION_PATTERN = Pattern.compile("^[0-1]*$", Pattern.CASE_INSENSITIVE); - - public static String encode(long value, int bitStringLength) { - String bitString = ""; - while (value > 0) { - if ((value & 1) == 1) { - bitString = "1" + bitString; - } else { - bitString = "0" + bitString; - } - value = value >> 1; - } - - if (bitString.length() > bitStringLength) { - throw new EncodingException( - "Numeric value '" + value + "' is too large for a bit string length of '" + bitStringLength + "'"); - } - - while (bitString.length() < bitStringLength) { - bitString = "0" + bitString; - } - - return bitString; - } - - public static long decode(String bitString) throws DecodingException { - if (!BITSTRING_VERIFICATION_PATTERN.matcher(bitString).matches()) { - throw new DecodingException("Undecodable FixedLong '" + bitString + "'"); - } - - long value = 0; - - for (int i = 0; i < bitString.length(); i++) { - if (bitString.charAt(bitString.length() - (i + 1)) == '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 38db681e..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,50 +1,41 @@ package com.iab.gpp.encoder.datatype.encoder; -import java.util.regex.Pattern; -import com.iab.gpp.encoder.error.DecodingException; +import com.iab.gpp.encoder.bitstring.BitString; import com.iab.gpp.encoder.error.EncodingException; public class FixedStringEncoder { + private FixedStringEncoder() {} - private static Pattern BITSTRING_VERIFICATION_PATTERN = Pattern.compile("^[0-1]*$", Pattern.CASE_INSENSITIVE); + private static final char SPACE = ' '; - public static String encode(String value, int stringLength) { - while (value.length() < stringLength) { - value += " "; - } - - String bitString = ""; - for (int i = 0; i < value.length(); i++) { - int code = (int) value.charAt(i); - if (code == 32) { - // space - bitString += FixedIntegerEncoder.encode(63, 6); + public static void encode(BitString builder, String value, int stringLength) { + int length = value.length(); + for (int i = 0; i < stringLength; i++) { + int code = SPACE; + if (i < length) { + code = value.charAt(i); + } + if (code == SPACE) { + builder.writeInt(63, 6); } else if (code >= 65) { - bitString += FixedIntegerEncoder.encode(((int) value.charAt(i)) - 65, 6); + builder.writeInt(((int) value.charAt(i)) - 65, 6); } else { throw new EncodingException("Unencodable FixedString '" + value + "'"); } } - - return bitString; } - public static String decode(String bitString) { - if (!BITSTRING_VERIFICATION_PATTERN.matcher(bitString).matches() || bitString.length() % 6 != 0) { - throw new DecodingException("Undecodable FixedString '" + bitString + "'"); - } - - String value = ""; - - for (int i = 0; i < bitString.length(); i += 6) { - int code = FixedIntegerEncoder.decode(bitString.substring(i, i + 6)); + public static String decode(BitString reader, int length) { + StringBuilder value = new StringBuilder(length); + for (int i = 0; i < length; i++) { + int code = reader.readInt(6); if (code == 63) { - value += " "; + value.append(SPACE); } else { - value += (char) (code + 65); + value.append((char) (code + 65)); } } - return value.trim(); + return value.toString().trim(); } } 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 3492fbcc..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/datatype/encoder/OptimizedFibonacciRangeEncoder.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.iab.gpp.encoder.datatype.encoder; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Pattern; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.error.EncodingException; - -public class OptimizedFibonacciRangeEncoder { - - private static Pattern BITSTRING_VERIFICATION_PATTERN = Pattern.compile("^[0-1]*$", Pattern.CASE_INSENSITIVE); - - public static String encode(List 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 - int max = value.size() > 0 ? value.get(value.size() - 1) : 0; - String rangeBitString = FibonacciIntegerRangeEncoder.encode(value); - int rangeLength = rangeBitString.length(); - int bitFieldLength = max; - - if (rangeLength <= bitFieldLength) { - return FixedIntegerEncoder.encode(max, 16) + "1" + rangeBitString; - } else { - List bits = new ArrayList<>(); - int index = 0; - for (int i = 0; i < max; i++) { - if (i == value.get(index) - 1) { - bits.add(true); - index++; - } else { - bits.add(false); - } - } - return FixedIntegerEncoder.encode(max, 16) + "0" + FixedBitfieldEncoder.encode(bits, bitFieldLength); - } - } - - public static List decode(String bitString) throws DecodingException { - if (!BITSTRING_VERIFICATION_PATTERN.matcher(bitString).matches() || bitString.length() < 12) { - throw new DecodingException("Undecodable FibonacciIntegerRange '" + bitString + "'"); - } - - if (bitString.charAt(16) == '1') { - return FibonacciIntegerRangeEncoder.decode(bitString.substring(17)); - } else { - List value = new ArrayList<>(); - List bits = FixedBitfieldEncoder.decode(bitString.substring(17)); - for (int i = 0; i < bits.size(); i++) { - if (bits.get(i) == true) { - value.add(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 73fb5e68..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,57 +1,39 @@ package com.iab.gpp.encoder.datatype.encoder; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Pattern; +import com.iab.gpp.encoder.bitstring.BitString; +import com.iab.gpp.encoder.datatype.IntegerSet; import com.iab.gpp.encoder.error.DecodingException; import com.iab.gpp.encoder.error.EncodingException; public class OptimizedFixedRangeEncoder { - private static Pattern BITSTRING_VERIFICATION_PATTERN = Pattern.compile("^[0-1]*$", Pattern.CASE_INSENSITIVE); - - public static String encode(List 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 - int max = value.size() > 0 ? value.get(value.size() - 1) : 0; - String rangeBitString = FixedIntegerRangeEncoder.encode(value); + BitString rangeBitString = new BitString(); + int max = FixedIntegerRangeEncoder.encode(rangeBitString, value); int rangeLength = rangeBitString.length(); int bitFieldLength = max; if (rangeLength <= bitFieldLength) { - return FixedIntegerEncoder.encode(max, 16) + "1" + rangeBitString; + builder.writeInt(max, 16); + builder.writeBoolean(true); + builder.write(rangeBitString); } else { - List bits = new ArrayList<>(); - int index = 0; + builder.writeInt(max, 16); + builder.writeBoolean(false); for (int i = 0; i < max; i++) { - if (i == value.get(index) - 1) { - bits.add(true); - index++; - } else { - bits.add(false); - } + builder.writeBoolean(value.containsInt(i + 1)); } - - return FixedIntegerEncoder.encode(max, 16) + "0" + FixedBitfieldEncoder.encode(bits, bitFieldLength); } } - public static List decode(String bitString) throws DecodingException { - if (!BITSTRING_VERIFICATION_PATTERN.matcher(bitString).matches() || bitString.length() < 12) { - throw new DecodingException("Undecodable FixedIntegerRange '" + bitString + "'"); - } - - if (bitString.charAt(16) == '1') { - 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 { - List value = new ArrayList<>(); - List bits = FixedBitfieldEncoder.decode(bitString.substring(17)); - for (int i = 0; i < bits.size(); i++) { - if (bits.get(i) == true) { - value.add(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 d2ac0f43..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/EncodableBitStringFields.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.iab.gpp.encoder.field; - -import java.util.HashMap; -import java.util.Map; -import com.iab.gpp.encoder.datatype.AbstractEncodableBitStringDataType; - -public class EncodableBitStringFields implements Fields> { - - private Map> fields = new HashMap<>(); - - public boolean containsKey(String key) { - return this.fields.containsKey(key); - } - - public void put(String key, AbstractEncodableBitStringDataType value) { - this.fields.put(key, value); - } - - public AbstractEncodableBitStringDataType get(String key) { - return this.fields.get(key); - } - - public Map> getAll() { - return new HashMap<>(this.fields); - } - - public void reset(Fields> fields) { - this.fields.clear(); - this.fields.putAll(fields.getAll()); - } -} 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 new file mode 100644 index 00000000..249c411d --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/FieldNames.java @@ -0,0 +1,50 @@ +package com.iab.gpp.encoder.field; + +import com.iab.gpp.encoder.datatype.DataType; +import java.util.Arrays; +import java.util.LinkedHashMap; + +public final class FieldNames & FieldKey> { + + private final LinkedHashMap map; + private final Integer[] indices; + private final DataType[] types; + + @SafeVarargs + FieldNames(E... keys) { + this.map = new LinkedHashMap<>(); + 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 int size() { + return types.length; + } + + @SuppressWarnings("unchecked") + public DataType get(int i) { + return (DataType) types[i]; + } + + public Integer getIndex(E key) { + if (key == null) { + return null; + } + return indices[key.ordinal()]; + } + + 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 ca091e7f..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/Fields.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.iab.gpp.encoder.field; - -import java.util.Map; -import com.iab.gpp.encoder.datatype.DataType; - -public interface Fields> { - - boolean containsKey(String key); - void put(String key, T value); - T get(String key); - Map getAll(); - void reset(Fields fields); - -} 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 00263e55..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/GenericFields.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.iab.gpp.encoder.field; - -import java.util.HashMap; -import java.util.Map; -import com.iab.gpp.encoder.datatype.DataType; - -public class GenericFields implements Fields> { - - private Map> fields = new HashMap<>(); - - public boolean containsKey(String key) { - return this.fields.containsKey(key); - } - - public void put(String key, DataType value) { - this.fields.put(key, value); - } - - public DataType get(String key) { - return this.fields.get(key); - } - - public Map> getAll() { - return new HashMap<>(this.fields); - } - - public void reset(Fields> fields) { - this.fields.clear(); - this.fields.putAll(fields.getAll()); - } -} 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 17f1f5d9..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,21 +1,26 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; +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 class HeaderV1Field { +public enum HeaderV1Field implements FieldKey { + ID(new EncodableFixedInteger<>("Id", 6, HeaderV1.ID)), + VERSION(new EncodableFixedInteger<>("Version", 6, HeaderV1.VERSION)), + SECTION_IDS(new EncodableFibonacciIntegerRange<>("SectionIds")); - public static String ID = "Id"; - public static String VERSION = "Version"; - public static String SECTION_IDS = "SectionIds"; + private final DataType type; - //@formatter:off - public static List HEADER_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - HeaderV1Field.ID, - HeaderV1Field.VERSION, - HeaderV1Field.SECTION_IDS - }); - //@formatter:on + 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 c87e886d..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,73 +1,87 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; +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 class TcfCaV1Field { +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 String VERSION = "Version"; - public static String CREATED = "Created"; - public static String LAST_UPDATED = "LastUpdated"; - public static String CMP_ID = "CmpId"; - public static String CMP_VERSION = "CmpVersion"; - public static String CONSENT_SCREEN = "ConsentScreen"; - public static String CONSENT_LANGUAGE = "ConsentLanguage"; - public static String VENDOR_LIST_VERSION = "VendorListVersion"; - public static String TCF_POLICY_VERSION = "TcfPolicyVersion"; - public static String USE_NON_STANDARD_STACKS = "UseNonStandardStacks"; - public static String SPECIAL_FEATURE_EXPRESS_CONSENT = "SpecialFeatureExpressConsent"; - public static String PURPOSES_EXPRESS_CONSENT = "PurposesExpressConsent"; - public static String PURPOSES_IMPLIED_CONSENT = "PurposesImpliedConsent"; - public static String VENDOR_EXPRESS_CONSENT = "VendorExpressConsent"; - public static String VENDOR_IMPLIED_CONSENT = "VendorImpliedConsent"; - public static String PUB_RESTRICTIONS = "PubRestrictions"; + 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 String PUB_PURPOSES_SEGMENT_TYPE = "PubPurposesSegmentType"; - public static String PUB_PURPOSES_EXPRESS_CONSENT = "PubPurposesExpressConsent"; - public static String PUB_PURPOSES_IMPLIED_CONSENT = "PubPurposesImpliedConsent"; - public static String NUM_CUSTOM_PURPOSES = "NumCustomPurposes"; - public static String CUSTOM_PURPOSES_EXPRESS_CONSENT = "CustomPurposesExpressConsent"; - public static String CUSTOM_PURPOSES_IMPLIED_CONSENT = "CustomPurposesImpliedConsent"; + DISCLOSED_VENDORS_SEGMENT_TYPE(new EncodableFixedInteger<>("DisclosedVendorsSegmentType", 3, 1)), + DISCLOSED_VENDORS(new EncodableOptimizedFixedRange<>("DisclosedVendors")); - public static String DISCLOSED_VENDORS_SEGMENT_TYPE = "DisclosedVendorsSegmentType"; - public static String DISCLOSED_VENDORS = "DisclosedVendors"; - - //@formatter:off - public static List TCFCAV1_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 List TCFCAV1_PUBLISHER_PURPOSES_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 - - //@formatter:off - public static List TCFCAV1_DISCLOSED_VENDORS_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - TcfCaV1Field.DISCLOSED_VENDORS_SEGMENT_TYPE, - TcfCaV1Field.DISCLOSED_VENDORS, - }); - //@formatter:on + TcfCaV1Field(DataType type) { + this.type = type; + } + + @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 fedb510f..85abfca1 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,86 +1,96 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; +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 class TcfEuV2Field { +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, 5)), + IS_SERVICE_SPECIFIC(new EncodableBoolean<>("IsServiceSpecific", true)), + 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")); - public static String VERSION = "Version"; - public static String CREATED = "Created"; - public static String LAST_UPDATED = "LastUpdated"; - public static String CMP_ID = "CmpId"; - public static String CMP_VERSION = "CmpVersion"; - public static String CONSENT_SCREEN = "ConsentScreen"; - public static String CONSENT_LANGUAGE = "ConsentLanguage"; - public static String VENDOR_LIST_VERSION = "VendorListVersion"; - public static String POLICY_VERSION = "PolicyVersion"; - public static String IS_SERVICE_SPECIFIC = "IsServiceSpecific"; - public static String USE_NON_STANDARD_STACKS = "UseNonStandardStacks"; - public static String SPECIAL_FEATURE_OPTINS = "SpecialFeatureOptins"; - public static String PURPOSE_CONSENTS = "PurposeConsents"; - public static String PURPOSE_LEGITIMATE_INTERESTS = "PurposeLegitimateInterests"; - public static String PURPOSE_ONE_TREATMENT = "PurposeOneTreatment"; - public static String PUBLISHER_COUNTRY_CODE = "PublisherCountryCode"; - public static String VENDOR_CONSENTS = "VendorConsents"; - public static String VENDOR_LEGITIMATE_INTERESTS = "VendorLegitimateInterests"; - public static String PUBLISHER_RESTRICTIONS = "PublisherRestrictions"; - public static String PUBLISHER_PURPOSES_SEGMENT_TYPE = "PublisherPurposesSegmentType"; - public static String PUBLISHER_CONSENTS = "PublisherConsents"; - public static String PUBLISHER_LEGITIMATE_INTERESTS = "PublisherLegitimateInterests"; - public static String NUM_CUSTOM_PURPOSES = "NumCustomPurposes"; - public static String PUBLISHER_CUSTOM_CONSENTS = "PublisherCustomConsents"; - public static String PUBLISHER_CUSTOM_LEGITIMATE_INTERESTS = "PublisherCustomLegitimateInterests"; - public static String VENDORS_ALLOWED_SEGMENT_TYPE = "VendorsAllowedSegmentType"; - public static String VENDORS_ALLOWED = "VendorsAllowed"; - public static String VENDORS_DISCLOSED_SEGMENT_TYPE = "VendorsDisclosedSegmentType"; - public static String VENDORS_DISCLOSED = "VendorsDisclosed"; + private final DataType type; - //@formatter:off - public static List TCFEUV2_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 - - //@formatter:off - public static List TCFEUV2_PUBLISHER_PURPOSES_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 - - //@formatter:off - public static List TCFEUV2_VENDORS_ALLOWED_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - TcfEuV2Field.VENDORS_ALLOWED_SEGMENT_TYPE, - TcfEuV2Field.VENDORS_ALLOWED, - }); - //@formatter:on - - //@formatter:off - public static List TCFEUV2_VENDORS_DISCLOSED_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - TcfEuV2Field.VENDORS_DISCLOSED_SEGMENT_TYPE, - TcfEuV2Field.VENDORS_DISCLOSED, - }); - //@formatter:on + TcfEuV2Field(DataType type) { + this.type = type; + } + + @Override + public DataType getType() { + return type; + } + + 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 934f57ac..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,48 +1,62 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; - -public class UsCaField { - - public static String VERSION = "Version"; - public static String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static String SHARING_OPT_OUT_NOTICE = "SharingOptOutNotice"; - public static String SENSITIVE_DATA_LIMIT_USE_NOTICE = "SensitiveDataLimitUseNotice"; - public static String SALE_OPT_OUT = "SaleOptOut"; - public static String SHARING_OPT_OUT = "SharingOptOut"; - public static String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing"; - public static String KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents"; - public static String PERSONAL_DATA_CONSENTS = "PersonalDataConsents"; - 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 USCA_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 List USCA_GPC_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - UsCaField.GPC_SEGMENT_TYPE, - 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 cae4e769..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,46 +1,61 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; - -public class UsCoField { - - public static String VERSION = "Version"; - public static String SHARING_NOTICE = "SharingNotice"; - 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 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 USCO_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 List USCO_GPC_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - UsCoField.GPC_SEGMENT_TYPE, - 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 9662e1e3..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,46 +1,61 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; - -public class UsCtField { - - public static String VERSION = "Version"; - public static String SHARING_NOTICE = "SharingNotice"; - 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 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 USCT_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 List USCT_GPC_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - UsCtField.GPC_SEGMENT_TYPE, - 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 2979f9b6..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,48 +1,64 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; - -public class UsDeField { - - 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 USDE_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 List USDE_GPC_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - UsDeField.GPC_SEGMENT_TYPE, - 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 f3647a79..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,37 +1,55 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; +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 class UsFlField { +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)); - 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"; + private final DataType type; - //@formatter:off - public static List USFL_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 + 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 f0c8d523..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,48 +1,64 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; - -public class UsIaField { - - 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 SENSITIVE_DATA_OPT_OUT_NOTICE = "SensitiveDataOptOutNotice"; - 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 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 USIA_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 List USIA_GPC_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - UsIaField.GPC_SEGMENT_TYPE, - 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 index c86f828f..7c78b06e 100644 --- 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 @@ -1,48 +1,64 @@ 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 +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 6b785f73..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,48 +1,64 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; - -public class UsMtField { - - public static String VERSION = "Version"; - public static String SHARING_NOTICE = "SharingNotice"; - 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 USMT_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 List USMT_GPC_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - UsMtField.GPC_SEGMENT_TYPE, - 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 e18427b1..482d6620 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,56 +1,154 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; +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 class UsNatField { - - public static String VERSION = "Version"; - public static String SHARING_NOTICE = "SharingNotice"; - public static String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static String SHARING_OPT_OUT_NOTICE = "SharingOptOutNotice"; - public static String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; - public static String SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE = "SensitiveDataProcessingOptOutNotice"; - public static String SENSITIVE_DATA_LIMIT_USE_NOTICE = "SensitiveDataLimitUseNotice"; - public static String SALE_OPT_OUT = "SaleOptOut"; - public static String SHARING_OPT_OUT = "SharingOptOut"; - 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 PERSONAL_DATA_CONSENTS = "PersonalDataConsents"; - 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 USNAT_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 List USNAT_GPC_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - UsNatField.GPC_SEGMENT_TYPE, - UsNatField.GPC - }); - //@formatter:on +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 boolean isPresent(FixedIntegerList value) { + return value.isPresent(); + } + + @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 a4479a87..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,48 +1,64 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; - -public class UsNeField { - - 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 USNE_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 List USNE_GPC_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - UsNeField.GPC_SEGMENT_TYPE, - 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 8381dc9b..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,48 +1,64 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; - -public class UsNhField { - - 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 USNH_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 List USNH_GPC_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - UsNhField.GPC_SEGMENT_TYPE, - 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 2acba850..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,48 +1,64 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; - -public class UsNjField { - - 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 USNJ_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 List USNJ_GPC_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - UsNjField.GPC_SEGMENT_TYPE, - 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 3e9021c2..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,48 +1,64 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; - -public class UsOrField { - - 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 USOR_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 List USOR_GPC_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - UsOrField.GPC_SEGMENT_TYPE, - 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 7ef8c75d..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,48 +1,64 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; - -public class UsTnField { - - 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 USTN_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 List USTN_GPC_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - UsTnField.GPC_SEGMENT_TYPE, - 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 44ec7d69..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,48 +1,64 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; - -public class UsTxField { - - 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 USTX_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 List USTX_GPC_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - UsTxField.GPC_SEGMENT_TYPE, - 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 01cedc67..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,37 +1,55 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; +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 class UsUtField { +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)); - public static String VERSION = "Version"; - public static String SHARING_NOTICE = "SharingNotice"; - public static String SALE_OPT_OUT_NOTICE = "SaleOptOutNotice"; - public static String TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice"; - public static String SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE = "SensitiveDataProcessingOptOutNotice"; - 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 MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + private final DataType type; - //@formatter:off - public static List USUT_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 + 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 46cb4dbb..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,35 +1,52 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; +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 class UsVaField { +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)); - public static String VERSION = "Version"; - public static String SHARING_NOTICE = "SharingNotice"; - 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 MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction"; - public static String MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode"; - public static String MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode"; + private final DataType type; - //@formatter:off - public static List USVA_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - 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 + 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 2551632c..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,21 +1,30 @@ package com.iab.gpp.encoder.field; -import java.util.Arrays; -import java.util.List; +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 class UspV1Field { +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 == '-'))); - public static String VERSION = "Version"; - public static String NOTICE = "Notice"; - public static String OPT_OUT_SALE = "OptOutSale"; - public static String LSPA_COVERED = "LspaCovered"; + private final DataType type; - //@formatter:off - public static List USPV1_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] { - UspV1Field.VERSION, - UspV1Field.NOTICE, - UspV1Field.OPT_OUT_SALE, - UspV1Field.LSPA_COVERED - }); - //@formatter:on + 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/AbstractEncodableSegmentedBitStringSection.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/AbstractEncodableSegmentedBitStringSection.java deleted file mode 100644 index eb5d5459..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/AbstractEncodableSegmentedBitStringSection.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.iab.gpp.encoder.section; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -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.error.InvalidFieldException; - -public abstract class AbstractEncodableSegmentedBitStringSection implements EncodableSection { - protected Map> fields; - protected String[][] segments; - - @Override - public boolean hasField(String fieldName) { - return this.fields.containsKey(fieldName); - } - - @Override - public Object getFieldValue(String fieldName) { - if (this.fields.containsKey(fieldName)) { - return this.fields.get(fieldName).getValue(); - } else { - return null; - } - } - - @Override - public void setFieldValue(String fieldName, Object value) throws InvalidFieldException { - if (this.fields.containsKey(fieldName)) { - this.fields.get(fieldName).setValue(value); - } else { - throw new InvalidFieldException(fieldName + " not found"); - } - } - - public String[][] getSegments() { - return this.segments; - } - - public List encodeSegmentsToBitStrings() throws EncodingException { - List segmentBitStrings = new ArrayList<>(); - for (int i = 0; i < this.segments.length; i++) { - String segmentBitString = ""; - for (int j = 0; j < this.segments[i].length; j++) { - String fieldName = this.segments[i][j]; - if (this.fields.containsKey(fieldName)) { - try { - AbstractEncodableBitStringDataType field = this.fields.get(fieldName); - segmentBitString += field.encode(); - } catch (Exception e) { - throw new EncodingException("Unable to encode " + fieldName, e); - } - } else { - throw new EncodingException("Field not found: '" + fieldName + "'"); - } - } - segmentBitStrings.add(segmentBitString); - } - - return segmentBitStrings; - } - - public void decodeSegmentsFromBitStrings(List segmentBitStrings) throws DecodingException { - for (int i = 0; i < this.segments.length && i < segmentBitStrings.size(); i++) { - decodeSegmentFromBitString(segments[i], segmentBitStrings.get(i)); - } - } - - private void decodeSegmentFromBitString(String[] segment, String segmentBitString) throws DecodingException { - if (segmentBitString != null && segmentBitString.length() > 0) { - int index = 0; - for (int j = 0; j < segment.length; j++) { - String fieldName = segment[j]; - AbstractEncodableBitStringDataType field = this.fields.get(fieldName); - if (this.fields.containsKey(fieldName)) { - try { - String substring = field.substring(segmentBitString, index); - field.decode(substring); - index += substring.length(); - } catch (SubstringException e) { - if(field.getHardFailIfMissing()) { - throw new DecodingException("Unable to decode " + fieldName, e); - } else { - return; - } - } catch (Exception e) { - throw new DecodingException("Unable to decode " + fieldName, e); - } - } else { - throw new DecodingException("Field not found: '" + fieldName + "'"); - } - } - } - } - - @Override - public abstract String encode() throws EncodingException; - - @Override - public abstract void decode(String encodedString) throws DecodingException; - - @Override - public abstract int getId(); - - @Override - public abstract String getName(); -} 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 1f31a592..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/AbstractLazilyEncodableSection.java +++ /dev/null @@ -1,92 +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 { - - private List segments; - - private String encodedString = null; - - private boolean dirty = false; - private boolean decoded = true; - - public AbstractLazilyEncodableSection() { - this.segments = initializeSegments(); - } - - protected abstract List initializeSegments(); - - protected abstract String encodeSection(List segments); - - protected abstract List decodeSection(String 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.getFieldNames().contains(fieldName)) { - return segment.hasField(fieldName); - } - } - - 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() { - if (this.encodedString == null || this.encodedString.isEmpty() || this.dirty) { - this.encodedString = this.encodeSection(this.segments); - this.dirty = false; - this.decoded = true; - } - - return this.encodedString; - } - - public void decode(String encodedString) { - this.encodedString = encodedString; - this.dirty = false; - this.decoded = false; - } - -} 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..3a0ef103 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/AbstractUsSectionWithGpc.java @@ -0,0 +1,54 @@ +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 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 e1f0a854..d915d4b1 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,20 +1,186 @@ 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(); - void decode(String encodedString); + public abstract int getVersion(); + + // 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++) { + EncodableSegment segment = getSegment(i); + String segmentInfo = segment.toString(); + if (segment.shouldEncode()) { + sb.append(", ").append(segmentInfo); + } + } + 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 fd5d991c..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,23 +1,21 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -import java.util.List; +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 static int ID = 3; - public static int VERSION = 1; - public static String NAME = "header"; +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(String encodedString) { - super(); + public HeaderV1(CharSequence encodedString) { + this(); decode(encodedString); } @@ -36,44 +34,7 @@ public int getVersion() { return HeaderV1.VERSION; } - @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new HeaderV1CoreSegment()); - return segments; - } - - @Override - protected List decodeSection(String encodedString) { - List segments = initializeSegments(); - - if(encodedString != null && !encodedString.isEmpty()) { - String[] encodedSegments = encodedString.split("\\."); - - for(int i=0; i i) { - segments.get(i).decode(encodedSegments[i]); - } - } - } - - return segments; - } - - @Override - protected String encodeSection(List segments) { - List encodedSegments = new ArrayList<>(); - for(EncodableSegment segment : segments) { - encodedSegments.add(segment.encode()); - } - return String.join(".", encodedSegments); - } - - - @SuppressWarnings("unchecked") - public List getSectionsIds() { - return (List) this.getFieldValue(HeaderV1Field.SECTION_IDS); + 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 fb69587c..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 class Sections { - - public static List SECTION_ORDER; - - public static 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_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/SlicedCharSequence.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/SlicedCharSequence.java new file mode 100644 index 00000000..b881e885 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/SlicedCharSequence.java @@ -0,0 +1,95 @@ +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 String base; + private final int start; + private final 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) { + // 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(base, start, end)); + return out; + } + + public static final CharSequence join(char glue, List pieces) { + int size = pieces.size(); + if (size > 1) { + int length = size - 1; + for (int i = 0; i < size; i++) { + length += pieces.get(i).length(); + } + StringBuilder sb = new StringBuilder(length); + sb.append(pieces.get(0)); + for (int i = 1; i < size; i++) { + sb.append(glue).append(pieces.get(i)); + } + return sb; + } + if (size == 1) { + return pieces.get(0); + } + return EMPTY; + } + + @Override + public int length() { + return end - start; + } + + @Override + public char charAt(int index) { + return base.charAt(start + index); + } + + @Override + public CharSequence subSequence(int newStart, int newEnd) { + return base.subSequence(start + newStart, start + newEnd); + } + + @Override + public String 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 194a82dc..e936db5f 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,30 +1,29 @@ package com.iab.gpp.encoder.section; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.List; +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.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 EncodableSection { -public class TcfCaV1 extends AbstractLazilyEncodableSection { - - public static int ID = 5; - public static int VERSION = 1; - public static String NAME = "tcfcav1"; + 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(String encodedString) { - super(); + public TcfCaV1(CharSequence encodedString) { + this(); decode(encodedString); } @@ -40,89 +39,72 @@ public String getName() { @Override public int getVersion() { - return TcfCaV1.VERSION; + return (Integer) this.getFieldValue(TcfCaV1Field.VERSION); } @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new TcfCaV1CoreSegment()); - segments.add(new TcfCaV1PublisherPurposesSegment()); - segments.add(new TcfCaV1DisclosedVendorsSegment()); - return segments; - } - - @Override - public List decodeSection(String encodedString) { - List segments = initializeSegments(); - - if(encodedString != null && !encodedString.isEmpty()) { - String[] encodedSegments = encodedString.split("\\."); - for (int i = 0; i < encodedSegments.length; 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. - */ - - String encodedSegment = encodedSegments[i]; - if(!encodedSegment.isEmpty()) { - char firstChar = encodedSegment.charAt(0); - - if(firstChar >= 'A' && firstChar <= 'H') { - segments.get(0).decode(encodedSegments[i]); - } else if(firstChar >= 'I' && firstChar <= 'P') { - segments.get(2).decode(encodedSegments[i]); - } else if((firstChar >= 'Y' && firstChar <= 'Z') || (firstChar >= 'a' && firstChar <= 'f')) { - segments.get(1).decode(encodedSegments[i]); - } 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 String encodeSection(List segments) { - List encodedSegments = new ArrayList<>(); + protected CharSequence doEncode() { + List encodedSegments = new ArrayList<>(size()); - encodedSegments.add(segments.get(0).encode()); - encodedSegments.add(segments.get(1).encode()); - if(!this.getDisclosedVendors().isEmpty()) { - encodedSegments.add(segments.get(2).encode()); + encodedSegments.add(getSegment(0).encodeCharSequence()); + encodedSegments.add(getSegment(1).encodeCharSequence()); + if (!this.getDisclosedVendors().isEmpty()) { + encodedSegments.add(getSegment(2).encodeCharSequence()); } - - return String.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)) { - ZonedDateTime utcDateTime = ZonedDateTime.now(ZoneId.of("UTC")); + 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 ZonedDateTime getCreated() { - return (ZonedDateTime) this.getFieldValue(TcfCaV1Field.CREATED); + public Instant getCreated() { + return (Instant) this.getFieldValue(TcfCaV1Field.CREATED); } - public ZonedDateTime getLastUpdated() { - return (ZonedDateTime) this.getFieldValue(TcfCaV1Field.LAST_UPDATED); + public Instant getLastUpdated() { + return (Instant) this.getFieldValue(TcfCaV1Field.LAST_UPDATED); } public Integer getCmpId() { @@ -153,71 +135,60 @@ public Boolean getUseNonStandardStacks() { return (Boolean) this.getFieldValue(TcfCaV1Field.USE_NON_STANDARD_STACKS); } - @SuppressWarnings("unchecked") - public List getSpecialFeatureExpressConsent() { - return (List) this.getFieldValue(TcfCaV1Field.SPECIAL_FEATURE_EXPRESS_CONSENT); + public IntegerSet getSpecialFeatureExpressConsent() { + return (IntegerSet) this.getFieldValue(TcfCaV1Field.SPECIAL_FEATURE_EXPRESS_CONSENT); } - @SuppressWarnings("unchecked") - public List getPurposesExpressConsent() { - return (List) this.getFieldValue(TcfCaV1Field.PURPOSES_EXPRESS_CONSENT); + public IntegerSet getPurposesExpressConsent() { + return (IntegerSet) this.getFieldValue(TcfCaV1Field.PURPOSES_EXPRESS_CONSENT); } - @SuppressWarnings("unchecked") - public List getPurposesImpliedConsent() { - return (List) this.getFieldValue(TcfCaV1Field.PURPOSES_IMPLIED_CONSENT); + public IntegerSet getPurposesImpliedConsent() { + return (IntegerSet) this.getFieldValue(TcfCaV1Field.PURPOSES_IMPLIED_CONSENT); } - @SuppressWarnings("unchecked") - public List getVendorExpressConsent() { - return (List) this.getFieldValue(TcfCaV1Field.VENDOR_EXPRESS_CONSENT); + public IntegerSet getVendorExpressConsent() { + return (IntegerSet) this.getFieldValue(TcfCaV1Field.VENDOR_EXPRESS_CONSENT); } - @SuppressWarnings("unchecked") - public List getVendorImpliedConsent() { - return (List) this.getFieldValue(TcfCaV1Field.VENDOR_IMPLIED_CONSENT); + public IntegerSet getVendorImpliedConsent() { + return (IntegerSet) this.getFieldValue(TcfCaV1Field.VENDOR_IMPLIED_CONSENT); } @SuppressWarnings("unchecked") public List getPubRestrictions() { return (List) this.getFieldValue(TcfCaV1Field.PUB_RESTRICTIONS); } - + public Integer getPubPurposesSegmentType() { return (Integer) this.getFieldValue(TcfCaV1Field.PUB_PURPOSES_SEGMENT_TYPE); } - @SuppressWarnings("unchecked") - public List getPubPurposesExpressConsent() { - return (List) this.getFieldValue(TcfCaV1Field.PUB_PURPOSES_EXPRESS_CONSENT); + public IntegerSet getPubPurposesExpressConsent() { + return (IntegerSet) this.getFieldValue(TcfCaV1Field.PUB_PURPOSES_EXPRESS_CONSENT); } - @SuppressWarnings("unchecked") - public List getPubPurposesImpliedConsent() { - return (List) this.getFieldValue(TcfCaV1Field.PUB_PURPOSES_IMPLIED_CONSENT); + public IntegerSet getPubPurposesImpliedConsent() { + return (IntegerSet) this.getFieldValue(TcfCaV1Field.PUB_PURPOSES_IMPLIED_CONSENT); } public Integer getNumCustomPurposes() { return (Integer) this.getFieldValue(TcfCaV1Field.NUM_CUSTOM_PURPOSES); } - @SuppressWarnings("unchecked") - public List getCustomPurposesExpressConsent() { - return (List) this.getFieldValue(TcfCaV1Field.CUSTOM_PURPOSES_EXPRESS_CONSENT); + public IntegerSet getCustomPurposesExpressConsent() { + return (IntegerSet) this.getFieldValue(TcfCaV1Field.CUSTOM_PURPOSES_EXPRESS_CONSENT); } - @SuppressWarnings("unchecked") - public List getCustomPurposesImpliedConsent() { - return (List) this.getFieldValue(TcfCaV1Field.CUSTOM_PURPOSES_IMPLIED_CONSENT); + public IntegerSet getCustomPurposesImpliedConsent() { + return (IntegerSet) this.getFieldValue(TcfCaV1Field.CUSTOM_PURPOSES_IMPLIED_CONSENT); } public Integer getDisclosedVendorsSegmentType() { return (Integer) this.getFieldValue(TcfCaV1Field.DISCLOSED_VENDORS_SEGMENT_TYPE); } - - @SuppressWarnings("unchecked") - public List getDisclosedVendors() { - return (List) this.getFieldValue(TcfCaV1Field.DISCLOSED_VENDORS); - } + 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 1f7f2b1e..6a123dc5 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,31 +1,33 @@ package com.iab.gpp.encoder.section; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.List; +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.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 EncodableSection { -public class TcfEuV2 extends AbstractLazilyEncodableSection { - - public static int ID = 2; - public static int VERSION = 2; - public static String NAME = "tcfeuv2"; + 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, true), + new TraditionalBase64Segment<>( + TcfEuV2Field.TCFEUV2_VENDORS_ALLOWED_SEGMENT_FIELD_NAMES, true), + new TraditionalBase64Segment<>(TcfEuV2Field.TCFEUV2_VENDORS_DISCLOSED_SEGMENT_FIELD_NAMES)); } - public TcfEuV2(String encodedString) { - super(); + public TcfEuV2(CharSequence encodedString) { + this(); decode(encodedString); } @@ -41,106 +43,75 @@ public String getName() { @Override public int getVersion() { - return TcfEuV2.VERSION; + return (Integer) this.getFieldValue(TcfEuV2Field.VERSION); } @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new TcfEuV2CoreSegment()); - segments.add(new TcfEuV2PublisherPurposesSegment()); - segments.add(new TcfEuV2VendorsAllowedSegment()); - segments.add(new TcfEuV2VendorsDisclosedSegment()); - return segments; - } - - @Override - public List decodeSection(String encodedString) { - List segments = initializeSegments(); - - if(encodedString != null && !encodedString.isEmpty()) { - String[] encodedSegments = encodedString.split("\\."); - for (int i = 0; i < encodedSegments.length; 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. - */ - - String encodedSegment = encodedSegments[i]; - if(!encodedSegment.isEmpty()) { - char firstChar = encodedSegment.charAt(0); - - // unfortunately, the segment ordering doesn't match the segment ids - if(firstChar >= 'A' && firstChar <= 'H') { - segments.get(0).decode(encodedSegments[i]); - } else if(firstChar >= 'I' && firstChar <= 'P') { - segments.get(3).decode(encodedSegments[i]); - } else if(firstChar >= 'Q' && firstChar <= 'X') { - segments.get(2).decode(encodedSegments[i]); - } else if((firstChar >= 'Y' && firstChar <= 'Z') || (firstChar >= 'a' && firstChar <= 'f')) { - segments.get(1).decode(encodedSegments[i]); - } 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 String encodeSection(List segments) { - List encodedSegments = new ArrayList<>(); - if (segments.size() >= 1) { - encodedSegments.add(segments.get(0).encode()); - - Boolean isServiceSpecific = (Boolean) this.getFieldValue(TcfEuV2Field.IS_SERVICE_SPECIFIC); - if (isServiceSpecific) { - if (segments.size() >= 2) { - encodedSegments.add(segments.get(1).encode()); - } - } else { - if (segments.size() >= 2) { - encodedSegments.add(segments.get(2).encode()); - - if (segments.size() >= 3) { - encodedSegments.add(segments.get(3).encode()); - } - } + public CharSequence doEncode() { + int size = size(); + List encodedSegments = new ArrayList<>(size); + for (int i = 0; i < size; i++) { + EncodableSegment segment = getSegment(i); + if (segment.shouldEncode()) { + encodedSegments.add(segment.encodeCharSequence()); } } - - return String.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)) { - ZonedDateTime utcDateTime = ZonedDateTime.now(ZoneId.of("UTC")); + 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 ZonedDateTime getCreated() { - return (ZonedDateTime) this.getFieldValue(TcfEuV2Field.CREATED); + public Instant getCreated() { + return (Instant) this.getFieldValue(TcfEuV2Field.CREATED); } - public ZonedDateTime getLastUpdated() { - return (ZonedDateTime) this.getFieldValue(TcfEuV2Field.LAST_UPDATED); + public Instant getLastUpdated() { + return (Instant) this.getFieldValue(TcfEuV2Field.LAST_UPDATED); } public Integer getCmpId() { @@ -175,19 +146,16 @@ public Boolean getUseNonStandardStacks() { return (Boolean) this.getFieldValue(TcfEuV2Field.USE_NON_STANDARD_STACKS); } - @SuppressWarnings("unchecked") - public List getSpecialFeatureOptins() { - return (List) this.getFieldValue(TcfEuV2Field.SPECIAL_FEATURE_OPTINS); + public IntegerSet getSpecialFeatureOptins() { + return (IntegerSet) this.getFieldValue(TcfEuV2Field.SPECIAL_FEATURE_OPTINS); } - @SuppressWarnings("unchecked") - public List getPurposeConsents() { - return (List) this.getFieldValue(TcfEuV2Field.PURPOSE_CONSENTS); + public IntegerSet getPurposeConsents() { + return (IntegerSet) this.getFieldValue(TcfEuV2Field.PURPOSE_CONSENTS); } - @SuppressWarnings("unchecked") - public List getPurposeLegitimateInterests() { - return (List) this.getFieldValue(TcfEuV2Field.PURPOSE_LEGITIMATE_INTERESTS); + public IntegerSet getPurposeLegitimateInterests() { + return (IntegerSet) this.getFieldValue(TcfEuV2Field.PURPOSE_LEGITIMATE_INTERESTS); } public Boolean getPurposeOneTreatment() { @@ -198,14 +166,12 @@ public String getPublisherCountryCode() { return (String) this.getFieldValue(TcfEuV2Field.PUBLISHER_COUNTRY_CODE); } - @SuppressWarnings("unchecked") - public List getVendorConsents() { - return (List) this.getFieldValue(TcfEuV2Field.VENDOR_CONSENTS); + public IntegerSet getVendorConsents() { + return (IntegerSet) this.getFieldValue(TcfEuV2Field.VENDOR_CONSENTS); } - @SuppressWarnings("unchecked") - public List getVendorLegitimateInterests() { - return (List) this.getFieldValue(TcfEuV2Field.VENDOR_LEGITIMATE_INTERESTS); + public IntegerSet getVendorLegitimateInterests() { + return (IntegerSet) this.getFieldValue(TcfEuV2Field.VENDOR_LEGITIMATE_INTERESTS); } @SuppressWarnings("unchecked") @@ -217,47 +183,39 @@ public Integer getPublisherPurposesSegmentType() { return (Integer) this.getFieldValue(TcfEuV2Field.PUBLISHER_PURPOSES_SEGMENT_TYPE); } - @SuppressWarnings("unchecked") - public List getPublisherConsents() { - return (List) this.getFieldValue(TcfEuV2Field.PUBLISHER_CONSENTS); + public IntegerSet getPublisherConsents() { + return (IntegerSet) this.getFieldValue(TcfEuV2Field.PUBLISHER_CONSENTS); } - @SuppressWarnings("unchecked") - public List getPublisherLegitimateInterests() { - return (List) this.getFieldValue(TcfEuV2Field.PUBLISHER_LEGITIMATE_INTERESTS); + public IntegerSet getPublisherLegitimateInterests() { + return (IntegerSet) this.getFieldValue(TcfEuV2Field.PUBLISHER_LEGITIMATE_INTERESTS); } public Integer getNumCustomPurposes() { return (Integer) this.getFieldValue(TcfEuV2Field.NUM_CUSTOM_PURPOSES); } - @SuppressWarnings("unchecked") - public List getPublisherCustomConsents() { - return (List) this.getFieldValue(TcfEuV2Field.PUBLISHER_CUSTOM_CONSENTS); + public IntegerSet getPublisherCustomConsents() { + return (IntegerSet) this.getFieldValue(TcfEuV2Field.PUBLISHER_CUSTOM_CONSENTS); } - @SuppressWarnings("unchecked") - public List getPublisherCustomLegitimateInterests() { - return (List) this.getFieldValue(TcfEuV2Field.PUBLISHER_CUSTOM_LEGITIMATE_INTERESTS); + public IntegerSet getPublisherCustomLegitimateInterests() { + return (IntegerSet) this.getFieldValue(TcfEuV2Field.PUBLISHER_CUSTOM_LEGITIMATE_INTERESTS); } public Integer getVendorsAllowedSegmentType() { return (Integer) this.getFieldValue(TcfEuV2Field.VENDORS_ALLOWED_SEGMENT_TYPE); } - @SuppressWarnings("unchecked") - public List getVendorsAllowed() { - return (List) this.getFieldValue(TcfEuV2Field.VENDORS_ALLOWED); + public IntegerSet getVendorsAllowed() { + return (IntegerSet) this.getFieldValue(TcfEuV2Field.VENDORS_ALLOWED); } public Integer getVendorsDisclosedSegmentType() { return (Integer) this.getFieldValue(TcfEuV2Field.VENDORS_DISCLOSED_SEGMENT_TYPE); } - @SuppressWarnings("unchecked") - public List getVendorsDisclosed() { - return (List) this.getFieldValue(TcfEuV2Field.VENDORS_DISCLOSED); + 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 e80c4680..3be8efd1 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,24 +1,23 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -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 static int ID = 8; - public static int VERSION = 1; - public static String NAME = "usca"; +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(String encodedString) { - super(); + public UsCa(CharSequence encodedString) { + this(); decode(encodedString); } @@ -34,54 +33,14 @@ public String getName() { @Override public int getVersion() { - return UsCa.VERSION; + return (Integer) this.getFieldValue(UsCaField.VERSION); } @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UsCaCoreSegment()); - segments.add(new UsCaGpcSegment()); - 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(UsCaField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments[1]); - } else { - segments.get(1).setFieldValue(UsCaField.GPC_SEGMENT_INCLUDED, false); - } - } - - return segments; + protected final UsCaField getGpcSegmentIncludedKey() { + return UsCaField.GPC_SEGMENT_INCLUDED; } - @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(UsCaField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encode()); - } - } - - return String.join(".", encodedSegments); - } - - public Integer getSaleOptOutNotice() { return (Integer) this.getFieldValue(UsCaField.SALE_OPT_OUT_NOTICE); } @@ -102,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,14 +85,6 @@ public Integer getMspaServiceProviderMode() { return (Integer) this.getFieldValue(UsCaField.MSPA_SERVICE_PROVIDER_MODE); } - 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 9e5495c0..7e11bb82 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,24 +1,23 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -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 static int ID = 10; - public static int VERSION = 1; - public static String NAME = "usco"; +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(String encodedString) { - super(); + public UsCo(CharSequence encodedString) { + this(); decode(encodedString); } @@ -34,54 +33,14 @@ public String getName() { @Override public int getVersion() { - return UsCo.VERSION; + return (Integer) this.getFieldValue(UsCoField.VERSION); } @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UsCoCoreSegment()); - segments.add(new UsCoGpcSegment()); - 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(UsCoField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments[1]); - } else { - segments.get(1).setFieldValue(UsCoField.GPC_SEGMENT_INCLUDED, false); - } - } - - return segments; + protected final UsCoField getGpcSegmentIncludedKey() { + return UsCoField.GPC_SEGMENT_INCLUDED; } - @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(UsCoField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encode()); - } - } - - return String.join(".", encodedSegments); - } - - public Integer getSharingNotice() { return (Integer) this.getFieldValue(UsCoField.SHARING_NOTICE); } @@ -102,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,14 +81,6 @@ public Integer getMspaServiceProviderMode() { return (Integer) this.getFieldValue(UsCoField.MSPA_SERVICE_PROVIDER_MODE); } - 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 0f2f9569..6c037f63 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,24 +1,23 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -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 int ID = 12; - public static int VERSION = 1; - public static String NAME = "usct"; + 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(String encodedString) { - super(); + public UsCt(CharSequence encodedString) { + this(); decode(encodedString); } @@ -34,54 +33,14 @@ public String getName() { @Override public int getVersion() { - return UsCt.VERSION; + return (Integer) this.getFieldValue(UsCtField.VERSION); } @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UsCtCoreSegment()); - segments.add(new UsCtGpcSegment()); - return segments; + protected final UsCtField getGpcSegmentIncludedKey() { + return UsCtField.GPC_SEGMENT_INCLUDED; } - @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(UsCtField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments[1]); - } else { - segments.get(1).setFieldValue(UsCtField.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(UsCtField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encode()); - } - } - - return String.join(".", encodedSegments); - } - - public Integer getSharingNotice() { return (Integer) this.getFieldValue(UsCtField.SHARING_NOTICE); } @@ -102,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,14 +81,6 @@ public Integer getMspaServiceProviderMode() { return (Integer) this.getFieldValue(UsCtField.MSPA_SERVICE_PROVIDER_MODE); } - 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 82538ee7..13402b5c 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,24 +1,23 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -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 int ID = 17; - public static int VERSION = 1; - public static String NAME = "usde"; + 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(String encodedString) { - super(); + public UsDe(CharSequence encodedString) { + this(); decode(encodedString); } @@ -34,54 +33,14 @@ public String getName() { @Override public int getVersion() { - return UsDe.VERSION; + return (Integer) this.getFieldValue(UsDeField.VERSION); } @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UsDeCoreSegment()); - segments.add(new UsDeGpcSegment()); - return segments; + protected final UsDeField getGpcSegmentIncludedKey() { + return UsDeField.GPC_SEGMENT_INCLUDED; } - @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); } @@ -102,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,14 +85,6 @@ 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/section/UsFl.java b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsFl.java index 8c568479..e9714b68 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,23 +1,21 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -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 int ID = 13; - public static int VERSION = 1; - public static String NAME = "usfl"; + 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(String encodedString) { - super(); + public UsFl(CharSequence encodedString) { + this(); decode(encodedString); } @@ -33,43 +31,9 @@ public String getName() { @Override public int getVersion() { - return UsFl.VERSION; + return (Integer) this.getFieldValue(UsFlField.VERSION); } - @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UsFlCoreSegment()); - return segments; - } - - @Override - protected List decodeSection(String encodedString) { - List segments = initializeSegments(); - - if(encodedString != null && !encodedString.isEmpty()) { - String[] encodedSegments = encodedString.split("\\."); - - for (int i = 0; i < segments.size(); i++) { - if (encodedSegments.length > i) { - segments.get(i).decode(encodedSegments[i]); - } - } - } - - return segments; - } - - @Override - protected String encodeSection(List segments) { - List encodedSegments = new ArrayList<>(); - for (EncodableSegment segment : segments) { - encodedSegments.add(segment.encode()); - } - return String.join(".", encodedSegments); - } - - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsFlField.PROCESSING_NOTICE); } @@ -90,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 a3ab88e3..601ff1ac 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,24 +1,23 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -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 int ID = 18; - public static int VERSION = 1; - public static String NAME = "usia"; + 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(String encodedString) { - super(); + public UsIa(CharSequence encodedString) { + this(); decode(encodedString); } @@ -34,54 +33,14 @@ public String getName() { @Override public int getVersion() { - return UsIa.VERSION; + return (Integer) this.getFieldValue(UsIaField.VERSION); } @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UsIaCoreSegment()); - segments.add(new UsIaGpcSegment()); - return segments; + protected final UsIaField getGpcSegmentIncludedKey() { + return UsIaField.GPC_SEGMENT_INCLUDED; } - @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(UsIaField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments[1]); - } else { - segments.get(1).setFieldValue(UsIaField.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(UsIaField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encode()); - } - } - - return String.join(".", encodedSegments); - } - - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsIaField.PROCESSING_NOTICE); } @@ -106,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,14 +85,6 @@ public Integer getMspaServiceProviderMode() { return (Integer) this.getFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE); } - 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 index 961f4a91..37626f86 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,23 +1,23 @@ 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.*; +import com.iab.gpp.encoder.segment.Base64Segment; -import java.util.ArrayList; -import java.util.List; +public class UsMn extends AbstractUsSectionWithGpc { -public class UsMn extends AbstractLazilyEncodableSection { - - public static int ID = 23; - public static int VERSION = 1; - public static String NAME = "usmn"; + public static final int ID = 23; + public static final int VERSION = 1; + public static final String NAME = "usmn"; public UsMn() { - super(); + super( + new Base64Segment<>(UsMnField.USMN_CORE_SEGMENT_FIELD_NAMES), + new Base64Segment<>(UsMnField.USMN_GPC_SEGMENT_FIELD_NAMES)); } public UsMn(String encodedString) { - super(); + this(); decode(encodedString); } @@ -33,54 +33,14 @@ public String getName() { @Override public int getVersion() { - return UsMn.VERSION; - } - - @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UsMnCoreSegment()); - segments.add(new UsMnGpcSegment()); - 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(UsMnField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments[1]); - } else { - segments.get(1).setFieldValue(UsMnField.GPC_SEGMENT_INCLUDED, false); - } - } - - return segments; + return (Integer) this.getFieldValue(UsMnField.VERSION); } @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(UsMnField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encode()); - } - } - - return String.join(".", encodedSegments); + protected final UsMnField getGpcSegmentIncludedKey() { + return UsMnField.GPC_SEGMENT_INCLUDED; } - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsMnField.PROCESSING_NOTICE); } @@ -101,12 +61,10 @@ public Integer getTargetedAdvertisingOptOut() { return (Integer) this.getFieldValue(UsMnField.TARGETED_ADVERTISING_OPT_OUT); } - @SuppressWarnings("unchecked") - public List getSensitiveDataProcessing() { - return (List) this.getFieldValue(UsMnField.SENSITIVE_DATA_PROCESSING); + public FixedIntegerList getSensitiveDataProcessing() { + return (FixedIntegerList) this.getFieldValue(UsMnField.SENSITIVE_DATA_PROCESSING); } - @SuppressWarnings("unchecked") public Integer getKnownChildSensitiveDataConsents() { return (Integer) this.getFieldValue(UsMnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS); } @@ -127,14 +85,6 @@ 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 getGpcSegmentIncluded() { - return (Boolean) this.getFieldValue(UsMnField.GPC_SEGMENT_INCLUDED); - } - 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 faf5a235..0bc1bc2f 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,24 +1,23 @@ package com.iab.gpp.encoder.section; -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 int ID = 14; - public static int VERSION = 1; - public static String NAME = "usmt"; + 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(String encodedString) { - super(); + public UsMt(CharSequence encodedString) { + this(); decode(encodedString); } @@ -34,54 +33,14 @@ public String getName() { @Override public int getVersion() { - return UsMt.VERSION; + return (Integer) this.getFieldValue(UsMtField.VERSION); } @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UsMtCoreSegment()); - segments.add(new UsMtGpcSegment()); - return segments; + protected final UsMtField getGpcSegmentIncludedKey() { + return UsMtField.GPC_SEGMENT_INCLUDED; } - @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(UsMtField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments[1]); - } else { - segments.get(1).setFieldValue(UsMtField.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(UsMtField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encode()); - } - } - - return String.join(".", encodedSegments); - } - - public Integer getSharingNotice() { return (Integer) this.getFieldValue(UsMtField.SHARING_NOTICE); } @@ -102,20 +61,18 @@ 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() { return (Integer) this.getFieldValue(UsMtField.ADDITIONAL_DATA_PROCESSING_CONSENT); } - + public Integer getMspaCoveredTransaction() { return (Integer) this.getFieldValue(UsMtField.MSPA_COVERED_TRANSACTION); } @@ -128,14 +85,6 @@ public Integer getMspaServiceProviderMode() { return (Integer) this.getFieldValue(UsMtField.MSPA_SERVICE_PROVIDER_MODE); } - 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 a32950d8..6f48947e 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,24 +1,23 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -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 int ID = 7; - public static int VERSION = 1; - public static String NAME = "usnat"; + public static final int ID = 7; + 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(String encodedString) { - super(); + public UsNat(CharSequence encodedString) { + this(); decode(encodedString); } @@ -34,54 +33,14 @@ public String getName() { @Override public int getVersion() { - return UsNat.VERSION; + return (Integer) this.getFieldValue(UsNatField.VERSION); } @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UsNatCoreSegment()); - segments.add(new UsNatGpcSegment()); - return segments; + protected final UsNatField getGpcSegmentIncludedKey() { + return UsNatField.GPC_SEGMENT_INCLUDED; } - @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(UsNatField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments[1]); - } else { - segments.get(1).setFieldValue(UsNatField.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(UsNatField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encode()); - } - } - - return String.join(".", encodedSegments); - } - - public Integer getSharingNotice() { return (Integer) this.getFieldValue(UsNatField.SHARING_NOTICE); } @@ -118,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,14 +101,6 @@ public Integer getMspaServiceProviderMode() { return (Integer) this.getFieldValue(UsNatField.MSPA_SERVICE_PROVIDER_MODE); } - 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 e8b7b882..8902b24b 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,24 +1,23 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -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 int ID = 19; - public static int VERSION = 1; - public static String NAME = "usne"; + 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(String encodedString) { - super(); + public UsNe(CharSequence encodedString) { + this(); decode(encodedString); } @@ -34,54 +33,14 @@ public String getName() { @Override public int getVersion() { - return UsNe.VERSION; + return (Integer) this.getFieldValue(UsNeField.VERSION); } @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UsNeCoreSegment()); - segments.add(new UsNeGpcSegment()); - return segments; + protected final UsNeField getGpcSegmentIncludedKey() { + return UsNeField.GPC_SEGMENT_INCLUDED; } - @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(UsNeField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments[1]); - } else { - segments.get(1).setFieldValue(UsNeField.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(UsNeField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encode()); - } - } - - return String.join(".", encodedSegments); - } - - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsNeField.PROCESSING_NOTICE); } @@ -102,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,14 +85,6 @@ public Integer getMspaServiceProviderMode() { return (Integer) this.getFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE); } - 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 7bf40fe2..67f237eb 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,24 +1,23 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -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 int ID = 20; - public static int VERSION = 1; - public static String NAME = "usnh"; + 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(String encodedString) { - super(); + public UsNh(CharSequence encodedString) { + this(); decode(encodedString); } @@ -34,54 +33,14 @@ public String getName() { @Override public int getVersion() { - return UsNh.VERSION; + return (Integer) this.getFieldValue(UsNhField.VERSION); } @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UsNhCoreSegment()); - segments.add(new UsNhGpcSegment()); - return segments; + protected final UsNhField getGpcSegmentIncludedKey() { + return UsNhField.GPC_SEGMENT_INCLUDED; } - @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(UsNhField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments[1]); - } else { - segments.get(1).setFieldValue(UsNhField.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(UsNhField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encode()); - } - } - - return String.join(".", encodedSegments); - } - - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsNhField.PROCESSING_NOTICE); } @@ -102,20 +61,18 @@ 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() { return (Integer) this.getFieldValue(UsNhField.ADDITIONAL_DATA_PROCESSING_CONSENT); } - + public Integer getMspaCoveredTransaction() { return (Integer) this.getFieldValue(UsNhField.MSPA_COVERED_TRANSACTION); } @@ -128,14 +85,6 @@ public Integer getMspaServiceProviderMode() { return (Integer) this.getFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE); } - 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 f24e043f..763d51fb 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,24 +1,23 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -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 int ID = 21; - public static int VERSION = 1; - public static String NAME = "usnj"; + 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(String encodedString) { - super(); + public UsNj(CharSequence encodedString) { + this(); decode(encodedString); } @@ -34,54 +33,14 @@ public String getName() { @Override public int getVersion() { - return UsNj.VERSION; + return (Integer) this.getFieldValue(UsNjField.VERSION); } @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UsNjCoreSegment()); - segments.add(new UsNjGpcSegment()); - return segments; + protected final UsNjField getGpcSegmentIncludedKey() { + return UsNjField.GPC_SEGMENT_INCLUDED; } - @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(UsNjField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments[1]); - } else { - segments.get(1).setFieldValue(UsNjField.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(UsNjField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encode()); - } - } - - return String.join(".", encodedSegments); - } - - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsNjField.PROCESSING_NOTICE); } @@ -102,20 +61,18 @@ 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() { return (Integer) this.getFieldValue(UsNjField.ADDITIONAL_DATA_PROCESSING_CONSENT); } - + public Integer getMspaCoveredTransaction() { return (Integer) this.getFieldValue(UsNjField.MSPA_COVERED_TRANSACTION); } @@ -128,14 +85,6 @@ public Integer getMspaServiceProviderMode() { return (Integer) this.getFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE); } - 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 632e455f..d35624a0 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,24 +1,23 @@ package com.iab.gpp.encoder.section; -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 int ID = 15; - public static int VERSION = 1; - public static String NAME = "usor"; + 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(String encodedString) { - super(); + public UsOr(CharSequence encodedString) { + this(); decode(encodedString); } @@ -34,54 +33,14 @@ public String getName() { @Override public int getVersion() { - return UsOr.VERSION; + return (Integer) this.getFieldValue(UsOrField.VERSION); } @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UsOrCoreSegment()); - segments.add(new UsOrGpcSegment()); - return segments; + protected final UsOrField getGpcSegmentIncludedKey() { + return UsOrField.GPC_SEGMENT_INCLUDED; } - @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(UsOrField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments[1]); - } else { - segments.get(1).setFieldValue(UsOrField.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(UsOrField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encode()); - } - } - - return String.join(".", encodedSegments); - } - - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsOrField.PROCESSING_NOTICE); } @@ -102,20 +61,18 @@ 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() { return (Integer) this.getFieldValue(UsOrField.ADDITIONAL_DATA_PROCESSING_CONSENT); } - + public Integer getMspaCoveredTransaction() { return (Integer) this.getFieldValue(UsOrField.MSPA_COVERED_TRANSACTION); } @@ -128,14 +85,6 @@ public Integer getMspaServiceProviderMode() { return (Integer) this.getFieldValue(UsOrField.MSPA_SERVICE_PROVIDER_MODE); } - 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 2403f09d..4a48a236 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,24 +1,23 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -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 int ID = 22; - public static int VERSION = 1; - public static String NAME = "ustn"; + 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(String encodedString) { - super(); + public UsTn(CharSequence encodedString) { + this(); decode(encodedString); } @@ -34,54 +33,14 @@ public String getName() { @Override public int getVersion() { - return UsTn.VERSION; + return (Integer) this.getFieldValue(UsTnField.VERSION); } @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UsTnCoreSegment()); - segments.add(new UsTnGpcSegment()); - return segments; + protected final UsTnField getGpcSegmentIncludedKey() { + return UsTnField.GPC_SEGMENT_INCLUDED; } - @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(UsTnField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments[1]); - } else { - segments.get(1).setFieldValue(UsTnField.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(UsTnField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encode()); - } - } - - return String.join(".", encodedSegments); - } - - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsTnField.PROCESSING_NOTICE); } @@ -102,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() { @@ -114,7 +72,7 @@ public Integer getKnownChildSensitiveDataConsents() { public Integer getAdditionalDataProcessingConsent() { return (Integer) this.getFieldValue(UsTnField.ADDITIONAL_DATA_PROCESSING_CONSENT); } - + public Integer getMspaCoveredTransaction() { return (Integer) this.getFieldValue(UsTnField.MSPA_COVERED_TRANSACTION); } @@ -127,14 +85,6 @@ public Integer getMspaServiceProviderMode() { return (Integer) this.getFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE); } - 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 ea4fc86e..cd622eb0 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,24 +1,23 @@ package com.iab.gpp.encoder.section; -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 int ID = 16; - public static int VERSION = 1; - public static String NAME = "ustx"; + 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(String encodedString) { - super(); + public UsTx(CharSequence encodedString) { + this(); decode(encodedString); } @@ -34,54 +33,14 @@ public String getName() { @Override public int getVersion() { - return UsTx.VERSION; + return (Integer) this.getFieldValue(UsTxField.VERSION); } @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UsTxCoreSegment()); - segments.add(new UsTxGpcSegment()); - return segments; + protected final UsTxField getGpcSegmentIncludedKey() { + return UsTxField.GPC_SEGMENT_INCLUDED; } - @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(UsTxField.GPC_SEGMENT_INCLUDED, true); - segments.get(1).decode(encodedSegments[1]); - } else { - segments.get(1).setFieldValue(UsTxField.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(UsTxField.GPC_SEGMENT_INCLUDED).equals(true)) { - encodedSegments.add(segments.get(1).encode()); - } - } - - return String.join(".", encodedSegments); - } - - public Integer getProcessingNotice() { return (Integer) this.getFieldValue(UsTxField.PROCESSING_NOTICE); } @@ -102,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,14 +85,6 @@ public Integer getMspaServiceProviderMode() { return (Integer) this.getFieldValue(UsTxField.MSPA_SERVICE_PROVIDER_MODE); } - 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 1c605fec..3d9731d5 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,23 +1,21 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -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 static int ID = 11; - public static int VERSION = 1; - public static String NAME = "usut"; +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(String encodedString) { - super(); + public UsUt(CharSequence encodedString) { + this(); decode(encodedString); } @@ -33,43 +31,9 @@ public String getName() { @Override public int getVersion() { - return UsUt.VERSION; - } - - @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UsUtCoreSegment()); - return segments; - } - - @Override - protected List decodeSection(String encodedString) { - List segments = initializeSegments(); - - if(encodedString != null && !encodedString.isEmpty()) { - String[] encodedSegments = encodedString.split("\\."); - - for(int i=0; i i) { - segments.get(i).decode(encodedSegments[i]); - } - } - } - - return segments; - } - - @Override - protected String encodeSection(List segments) { - List encodedSegments = new ArrayList<>(); - for(EncodableSegment segment : segments) { - encodedSegments.add(segment.encode()); - } - return String.join(".", encodedSegments); + return (Integer) this.getFieldValue(UsUtField.VERSION); } - public Integer getSharingNotice() { return (Integer) this.getFieldValue(UsUtField.SHARING_NOTICE); } @@ -94,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() { @@ -114,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 568c6575..148283b9 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,23 +1,21 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -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 int ID = 9; - public static int VERSION = 1; - public static String NAME = "usva"; + 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(String encodedString) { - super(); + public UsVa(CharSequence encodedString) { + this(); decode(encodedString); } @@ -33,43 +31,9 @@ public String getName() { @Override public int getVersion() { - return UsVa.VERSION; + return (Integer) this.getFieldValue(UsVaField.VERSION); } - @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UsVaCoreSegment()); - return segments; - } - - @Override - protected List decodeSection(String encodedString) { - List segments = initializeSegments(); - - if(encodedString != null && !encodedString.isEmpty()) { - String[] encodedSegments = encodedString.split("\\."); - - for (int i = 0; i < segments.size(); i++) { - if (encodedSegments.length > i) { - segments.get(i).decode(encodedSegments[i]); - } - } - } - - return segments; - } - - @Override - protected String encodeSection(List segments) { - List encodedSegments = new ArrayList<>(); - for (EncodableSegment segment : segments) { - encodedSegments.add(segment.encode()); - } - return String.join(".", encodedSegments); - } - - public Integer getSharingNotice() { return (Integer) this.getFieldValue(UsVaField.SHARING_NOTICE); } @@ -90,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 e70261e4..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,23 +1,20 @@ package com.iab.gpp.encoder.section; -import java.util.ArrayList; -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 static int ID = 6; - public static int VERSION = 1; - public static String NAME = "uspv1"; +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(String encodedString) { - super(); + public UspV1(CharSequence encodedString) { + this(); decode(encodedString); } @@ -36,40 +33,6 @@ public int getVersion() { return UspV1.VERSION; } - @Override - protected List initializeSegments() { - List segments = new ArrayList<>(); - segments.add(new UspV1CoreSegment()); - return segments; - } - - @Override - protected List decodeSection(String encodedString) { - List segments = initializeSegments(); - - if(encodedString != null && !encodedString.isEmpty()) { - String[] encodedSegments = encodedString.split("\\."); - - for(int i=0; i i) { - segments.get(i).decode(encodedSegments[i]); - } - } - } - - return segments; - } - - @Override - protected String encodeSection(List segments) { - List encodedSegments = new ArrayList<>(); - for(EncodableSegment segment : segments) { - encodedSegments.add(segment.encode()); - } - return String.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..ce5fc8d3 --- /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, boolean optional) { + super(fieldNames, optional); + } + + 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 8726e16d..3b7347a2 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,76 +1,112 @@ package com.iab.gpp.encoder.segment; 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 T fields; + protected final FieldNames fieldNames; + protected final Object[] values; + private boolean dirty; + private final boolean optional; - private String encodedString = null; - - private boolean dirty = false; - private boolean decoded = true; - - public AbstractLazilyEncodableSegment() { - this.fields = initializeFields(); + protected AbstractLazilyEncodableSegment(FieldNames fieldNames, boolean optional) { + this.fieldNames = fieldNames; + this.values = new Object[fieldNames.size()]; + this.optional = optional; } - protected abstract T initializeFields(); + @Override + public boolean shouldEncode() { + if (!optional) { + return true; + } + int size = fieldNames.size(); + for (int i = 0; i < size; i++) { + if (fieldNames.get(i).isPresent(values, i)) { + return true; + } + } + return false; + } - protected abstract String encodeSegment(T fields); + @Override + public final E resolveKey(FieldKey fieldName) { + return fieldNames.resolveKey(fieldName); + } - protected abstract void decodeSegment(String encodedString, T Fields); + @Override + public final boolean hasField(E key) { + return fieldNames.getIndex(key) != null; + } - public boolean hasField(String fieldName) { - return this.fields.containsKey(fieldName); + @Override + public final boolean isDirty() { + if (dirty) { + return true; + } + int size = fieldNames.size(); + for (int i = 0; i < size; i++) { + if (fieldNames.get(i).isDirty(values, i)) { + return true; + } + } + return false; } - public Object getFieldValue(String fieldName) { - if (!this.decoded) { - this.decodeSegment(this.encodedString, this.fields); - this.dirty = false; - 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); } + } - if (this.fields.containsKey(fieldName)) { - return this.fields.get(fieldName).getValue(); + @Override + public final Object getFieldValue(E fieldName) { + ensureDecode(); + return getFieldValueUnsafe(fieldName); + } + + @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 + "'"); } } - public void setFieldValue(String fieldName, Object value) { - if (!this.decoded) { - this.decodeSegment(this.encodedString, this.fields); - this.dirty = false; - this.decoded = true; - } + @Override + public final void setFieldValue(E fieldName, Object value) { + ensureDecode(); + setFieldValueUnsafe(fieldName, value); + } - if (this.fields.containsKey(fieldName)) { - this.fields.get(fieldName).setValue(value); - this.dirty = true; + 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"); } } - public String encode() { - if (this.encodedString == null || this.encodedString.isEmpty() || this.dirty) { - this.validate(); - this.encodedString = encodeSegment(this.fields); - this.dirty = false; - this.decoded = true; + @Override + public String toString() { + ensureDecode(); + StringBuilder sb = new StringBuilder(); + sb.append("{name=").append(getClass().getSimpleName()); + int size = fieldNames.size(); + for (int i = 0; i < size; i++) { + sb.append(", ").append(fieldNames.get(i).getName()).append('=').append(values[i]); } - - return this.encodedString; + sb.append('}'); + return sb.toString(); } - - public void decode(String encodedString) { - this.encodedString = encodedString; - this.dirty = false; - this.decoded = false; - } - - } 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..c5aff710 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/Base64Segment.java @@ -0,0 +1,21 @@ +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, boolean optional) { + super(fieldNames, optional); + } + + public Base64Segment(FieldNames fieldNames) { + this(fieldNames, false); + } + + 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 d2363a82..4cf3463d 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,20 +1,18 @@ package com.iab.gpp.encoder.segment; -import java.util.List; +import com.iab.gpp.encoder.field.FieldKey; +import com.iab.gpp.encoder.section.AbstractEncodable; -public interface EncodableSegment { +public abstract class EncodableSegment & FieldKey> extends AbstractEncodable { + public abstract E resolveKey(FieldKey fieldName); - List getFieldNames(); + public abstract boolean hasField(E fieldName); - boolean hasField(String fieldName); + public abstract Object getFieldValue(E fieldName); - Object getFieldValue(String fieldName); + protected abstract Object getFieldValueUnsafe(E key); - void setFieldValue(String fieldName, Object value); + public abstract void setFieldValue(E fieldName, Object value); - String encode(); - - void decode(String encodedString); - - default void validate() {}; + public abstract boolean shouldEncode(); } 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 5f944d90..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/HeaderV1CoreSegment.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.ArrayList; -import java.util.List; -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.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 class HeaderV1CoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public HeaderV1CoreSegment() { - super(); - } - - public HeaderV1CoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return HeaderV1Field.HEADER_CORE_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - 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(new ArrayList<>())); - 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 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 fbdc9479..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1CoreSegment.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -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.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 class TcfCaV1CoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public TcfCaV1CoreSegment() { - super(); - } - - public TcfCaV1CoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return TcfCaV1Field.TCFCAV1_CORE_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - ZonedDateTime date = ZonedDateTime.now(); - - EncodableBitStringFields fields = new EncodableBitStringFields(); - 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( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false))); - fields.put(TcfCaV1Field.PURPOSES_EXPRESS_CONSENT, - new EncodableFixedBitfield(Arrays.asList(false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false, false, false, false))); - fields.put(TcfCaV1Field.PURPOSES_IMPLIED_CONSENT, - new EncodableFixedBitfield(Arrays.asList(false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false, false, false, false))); - fields.put(TcfCaV1Field.VENDOR_EXPRESS_CONSENT, new EncodableOptimizedFixedRange(new ArrayList<>())); - fields.put(TcfCaV1Field.VENDOR_IMPLIED_CONSENT, new EncodableOptimizedFixedRange(new ArrayList<>())); - fields.put(TcfCaV1Field.PUB_RESTRICTIONS, new EncodableArrayOfFixedIntegerRanges(6, 2, new ArrayList<>(), 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 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 cbd7e90f..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1DisclosedVendorsSegment.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.ArrayList; -import java.util.List; -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.EncodableOptimizedFixedRange; -import com.iab.gpp.encoder.error.DecodingException; -import com.iab.gpp.encoder.field.EncodableBitStringFields; -import com.iab.gpp.encoder.field.TcfCaV1Field; - -public class TcfCaV1DisclosedVendorsSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public TcfCaV1DisclosedVendorsSegment() { - super(); - } - - public TcfCaV1DisclosedVendorsSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return TcfCaV1Field.TCFCAV1_DISCLOSED_VENDORS_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(TcfCaV1Field.DISCLOSED_VENDORS_SEGMENT_TYPE, new EncodableFixedInteger(3, 1)); - fields.put(TcfCaV1Field.DISCLOSED_VENDORS, new EncodableOptimizedFixedRange(new ArrayList<>())); - 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 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 1ab89c0b..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfCaV1PublisherPurposesSegment.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -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.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 class TcfCaV1PublisherPurposesSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public TcfCaV1PublisherPurposesSegment() { - super(); - } - - public TcfCaV1PublisherPurposesSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return TcfCaV1Field.TCFCAV1_PUBLISHER_PURPOSES_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(TcfCaV1Field.PUB_PURPOSES_SEGMENT_TYPE, new EncodableFixedInteger(3, 3)); - fields.put(TcfCaV1Field.PUB_PURPOSES_EXPRESS_CONSENT, - new EncodableFixedBitfield(Arrays.asList(false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false, false, false, false))); - fields.put(TcfCaV1Field.PUB_PURPOSES_IMPLIED_CONSENT, - new EncodableFixedBitfield(Arrays.asList(false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false, false, false, false))); - - 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, new ArrayList<>())); - - fields.put(TcfCaV1Field.CUSTOM_PURPOSES_IMPLIED_CONSENT, - new EncodableFlexibleBitfield(getLengthSupplier, new ArrayList<>())); - 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 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 5b516bde..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2CoreSegment.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.TraditionalBase64UrlEncoder; -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 class TcfEuV2CoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = TraditionalBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public TcfEuV2CoreSegment() { - super(); - } - - public TcfEuV2CoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return TcfEuV2Field.TCFEUV2_CORE_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - ZonedDateTime date = ZonedDateTime.now(); - - EncodableBitStringFields fields = new EncodableBitStringFields(); - 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( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false))); - fields.put(TcfEuV2Field.PURPOSE_CONSENTS, - new EncodableFixedBitfield(Arrays.asList(false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false, false, false, false))); - fields.put(TcfEuV2Field.PURPOSE_LEGITIMATE_INTERESTS, - new EncodableFixedBitfield(Arrays.asList(false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false, false, false, false))); - 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(new ArrayList<>())); - fields.put(TcfEuV2Field.VENDOR_LEGITIMATE_INTERESTS, new EncodableOptimizedFixedRange(new ArrayList<>())); - - fields.put(TcfEuV2Field.PUBLISHER_RESTRICTIONS, new EncodableArrayOfFixedIntegerRanges(6, 2, new ArrayList<>(), 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 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 0b751017..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2PublisherPurposesSegment.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -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.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 class TcfEuV2PublisherPurposesSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = TraditionalBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public TcfEuV2PublisherPurposesSegment() { - super(); - } - - public TcfEuV2PublisherPurposesSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return TcfEuV2Field.TCFEUV2_PUBLISHER_PURPOSES_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(TcfEuV2Field.PUBLISHER_PURPOSES_SEGMENT_TYPE, new EncodableFixedInteger(3, 3)); - fields.put(TcfEuV2Field.PUBLISHER_CONSENTS, - new EncodableFixedBitfield(Arrays.asList(false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false, false, false, false))); - fields.put(TcfEuV2Field.PUBLISHER_LEGITIMATE_INTERESTS, - new EncodableFixedBitfield(Arrays.asList(false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false, false, false, false))); - - 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, new ArrayList<>())); - - fields.put(TcfEuV2Field.PUBLISHER_CUSTOM_LEGITIMATE_INTERESTS, - new EncodableFlexibleBitfield(getLengthSupplier, new ArrayList<>())); - 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 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 e09b48bb..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2VendorsAllowedSegment.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.ArrayList; -import java.util.List; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.TraditionalBase64UrlEncoder; -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 class TcfEuV2VendorsAllowedSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = TraditionalBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public TcfEuV2VendorsAllowedSegment() { - super(); - } - - public TcfEuV2VendorsAllowedSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return TcfEuV2Field.TCFEUV2_VENDORS_ALLOWED_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(TcfEuV2Field.VENDORS_ALLOWED_SEGMENT_TYPE, new EncodableFixedInteger(3, 2)); - fields.put(TcfEuV2Field.VENDORS_ALLOWED, new EncodableOptimizedFixedRange(new ArrayList<>())); - 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 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 c66b012d..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TcfEuV2VendorsDisclosedSegment.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.ArrayList; -import java.util.List; -import com.iab.gpp.encoder.base64.AbstractBase64UrlEncoder; -import com.iab.gpp.encoder.base64.TraditionalBase64UrlEncoder; -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 class TcfEuV2VendorsDisclosedSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = TraditionalBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public TcfEuV2VendorsDisclosedSegment() { - super(); - } - - public TcfEuV2VendorsDisclosedSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return TcfEuV2Field.TCFEUV2_VENDORS_DISCLOSED_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(TcfEuV2Field.VENDORS_DISCLOSED_SEGMENT_TYPE, new EncodableFixedInteger(3, 1)); - fields.put(TcfEuV2Field.VENDORS_DISCLOSED, new EncodableOptimizedFixedRange(new ArrayList<>())); - 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 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..4f1432b4 --- /dev/null +++ b/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/TraditionalBase64Segment.java @@ -0,0 +1,22 @@ +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, boolean optional) { + super(fieldNames, optional); + } + + public TraditionalBase64Segment(FieldNames fieldNames) { + this(fieldNames, false); + } + + protected final 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 25584c00..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCaCoreSegment.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; -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.UsCaField; -import com.iab.gpp.encoder.section.UsCa; - -public class UsCaCoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsCaCoreSegment() { - super(); - } - - public UsCaCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsCaField.USCA_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(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 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 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 19a36702..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCaGpcSegment.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.List; -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.UsCaField; - -public class UsCaGpcSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsCaGpcSegment() { - super(); - } - - public UsCaGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsCaField.USCA_GPC_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(UsCaField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsCaField.GPC_SEGMENT_INCLUDED, new EncodableBoolean(true)); - fields.put(UsCaField.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 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 1f6c14c7..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCoCoreSegment.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; -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.UsCoField; -import com.iab.gpp.encoder.section.UsCo; - -public class UsCoCoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsCoCoreSegment() { - super(); - } - - public UsCoCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsCoField.USCO_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(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 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 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 7be0d974..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCoGpcSegment.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.List; -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.UsCoField; - -public class UsCoGpcSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsCoGpcSegment() { - super(); - } - - public UsCoGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsCoField.USCO_GPC_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(UsCoField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsCoField.GPC_SEGMENT_INCLUDED, new EncodableBoolean(true)); - fields.put(UsCoField.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 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 066ad749..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCtCoreSegment.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; -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.UsCtField; -import com.iab.gpp.encoder.section.UsCt; - -public class UsCtCoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsCtCoreSegment() { - super(); - } - - public UsCtCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsCtField.USCT_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(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 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 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 fb009c89..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsCtGpcSegment.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.List; -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.UsCtField; - -public class UsCtGpcSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsCtGpcSegment() { - super(); - } - - public UsCtGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsCtField.USCT_GPC_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(UsCtField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsCtField.GPC_SEGMENT_INCLUDED, new EncodableBoolean(true)); - fields.put(UsCtField.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 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 72953219..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsDeCoreSegment.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; -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.UsDeField; -import com.iab.gpp.encoder.section.UsDe; - -public class UsDeCoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsDeCoreSegment() { - super(); - } - - public UsDeCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsDeField.USDE_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(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 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 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 66fe0431..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsDeGpcSegment.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.List; -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.UsDeField; - -public class UsDeGpcSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsDeGpcSegment() { - super(); - } - - public UsDeGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsDeField.USDE_GPC_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(UsDeField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsDeField.GPC_SEGMENT_INCLUDED, new EncodableBoolean(true)); - fields.put(UsDeField.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 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 02c480aa..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsFlCoreSegment.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; -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.UsFlField; -import com.iab.gpp.encoder.section.UsFl; - -public class UsFlCoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsFlCoreSegment() { - super(); - } - - public UsFlCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsFlField.USFL_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(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 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 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 aa3bd706..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsIaCoreSegment.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; -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.UsIaField; -import com.iab.gpp.encoder.section.UsIa; - -public class UsIaCoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsIaCoreSegment() { - super(); - } - - public UsIaCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsIaField.USIA_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(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 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 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 12cb0bd6..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsIaGpcSegment.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.List; -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.UsIaField; - -public class UsIaGpcSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsIaGpcSegment() { - super(); - } - - public UsIaGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsIaField.USIA_GPC_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(UsIaField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsIaField.GPC_SEGMENT_INCLUDED, new EncodableBoolean(true)); - fields.put(UsIaField.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 UsIaGpcSegment '" + encodedString + "'", e); - } - } -} 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 deleted file mode 100644 index 1d48ea10..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMnCoreSegment.java +++ /dev/null @@ -1,97 +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.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)) - .withValidator(nullableBooleanAsTwoBitIntegerListValidator)); - fields.put(UsMnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, - new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator)); - 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 deleted file mode 100644 index fbeb9df0..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMnGpcSegment.java +++ /dev/null @@ -1,61 +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.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/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 4daa1872..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMtCoreSegment.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; -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.UsMtField; -import com.iab.gpp.encoder.section.UsMt; - -public class UsMtCoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsMtCoreSegment() { - super(); - } - - public UsMtCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsMtField.USMT_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(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 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 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 99be5310..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsMtGpcSegment.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.List; -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.UsMtField; - -public class UsMtGpcSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsMtGpcSegment() { - super(); - } - - public UsMtGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsMtField.USMT_GPC_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(UsMtField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsMtField.GPC_SEGMENT_INCLUDED, new EncodableBoolean(true)); - fields.put(UsMtField.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 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 0c4769ad..0907035c 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,117 +1,34 @@ package com.iab.gpp.encoder.segment; -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; 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.bitstring.BitString; import com.iab.gpp.encoder.field.UsNatField; -import com.iab.gpp.encoder.section.UsNat; -public class UsNatCoreSegment extends AbstractLazilyEncodableSegment { +public final class UsNatCoreSegment extends AbstractBase64Segment { - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); + private static final int VERSION_LENGTH = 6; public UsNatCoreSegment() { - super(); + super(UsNatField.USNAT_CORE_SEGMENT_FIELD_NAMES, false); } - public UsNatCoreSegment(String encodedString) { - super(); - this.decode(encodedString); + protected AbstractBase64UrlEncoder getBase64UrlEncoder() { + return CompressedBase64UrlEncoder.getInstance(); } @Override - public List getFieldNames() { - return UsNatField.USNAT_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(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 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); - - // 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() == 60) { - bitString = - bitString.substring(0, 48) + "00000000" + bitString.substring(48, 52) + "00" + bitString.substring(52, 60) + "00"; - } - else if (bitString.length() == 66) { - bitString = - bitString.substring(0, 48) + "00000000" + bitString.substring(48, 52) + "00" + bitString.substring(52, 62); - } - - bitStringEncoder.decode(bitString, getFieldNames(), 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 54fc1d40..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNatGpcSegment.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.List; -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.UsNatField; - -public class UsNatGpcSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsNatGpcSegment() { - super(); - } - - public UsNatGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsNatField.USNAT_GPC_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(UsNatField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsNatField.GPC_SEGMENT_INCLUDED, new EncodableBoolean(true)); - fields.put(UsNatField.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 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 626b9c93..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNeCoreSegment.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; -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.UsNeField; -import com.iab.gpp.encoder.section.UsNe; - -public class UsNeCoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsNeCoreSegment() { - super(); - } - - public UsNeCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsNeField.USNE_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(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 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 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 6d050371..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNeGpcSegment.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.List; -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.UsNeField; - -public class UsNeGpcSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsNeGpcSegment() { - super(); - } - - public UsNeGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsNeField.USNE_GPC_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(UsNeField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsNeField.GPC_SEGMENT_INCLUDED, new EncodableBoolean(true)); - fields.put(UsNeField.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 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 76fedd66..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNhCoreSegment.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; -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.UsNhField; -import com.iab.gpp.encoder.section.UsNh; - -public class UsNhCoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsNhCoreSegment() { - super(); - } - - public UsNhCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsNhField.USNH_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(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 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 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 86587dd0..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNhGpcSegment.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.List; -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.UsNhField; - -public class UsNhGpcSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsNhGpcSegment() { - super(); - } - - public UsNhGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsNhField.USNH_GPC_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(UsNhField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsNhField.GPC_SEGMENT_INCLUDED, new EncodableBoolean(true)); - fields.put(UsNhField.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 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 e71fecc1..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNjCoreSegment.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; -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.UsNjField; -import com.iab.gpp.encoder.section.UsNj; - -public class UsNjCoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsNjCoreSegment() { - super(); - } - - public UsNjCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsNjField.USNJ_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(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 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 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 37ee7d34..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsNjGpcSegment.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.List; -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.UsNjField; - -public class UsNjGpcSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsNjGpcSegment() { - super(); - } - - public UsNjGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsNjField.USNJ_GPC_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(UsNjField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsNjField.GPC_SEGMENT_INCLUDED, new EncodableBoolean(true)); - fields.put(UsNjField.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 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 c09ebd15..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsOrCoreSegment.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; -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.UsOrField; -import com.iab.gpp.encoder.section.UsOr; - -public class UsOrCoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsOrCoreSegment() { - super(); - } - - public UsOrCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsOrField.USOR_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(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 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 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 6818e7de..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsOrGpcSegment.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.List; -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.UsOrField; - -public class UsOrGpcSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsOrGpcSegment() { - super(); - } - - public UsOrGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsOrField.USOR_GPC_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(UsOrField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsOrField.GPC_SEGMENT_INCLUDED, new EncodableBoolean(true)); - fields.put(UsOrField.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 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 425f1305..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTnCoreSegment.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; -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.UsTnField; -import com.iab.gpp.encoder.section.UsTn; - -public class UsTnCoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsTnCoreSegment() { - super(); - } - - public UsTnCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsTnField.USTN_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(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 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 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 f4a0b32c..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTnGpcSegment.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.List; -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.UsTnField; - -public class UsTnGpcSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsTnGpcSegment() { - super(); - } - - public UsTnGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsTnField.USTN_GPC_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(UsTnField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsTnField.GPC_SEGMENT_INCLUDED, new EncodableBoolean(true)); - fields.put(UsTnField.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 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 a983a2ce..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTxCoreSegment.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; -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.UsTxField; -import com.iab.gpp.encoder.section.UsTx; - -public class UsTxCoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsTxCoreSegment() { - super(); - } - - public UsTxCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsTxField.USTX_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(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 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 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 df936b51..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsTxGpcSegment.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.List; -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.UsTxField; - -public class UsTxGpcSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsTxGpcSegment() { - super(); - } - - public UsTxGpcSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsTxField.USTX_GPC_SEGMENT_FIELD_NAMES; - } - - @Override - protected EncodableBitStringFields initializeFields() { - EncodableBitStringFields fields = new EncodableBitStringFields(); - fields.put(UsTxField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1)); - fields.put(UsTxField.GPC_SEGMENT_INCLUDED, new EncodableBoolean(true)); - fields.put(UsTxField.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 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 1b394443..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsUtCoreSegment.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; -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.UsUtField; -import com.iab.gpp.encoder.section.UsUt; - -public class UsUtCoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsUtCoreSegment() { - super(); - } - - public UsUtCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsUtField.USUT_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(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 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 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 cb57fb92..00000000 --- a/iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsVaCoreSegment.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.iab.gpp.encoder.segment; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; -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.UsVaField; -import com.iab.gpp.encoder.section.UsVa; - -public class UsVaCoreSegment extends AbstractLazilyEncodableSegment { - - private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); - private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance(); - - public UsVaCoreSegment() { - super(); - } - - public UsVaCoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UsVaField.USVA_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(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 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 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 59b3c557..b845f925 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,64 +1,37 @@ package com.iab.gpp.encoder.segment; -import java.util.List; -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 class UspV1CoreSegment extends AbstractLazilyEncodableSegment { +public final class UspV1CoreSegment extends AbstractLazilyEncodableSegment { public UspV1CoreSegment() { - super(); - } - - public UspV1CoreSegment(String encodedString) { - super(); - this.decode(encodedString); - } - - @Override - public List getFieldNames() { - return UspV1Field.USPV1_CORE_SEGMENT_FIELD_NAMES; + super(UspV1Field.USPV1_CORE_SEGMENT_FIELD_NAMES, false); } @Override - protected GenericFields initializeFields() { - GenericFields fields = new GenericFields(); - 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 String encodeSegment(GenericFields fields) { - String str = ""; - str += fields.get(UspV1Field.VERSION).getValue(); - str += fields.get(UspV1Field.NOTICE).getValue(); - str += fields.get(UspV1Field.OPT_OUT_SALE).getValue(); - str += fields.get(UspV1Field.LSPA_COVERED).getValue(); + protected CharSequence doEncode() { + StringBuilder str = new StringBuilder(); + 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(String 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(Integer.parseInt(encodedString.substring(0, 1))); - 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 bb5f2336..147c3401 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,14 +1,26 @@ package com.iab.gpp.encoder; -import java.time.ZoneId; -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.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; +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; @@ -29,10 +41,19 @@ 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.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 ZonedDateTime utcDateTime = ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")); + private Instant utcDateTime = + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(); @Test public void testEncodeDefault() { @@ -48,7 +69,7 @@ public void testEncodeDefault() { String gppString = gppModel.encode(); Assertions.assertEquals("DBAA", gppString); - Assertions.assertEquals(new ArrayList<>(), gppModel.getSectionIds()); + Assertions.assertEquals(Set.of(), gppModel.getSectionIds()); Assertions.assertEquals(false, gppModel.hasSection(UspV1.ID)); Assertions.assertEquals(false, gppModel.hasSection(TcfEuV2.ID)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.ID)); @@ -56,7 +77,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 @@ -82,11 +102,10 @@ 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); - 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); @@ -109,7 +128,6 @@ public void testEncodeDefaultAll() { 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)); Assertions.assertEquals(true, gppModel.hasSection(UspV1.NAME)); @@ -133,22 +151,26 @@ public void testEncodeDefaultAll() { String gppString = gppModel.encode(); Assertions.assertEquals( - "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~BAAAAAQA.QA", - gppString); + "DBACOYs~CPSG_8APSG_8AAAAAAENAAFgAAAAAAAAAAAAAAAAAAAA.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 @@ -166,7 +188,7 @@ public void testEncodeUspv1() { gppModel.setFieldValue(UspV1.NAME, UspV1Field.OPT_OUT_SALE, 'N'); gppModel.setFieldValue(UspV1.NAME, UspV1Field.LSPA_COVERED, 'N'); - Assertions.assertEquals(Arrays.asList(6), gppModel.getSectionIds()); + Assertions.assertEquals(Set.of(6), gppModel.getSectionIds()); Assertions.assertEquals(true, gppModel.hasSection(UspV1.ID)); Assertions.assertEquals(false, gppModel.hasSection(TcfEuV2.ID)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.ID)); @@ -175,12 +197,13 @@ 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); + Assertions.assertEquals("1YNN", gppModel.encodeSection(UspV1.ID)); + Assertions.assertEquals("1YNN", gppModel.encodeSection(UspV1.NAME)); - Assertions.assertEquals(Arrays.asList(6), gppModel.getSectionIds()); + Assertions.assertEquals(Set.of(6), gppModel.getSectionIds()); + Assertions.assertEquals(Set.of(6), gppModel.getHeader().getSectionsIds()); Assertions.assertEquals(true, gppModel.hasSection(UspV1.ID)); Assertions.assertEquals(false, gppModel.hasSection(TcfEuV2.ID)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.ID)); @@ -188,7 +211,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 @@ -212,10 +234,10 @@ 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(Set.of(2), gppModel.getSectionIds()); Assertions.assertEquals(false, gppModel.hasSection(UspV1.ID)); Assertions.assertEquals(true, gppModel.hasSection(TcfEuV2.ID)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.ID)); @@ -224,13 +246,12 @@ 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.IAAA", gppString); Assertions.assertEquals(2, gppString.split("~").length); - Assertions.assertEquals(Arrays.asList(2), gppModel.getSectionIds()); + Assertions.assertEquals(Set.of(2), gppModel.getSectionIds()); Assertions.assertEquals(false, gppModel.hasSection(UspV1.ID)); Assertions.assertEquals(true, gppModel.hasSection(TcfEuV2.ID)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.ID)); @@ -238,7 +259,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 @@ -258,10 +278,10 @@ 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(Set.of(2), gppModel.getSectionIds()); Assertions.assertEquals(false, gppModel.hasSection(UspV1.NAME)); Assertions.assertEquals(true, gppModel.hasSection(TcfEuV2.NAME)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.NAME)); @@ -275,15 +295,15 @@ 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.IAAA~1YNN", gppString); Assertions.assertEquals(3, gppString.split("~").length); - Assertions.assertEquals(Arrays.asList(2, 6), gppModel.getSectionIds()); + Assertions.assertEquals(Set.of(2, 6), gppModel.getSectionIds()); Assertions.assertEquals(true, gppModel.hasSection(UspV1.NAME)); Assertions.assertEquals(true, gppModel.hasSection(TcfEuV2.NAME)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.NAME)); - } @Test @@ -297,7 +317,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); @@ -308,11 +327,10 @@ 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(Set.of(2), gppModel.getSectionIds()); Assertions.assertEquals(false, gppModel.hasSection(UspV1.ID)); Assertions.assertEquals(true, gppModel.hasSection(TcfEuV2.ID)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.ID)); @@ -337,27 +355,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, - Arrays.asList(false, false, false, false, false, false, true, true, true, true, true, true)); - gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.PURPOSES_EXPRESS_CONSENT, - Arrays.asList(true, true, true, true, true, true, false, false, false, false, false, false, true, true, true, - true, true, true, false, false, false, false, false, false)); - gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.PURPOSES_IMPLIED_CONSENT, - Arrays.asList(false, false, false, false, false, false, true, true, true, true, true, true, false, false, false, - false, false, false, true, true, true, true, true, true)); - 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(true, true, true, false, false, false, true, true, true, false, false, false, true, true, true, - false, false, false, true, true, true, false, false, false)); - gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.PUB_PURPOSES_IMPLIED_CONSENT, - Arrays.asList(false, false, false, true, true, true, false, false, false, true, true, true, false, false, false, - true, true, true, false, false, false, true, true, true)); + 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, + Arrays.asList(0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17)); + 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, + Arrays.asList(0, 1, 2, 6, 7, 8, 12, 13, 14, 18, 19, 20)); + 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, - Arrays.asList(false, true, false)); - gppModel.setFieldValue(TcfCaV1.NAME, TcfCaV1Field.CUSTOM_PURPOSES_IMPLIED_CONSENT, - Arrays.asList(true, false, true)); + 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); @@ -370,15 +395,14 @@ 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", + "DBACOeA~CPSG_8APSG_8ANwAAAENAwCAAAAAAAAAAAAAAAAAAAAA.IAAA~BPSG_8APSG_8AAyACAENGdCgf_gfgAfgfgBgABABAAABAB4AACACAAA.fHHHA4444ao~1YNN", gppString); Assertions.assertEquals(4, gppString.split("~").length); - Assertions.assertEquals(Arrays.asList(2, 5, 6), gppModel.getSectionIds()); + Assertions.assertEquals(Set.of(2, 5, 6), gppModel.getSectionIds()); Assertions.assertEquals(true, gppModel.hasSection(UspV1.ID)); Assertions.assertEquals(true, gppModel.hasSection(TcfEuV2.ID)); Assertions.assertEquals(true, gppModel.hasSection(TcfCaV1.ID)); @@ -400,13 +424,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 = - "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"; + "DBACOcGA~CPSG_8APSG_8AAAAAAENAAFgAAAAAAAAAAAAAAAAAAAA.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~YBAA.AQAA~ZBAA.AQAA~aBAA.AQAA~bBAA.AQAA"; GppModel gppModel = new GppModel(gppString); Assertions.assertEquals(true, gppModel.hasSection(TcfEuV2.NAME)); @@ -436,7 +459,7 @@ public void testDecodeUspv1() { String gppString = "DBABTA~1YNN"; GppModel gppModel = new GppModel(gppString); - Assertions.assertEquals(Arrays.asList(6), gppModel.getSectionIds()); + Assertions.assertEquals(Set.of(6), gppModel.getSectionIds()); Assertions.assertEquals(true, gppModel.hasSection(UspV1.ID)); Assertions.assertEquals(false, gppModel.hasSection(TcfEuV2.ID)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.ID)); @@ -459,7 +482,7 @@ public void testDecodeTcfEuV2() { String gppString = "DBABMA~CPSG_8APSG_8ANwAAAENAwCAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA"; GppModel gppModel = new GppModel(gppString); - Assertions.assertEquals(Arrays.asList(2), gppModel.getSectionIds()); + Assertions.assertEquals(Set.of(2), gppModel.getSectionIds()); Assertions.assertEquals(false, gppModel.hasSection(UspV1.ID)); Assertions.assertEquals(true, gppModel.hasSection(TcfEuV2.ID)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.ID)); @@ -472,29 +495,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 @@ -502,7 +540,7 @@ public void testDecodeUspv1AndTcfEuV2() { String gppString = "DBACNYA~CPSG_8APSG_8ANwAAAENAwCAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA~1YNN"; GppModel gppModel = new GppModel(gppString); - Assertions.assertEquals(Arrays.asList(2, 6), gppModel.getSectionIds()); + Assertions.assertEquals(Set.of(2, 6), gppModel.getSectionIds()); Assertions.assertEquals(true, gppModel.hasSection(UspV1.ID)); Assertions.assertEquals(true, gppModel.hasSection(TcfEuV2.ID)); Assertions.assertEquals(false, gppModel.hasSection(TcfCaV1.ID)); @@ -511,7 +549,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)); @@ -524,29 +561,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(); @@ -567,7 +619,7 @@ public void testDecodeUspv1AndTcfEuV2AndTcfCaV1() { "DBACOeA~CPSG_8APSG_8ANwAAAENAwCAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA~BPSG_8APSG_8AAyACAENGdCgf_gfgAfgfgBgABABAAABAB4AACACAAA.fHHHA4444ao~1YNN"; GppModel gppModel = new GppModel(gppString); - Assertions.assertEquals(Arrays.asList(2, 5, 6), gppModel.getSectionIds()); + Assertions.assertEquals(Set.of(2, 5, 6), gppModel.getSectionIds()); Assertions.assertEquals(true, gppModel.hasSection(UspV1.NAME)); Assertions.assertEquals(true, gppModel.hasSection(TcfEuV2.NAME)); Assertions.assertEquals(true, gppModel.hasSection(TcfCaV1.NAME)); @@ -580,15 +632,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(); @@ -607,33 +667,27 @@ public void testDecodeUspv1AndTcfEuV2AndTcfCaV1() { Assertions.assertEquals(2, tcfCaV1Section.getCmpVersion()); Assertions.assertEquals(413, tcfCaV1Section.getVendorListVersion()); Assertions.assertEquals(true, tcfCaV1Section.getUseNonStandardStacks()); - Assertions.assertEquals(Arrays.asList(false, false, false, false, false, false, true, true, true, true, true, true), - tcfCaV1Section.getSpecialFeatureExpressConsent()); - Assertions - .assertEquals( - Arrays.asList(true, true, true, true, true, true, false, false, false, false, false, false, true, true, - true, true, true, true, false, false, false, false, false, false), - tcfCaV1Section.getPurposesExpressConsent()); - Assertions - .assertEquals( - Arrays.asList(false, false, false, false, false, false, true, true, true, true, true, true, false, false, - false, false, false, false, true, true, true, true, true, true), - tcfCaV1Section.getPurposesImpliedConsent()); - Assertions.assertEquals(Arrays.asList(12, 24, 48), tcfCaV1Section.getVendorExpressConsent()); - Assertions.assertEquals(Arrays.asList(18, 30), tcfCaV1Section.getVendorImpliedConsent()); - Assertions - .assertEquals( - Arrays.asList(true, true, true, false, false, false, true, true, true, false, false, false, true, true, - true, false, false, false, true, true, true, false, false, false), - tcfCaV1Section.getPubPurposesExpressConsent()); - Assertions - .assertEquals( - Arrays.asList(false, false, false, true, true, true, false, false, false, true, true, true, false, false, - false, true, true, true, false, false, false, true, true, true), - tcfCaV1Section.getPubPurposesImpliedConsent()); + 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(3, tcfCaV1Section.getNumCustomPurposes()); - Assertions.assertEquals(Arrays.asList(false, true, false), tcfCaV1Section.getCustomPurposesExpressConsent()); - Assertions.assertEquals(Arrays.asList(true, false, true), tcfCaV1Section.getCustomPurposesImpliedConsent()); + Assertions.assertEquals(Set.of(2), tcfCaV1Section.getCustomPurposesExpressConsent()); + Assertions.assertEquals(Set.of(1, 3), tcfCaV1Section.getCustomPurposesImpliedConsent()); Assertions.assertEquals(utcDateTime, tcfCaV1Section.getCreated()); Assertions.assertEquals(utcDateTime, tcfCaV1Section.getLastUpdated()); @@ -649,8 +703,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_8AAAAAAENAAFgAAAAAAAAAAAAAOAAAABAAAAA.IAAA", gppModel.encode()); } @Test @@ -661,7 +719,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_8AAAAAAENAAFgAAAAAAAAAAAAAOwAQAOgAAAA.IAAA", gppModel.encode()); } @Test @@ -672,104 +731,119 @@ 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", - gppModel.encode()); + Assertions.assertEquals( + "DBABMA~CPSG_8APSG_8AAAAAAENAAFgAAAAAAAAAAAAFpQAwAAgCtAWkAAAAAAA.IAAA", gppModel.encode()); } @Test public void testDecode1() { - GppModel gppModel = new GppModel("DBABMA~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAOAAAABAAAAA.QAAA.IAAA"); - Assertions.assertEquals(Arrays.asList(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(Arrays.asList(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(Arrays.asList(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); + Assertions.assertEquals("BVQqAAAAAgA.QA", gppModel.getUsNatSection().encode()); + 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(true, true, true, true, true, true, true, true, true, true)); - 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()); GppModel decodedModel = new GppModel(fromObjectModel.encode()); Assertions.assertEquals( - Arrays.asList(true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, - false, false, false, false, false, false, false, false, false), + Set.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), decodedModel.getFieldValue(TcfEuV2.NAME, TcfEuV2Field.PURPOSE_CONSENTS)); - Assertions.assertEquals(Arrays.asList(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 @@ -807,7 +881,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'); @@ -817,13 +891,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 bd154790..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 @@ -7,34 +7,42 @@ public class TraditionalBase64UrlEncoderTest { private TraditionalBase64UrlEncoder base64UrlEncoder = TraditionalBase64UrlEncoder.getInstance(); - @Test - public void testEncode1() { - Assertions.assertEquals("DBABMAAA", base64UrlEncoder.encode("0000110000010000000000010011")); - } - - @Test - public void testEncode2() { - Assertions.assertEquals("DBACNYAA", base64UrlEncoder.encode("000011000001000000000010001101011")); - } - - @Test - public void testEncode3() { - Assertions.assertEquals("DBABjwAA", base64UrlEncoder.encode("00001100000100000000000110001111")); - } - @Test public void testDecode1() { - Assertions.assertEquals("000011000001000000000001001100000000000000000000", base64UrlEncoder.decode("DBABMAAA")); + Assertions.assertEquals( + "000011000001000000000001001100000000000000000000", + base64UrlEncoder.decode("DBABMAAA").toString()); } @Test public void testDecode2() { - Assertions.assertEquals("000011000001000000000010001101011000000000000000", base64UrlEncoder.decode("DBACNYAA")); + Assertions.assertEquals( + "000011000001000000000010001101011000000000000000", + base64UrlEncoder.decode("DBACNYAA").toString()); } @Test public void testDecode3() { - Assertions.assertEquals("000011000001000000000001100011110000000000000000", base64UrlEncoder.decode("DBABjwAA")); + 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 d015acd1..00000000 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableBooleanTest.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; - -public class EncodableBooleanTest { - - @Test - public void testSubstring1() throws SubstringException { - Assertions.assertEquals("000000000000000000000000000000000000", - new EncodableDatetime().substring("10000000000000000000000000000000000001", 1)); - } - - @Test - public void testSubstring2() throws SubstringException { - Assertions.assertEquals("111111111111111111111111111111111111", - new EncodableDatetime().substring("01111111111111111111111111111111111110", 1)); - } - -} 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 43d271ba..00000000 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableDatetimeTest.java +++ /dev/null @@ -1,21 +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.error.DecodingException; - -public class EncodableDatetimeTest { - - @Test - public void testSubstring1() throws DecodingException, SubstringException { - Assertions.assertEquals("000000000000000000000000000000000000", - new EncodableDatetime().substring("10000000000000000000000000000000000001", 1)); - } - - @Test - public void testSubstring2() throws DecodingException, SubstringException { - Assertions.assertEquals("111111111111111111111111111111111111", - new EncodableDatetime().substring("01111111111111111111111111111111111110", 1)); - } - -} 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 765d5154..00000000 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFibonacciIntegerRangeTest.java +++ /dev/null @@ -1,14 +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.error.DecodingException; - -public class EncodableFibonacciIntegerRangeTest { - - @Test - public void testSubstring1() throws DecodingException, SubstringException { - Assertions.assertEquals("0000000000100001110110011", - new EncodableFibonacciIntegerRange().substring("100000000001000011101100110", 1)); - } -} diff --git a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFibonacciIntegerTest.java b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFibonacciIntegerTest.java deleted file mode 100644 index 61dd7d0a..00000000 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFibonacciIntegerTest.java +++ /dev/null @@ -1,14 +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.error.DecodingException; - -public class EncodableFibonacciIntegerTest { - - @Test - public void testSubstring1() throws DecodingException, SubstringException { - Assertions.assertEquals("0011", new EncodableFibonacciInteger().substring("100111", 1)); - } - -} 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 89ad98af..00000000 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedBitfieldTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -public class EncodableFixedBitfieldTest { - - @Test - public void testSubstring1() throws SubstringException { - Assertions.assertEquals("000", new EncodableFixedBitfield(3).substring("10001", 1)); - } - - @Test - public void testSubstring2() throws SubstringException { - Assertions.assertEquals("111", new EncodableFixedBitfield(3).substring("01110", 1)); - } - -} 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 7146cc01..00000000 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerListTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -public class EncodableFixedIntegerListTest { - - @Test - public void testSubstring1() throws SubstringException { - Assertions.assertEquals("1000", new EncodableFixedIntegerList(2, 2).substring("10001", 0)); - } - - @Test - public void testSubstring2() throws SubstringException { - Assertions.assertEquals("1110", new EncodableFixedIntegerList(2, 2).substring("01110", 1)); - } - -} 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 0982aa40..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,53 +1,52 @@ package com.iab.gpp.encoder.datatype; -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.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("1000000000010000000000000000111000000000000010100000000000010001", - 1)); - } - - @Test - public void testSubstring2() throws DecodingException, SubstringException { - Assertions.assertEquals("00000000000100000000000011101", new EncodableFixedIntegerRange().substring( - "000010001111010010000110111111111100000000001111010010000110111111111100000000000000000000000000000000000000000100001101000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000001110110000000000010000000000001110100000000000000000000000000000", - 230)); - } - @Test public void testEncode1() throws EncodingException { - EncodableFixedIntegerRange encodableFixedIntegerRange = new EncodableFixedIntegerRange(); - encodableFixedIntegerRange.setValue(Arrays.asList(28)); - Assertions.assertEquals("00000000000100000000000011100", encodableFixedIntegerRange.encode()); + 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)); - Assertions.assertEquals("00000000000100000000000011101", encodableFixedIntegerRange.encode()); + 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("00000000000100000000000011100"); - Assertions.assertEquals(Arrays.asList(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("00000000000100000000000011101"); - Assertions.assertEquals(Arrays.asList(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 709fd156..00000000 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedIntegerTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -public class EncodableFixedIntegerTest { - - @Test - public void testSubstring1() throws SubstringException { - Assertions.assertEquals("000", new EncodableFixedInteger(3).substring("10001", 1)); - } - - @Test - public void testSubstring2() throws SubstringException { - Assertions.assertEquals("111", new EncodableFixedInteger(3).substring("01110", 1)); - } - -} 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 969a6c15..00000000 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/EncodableFixedStringTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.iab.gpp.encoder.datatype; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -public class EncodableFixedStringTest { - - @Test - public void testSubstring1() throws SubstringException { - Assertions.assertEquals("000000000000", new EncodableFixedString(2).substring("10000000000001", 1)); - } - - @Test - public void testSubstring2() throws SubstringException { - Assertions.assertEquals("111111111111", new EncodableFixedString(2).substring("01111111111110", 1)); - } - -} 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 5551b3e4..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,73 +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; public class EncodableOptimizedFixedRangeTest { - private EncodableOptimizedFixedRange encodableOptimizedFixedRange = new EncodableOptimizedFixedRange(); + private EncodableOptimizedFixedRange encodableOptimizedFixedRange = + new EncodableOptimizedFixedRange<>(""); @Test public void testEncode1() { - encodableOptimizedFixedRange.setValue(Arrays.asList(12, 24, 48)); - Assertions.assertEquals("00000000001100000000000000001000000000001000000000000000000000001", - encodableOptimizedFixedRange.encode()); + 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)); - Assertions.assertEquals("00000000000111100000000000000000001000000000001", encodableOptimizedFixedRange.encode()); + 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)); - Assertions.assertEquals("000000000001110000000000000000000000000000001", encodableOptimizedFixedRange.encode()); + 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)); - Assertions.assertEquals("0000000000011101100000000000100000000000011101", encodableOptimizedFixedRange.encode()); + 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("00000000001100000000000000001000000000001000000000000000000000001"); - Assertions.assertEquals(Arrays.asList(12, 24, 48), encodableOptimizedFixedRange.getValue()); + Assertions.assertEquals( + Set.of(12, 24, 48), + encodableOptimizedFixedRange.decode( + BitString.of("00000000001100000000000000001000000000001000000000000000000000001"), + null)); } @Test public void testDecode2() { - encodableOptimizedFixedRange.decode("00000000000111100000000000000000001000000000001"); - Assertions.assertEquals(Arrays.asList(18, 30), encodableOptimizedFixedRange.getValue()); + Assertions.assertEquals( + Set.of(18, 30), + encodableOptimizedFixedRange.decode( + BitString.of("00000000000111100000000000000000001000000000001"), null)); } @Test public void testDecode3() { - encodableOptimizedFixedRange.decode("000000000001110000000000000000000000000000001"); - Assertions.assertEquals(Arrays.asList(28), encodableOptimizedFixedRange.getValue()); + Assertions.assertEquals( + Set.of(28), + encodableOptimizedFixedRange.decode( + BitString.of("000000000001110000000000000000000000000000001"), null)); } @Test public void testDecode4() { - encodableOptimizedFixedRange.decode("0000000000011101100000000000100000000000011101"); - Assertions.assertEquals(Arrays.asList(29), encodableOptimizedFixedRange.getValue()); - } - - @Test - public void testSubstring1() throws SubstringException { - Assertions.assertEquals("000000000001110000000000000000000000000000001", encodableOptimizedFixedRange.substring( - "000010001111010010000110111111111100000000001111010010000110111111111100000000000000000000000000000000000000000100001101000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000001110000000000000000000000000000001000000000000000000000000000000", - 213)); - } - - @Test - public void testSubstring2() throws SubstringException { - Assertions.assertEquals("0000000000011101100000000000100000000000011101", encodableOptimizedFixedRange.substring( - "000010001111010010000110111111111100000000001111010010000110111111111100000000000000000000000000000000000000000100001101000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000001110110000000000010000000000001110100000000000000000000000000000", - 213)); + 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 fea6ee70..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,35 +1,40 @@ package com.iab.gpp.encoder.datatype.encoder; +import com.iab.gpp.encoder.bitstring.BitString; +import com.iab.gpp.encoder.error.DecodingException; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import com.iab.gpp.encoder.error.DecodingException; public class BooleanEncoderTest { @Test public void testEncode1() { - Assertions.assertEquals("0", BooleanEncoder.encode(false)); + BitString builder = new BitString(); + builder.writeBoolean(false); + Assertions.assertEquals("0", builder.toString()); } @Test public void testEncode2() { - Assertions.assertEquals("1", BooleanEncoder.encode(true)); + BitString builder = new BitString(); + builder.writeBoolean(true); + Assertions.assertEquals("1", builder.toString()); } @Test public void testDecode1() { - Assertions.assertEquals(false, BooleanEncoder.decode("0")); + Assertions.assertEquals(false, BitString.of("0").readBoolean()); } @Test public void testDecode2() { - Assertions.assertEquals(true, BooleanEncoder.decode("1")); + Assertions.assertEquals(true, BitString.of("1").readBoolean()); } @Test public void testDecode3() { try { - BooleanEncoder.decode(""); + BitString.of("").readBoolean(); Assertions.fail("DecodingException expected"); } catch (DecodingException e) { @@ -39,41 +44,10 @@ public void testDecode3() { @Test public void testDecode4() { try { - BooleanEncoder.decode("2"); - Assertions.fail("DecodingException expected"); - } catch (DecodingException e) { - - } - } - - @Test - public void testDecode5() { - try { - BooleanEncoder.decode("00"); + BitString.of("2").readBoolean(); Assertions.fail("DecodingException expected"); } catch (DecodingException e) { } } - - @Test - public void testDecode6() { - try { - BooleanEncoder.decode("01"); - Assertions.fail("DecodingException expected"); - } catch (DecodingException e) { - - } - } - - @Test - public void testDecode7() { - try { - BooleanEncoder.decode("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 ec75a122..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,19 +1,21 @@ package com.iab.gpp.encoder.datatype.encoder; -import java.time.ZoneId; -import java.time.ZonedDateTime; +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.error.DecodingException; public class DatetimeEncoderTest { @Test public void test1() throws DecodingException { - ZonedDateTime date1 = ZonedDateTime.now(ZoneId.of("UTC")); - String encodedDate1 = DatetimeEncoder.encode(date1); - ZonedDateTime date2 = DatetimeEncoder.decode(encodedDate1); + Instant date1 = Instant.now(); + BitString builder = new BitString(); + DatetimeEncoder.encode(builder, date1); + String encodedDate1 = builder.toString(); + Instant date2 = DatetimeEncoder.decode(BitString.of(encodedDate1)); - Assertions.assertEquals((date1.toInstant().toEpochMilli() / 100L) * 100L, date2.toInstant().toEpochMilli()); + 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 5530b10b..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,109 +1,111 @@ package com.iab.gpp.encoder.datatype.encoder; -import static org.junit.jupiter.api.Assertions.assertThrows; +import com.iab.gpp.encoder.bitstring.BitString; +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; -import com.iab.gpp.encoder.error.DecodingException; public class FibonacciIntegerEncoderTest { @Test public void testEncode1() { - Assertions.assertEquals("11", FibonacciIntegerEncoder.encode(1)); + BitString builder = new BitString(); + builder.writeFibonacci(1); + Assertions.assertEquals("11", builder.toString()); } + @Test public void testEncode2() { - Assertions.assertEquals("011", FibonacciIntegerEncoder.encode(2)); + BitString builder = new BitString(); + builder.writeFibonacci(2); + Assertions.assertEquals("011", builder.toString()); } + @Test public void testEncode3() { - Assertions.assertEquals("0011", FibonacciIntegerEncoder.encode(3)); + BitString builder = new BitString(); + builder.writeFibonacci(3); + Assertions.assertEquals("0011", builder.toString()); } + @Test public void testEncode4() { - Assertions.assertEquals("1011", FibonacciIntegerEncoder.encode(4)); + BitString builder = new BitString(); + builder.writeFibonacci(4); + Assertions.assertEquals("1011", builder.toString()); } + @Test public void testEncode5() { - Assertions.assertEquals("00011", FibonacciIntegerEncoder.encode(5)); + BitString builder = new BitString(); + builder.writeFibonacci(5); + Assertions.assertEquals("00011", builder.toString()); } + @Test public void testEncode6() { - Assertions.assertEquals("10011", FibonacciIntegerEncoder.encode(6)); + BitString builder = new BitString(); + builder.writeFibonacci(6); + Assertions.assertEquals("10011", builder.toString()); } + @Test public void testEncode7() { - Assertions.assertEquals("01011", FibonacciIntegerEncoder.encode(7)); + BitString builder = new BitString(); + builder.writeFibonacci(7); + Assertions.assertEquals("01011", builder.toString()); + } + + @Test + public void testEncodeTooLarge() { + 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("11")); + Assertions.assertEquals(1, decode("11")); } @Test public void testDecode2() throws DecodingException { - Assertions.assertEquals(2, FibonacciIntegerEncoder.decode("011")); + Assertions.assertEquals(2, decode("011")); } @Test public void testDecode3() throws DecodingException { - Assertions.assertEquals(3, FibonacciIntegerEncoder.decode("0011")); + Assertions.assertEquals(3, decode("0011")); } @Test public void testDecode4() throws DecodingException { - Assertions.assertEquals(4, FibonacciIntegerEncoder.decode("1011")); + Assertions.assertEquals(4, decode("1011")); } @Test public void testDecode5() throws DecodingException { - Assertions.assertEquals(5, FibonacciIntegerEncoder.decode("00011")); + Assertions.assertEquals(5, decode("00011")); } @Test public void testDecode6() throws DecodingException { - Assertions.assertEquals(6, FibonacciIntegerEncoder.decode("10011")); + Assertions.assertEquals(6, decode("10011")); } @Test public void testDecode7() throws DecodingException { - Assertions.assertEquals(7, FibonacciIntegerEncoder.decode("01011")); - } - - @Test - public void testDecode8() { - try { - FibonacciIntegerEncoder.decode("110"); - Assertions.fail("DecodingException expected"); - } catch (DecodingException e) { - - } - } - - @Test - public void testDecode9() { - try { - FibonacciIntegerEncoder.decode("1100"); - Assertions.fail("DecodingException expected"); - } catch (DecodingException e) { - - } - } - - @Test - public void testDecode10() { - try { - FibonacciIntegerEncoder.decode("0110000000"); - Assertions.fail("DecodingException expected"); - } catch (DecodingException e) { - - } + Assertions.assertEquals(7, decode("01011")); } @Test public void testDecodeTooLarge() { - String large = FibonacciIntegerEncoder.encode(2 << 17); - assertThrows(DecodingException.class, () -> FibonacciIntegerEncoder.decode(large)); + 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 1cae6e34..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,88 +1,106 @@ package com.iab.gpp.encoder.datatype.encoder; -import static org.junit.jupiter.api.Assertions.assertThrows; +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.List; +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 FibonacciIntegerRangeEncoderTest { @Test public void testEncode1() { - Assertions.assertEquals("000000000000", FibonacciIntegerRangeEncoder.encode(new ArrayList<>())); + BitString builder = new BitString(); + FibonacciIntegerRangeEncoder.encode(builder, new ArrayList<>()); + Assertions.assertEquals("000000000000", builder.toString()); } @Test public void testEncode2() { - Assertions.assertEquals("0000000000010011", FibonacciIntegerRangeEncoder.encode(Arrays.asList(2))); + BitString builder = new BitString(); + FibonacciIntegerRangeEncoder.encode(builder, Arrays.asList(2)); + Assertions.assertEquals("0000000000010011", builder.toString()); } @Test public void testEncode3() { - Assertions.assertEquals("00000000000110111011", FibonacciIntegerRangeEncoder.encode(Arrays.asList(2, 3, 4, 5, 6))); + BitString builder = new BitString(); + FibonacciIntegerRangeEncoder.encode(builder, Arrays.asList(2, 3, 4, 5, 6)); + Assertions.assertEquals("00000000000110111011", builder.toString()); } @Test public void testEncode4() { - Assertions.assertEquals("000000000010001110011011", FibonacciIntegerRangeEncoder.encode(Arrays.asList(2, 5, 6, 7))); + BitString builder = new BitString(); + FibonacciIntegerRangeEncoder.encode(builder, Arrays.asList(2, 5, 6, 7)); + Assertions.assertEquals("000000000010001110011011", builder.toString()); } @Test public void testEncode5() { - Assertions.assertEquals("000000000010001110011011", FibonacciIntegerRangeEncoder.encode(Arrays.asList(6, 7, 2, 5))); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); + set.addAll(Arrays.asList(6, 7, 2, 5)); + FibonacciIntegerRangeEncoder.encode(builder, set); + Assertions.assertEquals("000000000010001110011011", builder.toString()); } @Test public void testEncode6() { - Assertions.assertEquals("0000000000100001110110011", - FibonacciIntegerRangeEncoder.encode(Arrays.asList(3, 5, 6, 7, 8))); + BitString builder = new BitString(); + FibonacciIntegerRangeEncoder.encode(builder, Arrays.asList(3, 5, 6, 7, 8)); + Assertions.assertEquals("0000000000100001110110011", builder.toString()); } @Test public void testEncode7() { - Assertions.assertEquals("00000000001000111001101011", - FibonacciIntegerRangeEncoder.encode(Arrays.asList(2, 5, 6, 7, 8, 9, 10, 11, 12))); + BitString builder = new BitString(); + FibonacciIntegerRangeEncoder.encode(builder, Arrays.asList(2, 5, 6, 7, 8, 9, 10, 11, 12)); + Assertions.assertEquals("00000000001000111001101011", builder.toString()); + } + + private IntegerSet decode(String str) { + return FibonacciIntegerRangeEncoder.decode(BitString.of(str)); } @Test public void testDecode1() throws DecodingException { - Assertions.assertEquals(new ArrayList<>(), FibonacciIntegerRangeEncoder.decode("000000000000")); + Assertions.assertEquals(Set.of(), decode("000000000000")); } @Test public void testDecode2() throws DecodingException { - Assertions.assertEquals(Arrays.asList(2), FibonacciIntegerRangeEncoder.decode("0000000000010011")); + Assertions.assertEquals(Set.of(2), decode("0000000000010011")); } @Test public void testDecode3() throws DecodingException { - Assertions.assertEquals(Arrays.asList(2, 3, 4, 5, 6), FibonacciIntegerRangeEncoder.decode("00000000000110111011")); + Assertions.assertEquals(Set.of(2, 3, 4, 5, 6), decode("00000000000110111011")); } @Test public void testDecode4() throws DecodingException { - Assertions.assertEquals(Arrays.asList(2, 5, 6, 7), FibonacciIntegerRangeEncoder.decode("000000000010001110011011")); + Assertions.assertEquals(Set.of(2, 5, 6, 7), decode("000000000010001110011011")); } @Test public void testDecode5() throws DecodingException { - Assertions.assertEquals(Arrays.asList(3, 5, 6, 7, 8), - FibonacciIntegerRangeEncoder.decode("0000000000100001110110011")); + Assertions.assertEquals(Set.of(3, 5, 6, 7, 8), decode("0000000000100001110110011")); } @Test public void testDecode6() throws DecodingException { - Assertions.assertEquals(Arrays.asList(2, 5, 6, 7, 8, 9, 10, 11, 12), - FibonacciIntegerRangeEncoder.decode("00000000001000111001101011")); + Assertions.assertEquals( + Set.of(2, 5, 6, 7, 8, 9, 10, 11, 12), decode("00000000001000111001101011")); } @Test public void testDecode7() { try { - FibonacciIntegerRangeEncoder.decode("0011"); + decode("0011"); Assertions.fail("DecodingException expected"); } catch (DecodingException e) { @@ -92,16 +110,10 @@ public void testDecode7() { @Test public void testDecode8() { try { - FibonacciIntegerRangeEncoder.decode("000000000002"); + decode("000000000002"); Assertions.fail("DecodingException expected"); } catch (DecodingException e) { } } - - @Test - public void testGiantRange() { - String max = FibonacciIntegerEncoder.encode(FibonacciIntegerRangeEncoder.MAX_SIZE + 1); - Assertions.assertEquals(new ArrayList<>(), FibonacciIntegerRangeEncoder.decode("000000000001111" + max)); - } } 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 d66e3538..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,98 +1,134 @@ package com.iab.gpp.encoder.datatype.encoder; -import java.util.ArrayList; -import java.util.Arrays; +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.error.DecodingException; -import com.iab.gpp.encoder.error.EncodingException; public class FixedBitfieldEncoderTest { @Test public void testEncode1() { - Assertions.assertEquals("00", FixedBitfieldEncoder.encode(new ArrayList<>(), 2)); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); + FixedBitfieldEncoder.encode(builder, set, 2); + Assertions.assertEquals("00", builder.toString()); } @Test public void testEncode2() { - Assertions.assertEquals("0", FixedBitfieldEncoder.encode(Arrays.asList(false), 1)); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); + FixedBitfieldEncoder.encode(builder, set, 1); + Assertions.assertEquals("0", builder.toString()); } @Test public void testEncode3() { - Assertions.assertEquals("1", FixedBitfieldEncoder.encode(Arrays.asList(true), 1)); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); + set.add(0); + FixedBitfieldEncoder.encode(builder, set, 1); + Assertions.assertEquals("1", builder.toString()); } @Test public void testEncode4() { - Assertions.assertEquals("00", FixedBitfieldEncoder.encode(Arrays.asList(false, false), 2)); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); + FixedBitfieldEncoder.encode(builder, set, 2); + Assertions.assertEquals("00", builder.toString()); } @Test public void testEncode5() { - Assertions.assertEquals("01", FixedBitfieldEncoder.encode(Arrays.asList(false, true), 2)); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); + set.addInt(1); + FixedBitfieldEncoder.encode(builder, set, 2); + Assertions.assertEquals("01", builder.toString()); } @Test public void testEncode6() { - Assertions.assertEquals("10", FixedBitfieldEncoder.encode(Arrays.asList(true, false), 2)); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); + set.addInt(0); + FixedBitfieldEncoder.encode(builder, set, 2); + Assertions.assertEquals("10", builder.toString()); } @Test public void testEncode7() { - Assertions.assertEquals("11", FixedBitfieldEncoder.encode(Arrays.asList(true, true), 2)); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); + set.addInt(0); + set.addInt(1); + FixedBitfieldEncoder.encode(builder, set, 2); + Assertions.assertEquals("11", builder.toString()); } @Test public void testEncode8() { - try { - FixedBitfieldEncoder.encode(Arrays.asList(true, true, true), 2); - Assertions.fail("EncodingException expected"); - } catch (EncodingException e) { - + 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); + } + + @Test + public void testEncode9() { + 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(new ArrayList<>(), FixedBitfieldEncoder.decode("")); + Assertions.assertEquals(Set.of(), decode("")); } @Test public void testDecode2() { - Assertions.assertEquals(Arrays.asList(false), FixedBitfieldEncoder.decode("0")); + Assertions.assertEquals(Set.of(), decode("0")); } @Test public void testDecode3() { - Assertions.assertEquals(Arrays.asList(true), FixedBitfieldEncoder.decode("1")); + Assertions.assertEquals(Set.of(1), decode("1")); } @Test public void testDecode4() { - Assertions.assertEquals(Arrays.asList(false, false), FixedBitfieldEncoder.decode("00")); + Assertions.assertEquals(Set.of(), decode("00")); } @Test public void testDecode5() { - Assertions.assertEquals(Arrays.asList(false, true), FixedBitfieldEncoder.decode("01")); + Assertions.assertEquals(Set.of(2), decode("01")); } @Test public void testDecode6() { - Assertions.assertEquals(Arrays.asList(true, false), FixedBitfieldEncoder.decode("10")); + Assertions.assertEquals(Set.of(1), decode("10")); } @Test public void testDecode7() { - Assertions.assertEquals(Arrays.asList(true, true), FixedBitfieldEncoder.decode("11")); + Assertions.assertEquals(Set.of(1, 2), decode("11")); } @Test public void testDecode8() { try { - FixedBitfieldEncoder.decode("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 a30b882b..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,79 +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.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() { - Assertions.assertEquals("0", FixedIntegerEncoder.encode(0, 1)); + BitString builder = new BitString(); + builder.writeInt(0, 1); + Assertions.assertEquals("0", builder.toString()); } @Test public void testEncode2() { - Assertions.assertEquals("000000", FixedIntegerEncoder.encode(0, 6)); + BitString builder = new BitString(); + builder.writeInt(0, 6); + Assertions.assertEquals("000000", builder.toString()); } @Test public void testEncode3() { - Assertions.assertEquals("1", FixedIntegerEncoder.encode(1, 1)); + BitString builder = new BitString(); + builder.writeInt(1, 1); + Assertions.assertEquals("1", builder.toString()); } @Test public void testEncode4() { - Assertions.assertEquals("0001", FixedIntegerEncoder.encode(1, 4)); + BitString builder = new BitString(); + builder.writeInt(1, 4); + Assertions.assertEquals("0001", builder.toString()); } @Test public void testEncode5() { - Assertions.assertEquals("00000111", FixedIntegerEncoder.encode(7, 8)); + BitString builder = new BitString(); + builder.writeInt(7, 8); + Assertions.assertEquals("00000111", builder.toString()); } - + @Test public void testEncode6() { try { - FixedIntegerEncoder.encode(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("")); + private int decode(String str) { + return BitString.of(str).readInt(str.length()); } @Test public void testDecode2() throws DecodingException { - Assertions.assertEquals(0, FixedIntegerEncoder.decode("0")); + Assertions.assertEquals(0, decode("0")); } @Test public void testDecode3() throws DecodingException { - Assertions.assertEquals(0, FixedIntegerEncoder.decode("000000")); + Assertions.assertEquals(0, decode("000000")); } @Test public void testDecode4() throws DecodingException { - Assertions.assertEquals(1, FixedIntegerEncoder.decode("1")); + Assertions.assertEquals(1, decode("1")); } @Test public void testDecode5() throws DecodingException { - Assertions.assertEquals(1, FixedIntegerEncoder.decode("000001")); + Assertions.assertEquals(1, decode("000001")); } @Test public void testDecode6() throws DecodingException { - Assertions.assertEquals(8, FixedIntegerEncoder.decode("1000")); + Assertions.assertEquals(8, decode("1000")); } @Test public void testDecode7() throws DecodingException { - Assertions.assertEquals(8, FixedIntegerEncoder.decode("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 25de7e17..00000000 --- a/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/FixedIntegerListEncoderTest.java +++ /dev/null @@ -1,226 +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.error.DecodingException; -import com.iab.gpp.encoder.error.EncodingException; - -public class FixedIntegerListEncoderTest { - - @Test - public void testEncode1() { - Assertions.assertEquals("0000", FixedIntegerListEncoder.encode(new ArrayList<>(), 2, 2)); - } - - @Test - public void testEncode2() { - Assertions.assertEquals("0000", FixedIntegerListEncoder.encode(Arrays.asList(0), 2, 2)); - } - - @Test - public void testEncode3() { - Assertions.assertEquals("0000", FixedIntegerListEncoder.encode(Arrays.asList(0, 0), 2, 2)); - } - - @Test - public void testEncode4() { - Assertions.assertEquals("0001", FixedIntegerListEncoder.encode(Arrays.asList(0, 1), 2, 2)); - } - - @Test - public void testEncode5() { - Assertions.assertEquals("0010", FixedIntegerListEncoder.encode(Arrays.asList(0, 2), 2, 2)); - } - - @Test - public void testEncode6() { - Assertions.assertEquals("0011", FixedIntegerListEncoder.encode(Arrays.asList(0, 3), 2, 2)); - } - - @Test - public void testEncode7() { - Assertions.assertEquals("0100", FixedIntegerListEncoder.encode(Arrays.asList(1, 0), 2, 2)); - } - - @Test - public void testEncode8() { - Assertions.assertEquals("0101", FixedIntegerListEncoder.encode(Arrays.asList(1, 1), 2, 2)); - } - - @Test - public void testEncode9() { - Assertions.assertEquals("0110", FixedIntegerListEncoder.encode(Arrays.asList(1, 2), 2, 2)); - } - - @Test - public void testEncode10() { - Assertions.assertEquals("0111", FixedIntegerListEncoder.encode(Arrays.asList(1, 3), 2, 2)); - } - - @Test - public void testEncode11() { - Assertions.assertEquals("1000", FixedIntegerListEncoder.encode(Arrays.asList(2, 0), 2, 2)); - } - - @Test - public void testEncode12() { - Assertions.assertEquals("1001", FixedIntegerListEncoder.encode(Arrays.asList(2, 1), 2, 2)); - } - - @Test - public void testEncode13() { - Assertions.assertEquals("1010", FixedIntegerListEncoder.encode(Arrays.asList(2, 2), 2, 2)); - } - - @Test - public void testEncode14() { - Assertions.assertEquals("1011", FixedIntegerListEncoder.encode(Arrays.asList(2, 3), 2, 2)); - } - - @Test - public void testEncode15() { - Assertions.assertEquals("1100", FixedIntegerListEncoder.encode(Arrays.asList(3, 0), 2, 2)); - } - - @Test - public void testEncode16() { - Assertions.assertEquals("1101", FixedIntegerListEncoder.encode(Arrays.asList(3, 1), 2, 2)); - } - - @Test - public void testEncode17() { - Assertions.assertEquals("1110", FixedIntegerListEncoder.encode(Arrays.asList(3, 2), 2, 2)); - } - - @Test - public void testEncode18() { - Assertions.assertEquals("1111", FixedIntegerListEncoder.encode(Arrays.asList(3, 3), 2, 2)); - } - - @Test - public void testEncode19() { - try { - FixedIntegerListEncoder.encode(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("", 2, 2)); - } - - @Test - public void testDecode2() { - Assertions.assertEquals(Arrays.asList(0, 0), FixedIntegerListEncoder.decode("0000", 2, 2)); - } - - @Test - public void testDecode3() { - Assertions.assertEquals(Arrays.asList(0, 1), FixedIntegerListEncoder.decode("0001", 2, 2)); - } - - @Test - public void testDecode4() { - Assertions.assertEquals(Arrays.asList(0, 2), FixedIntegerListEncoder.decode("0010", 2, 2)); - } - - @Test - public void testDecode5() { - Assertions.assertEquals(Arrays.asList(0, 3), FixedIntegerListEncoder.decode("0011", 2, 2)); - } - - @Test - public void testDecode6() { - Assertions.assertEquals(Arrays.asList(1, 0), FixedIntegerListEncoder.decode("0100", 2, 2)); - } - - @Test - public void testDecode7() { - Assertions.assertEquals(Arrays.asList(1, 1), FixedIntegerListEncoder.decode("0101", 2, 2)); - } - - @Test - public void testDecode8() { - Assertions.assertEquals(Arrays.asList(1, 2), FixedIntegerListEncoder.decode("0110", 2, 2)); - } - - @Test - public void testDecode9() { - Assertions.assertEquals(Arrays.asList(1, 3), FixedIntegerListEncoder.decode("0111", 2, 2)); - } - - @Test - public void testDecode10() { - Assertions.assertEquals(Arrays.asList(2, 0), FixedIntegerListEncoder.decode("1000", 2, 2)); - } - - @Test - public void testDecode11() { - Assertions.assertEquals(Arrays.asList(2, 1), FixedIntegerListEncoder.decode("1001", 2, 2)); - } - - @Test - public void testDecode12() { - Assertions.assertEquals(Arrays.asList(2, 2), FixedIntegerListEncoder.decode("1010", 2, 2)); - } - - @Test - public void testDecode13() { - Assertions.assertEquals(Arrays.asList(2, 3), FixedIntegerListEncoder.decode("1011", 2, 2)); - } - - @Test - public void testDecode14() { - Assertions.assertEquals(Arrays.asList(3, 0), FixedIntegerListEncoder.decode("1100", 2, 2)); - } - - @Test - public void testDecode15() { - Assertions.assertEquals(Arrays.asList(3, 1), FixedIntegerListEncoder.decode("1101", 2, 2)); - } - - @Test - public void testDecode16() { - Assertions.assertEquals(Arrays.asList(3, 2), FixedIntegerListEncoder.decode("1110", 2, 2)); - } - - @Test - public void testDecode17() { - Assertions.assertEquals(Arrays.asList(3, 3), FixedIntegerListEncoder.decode("1111", 2, 2)); - } - - @Test - public void testDecode18() { - try { - FixedIntegerListEncoder.decode("111111", 2, 2); - Assertions.fail("DecodingException expected"); - } catch (DecodingException e) { - - } - } - - @Test - public void testDecode19() { - try { - FixedIntegerListEncoder.decode("2", 2, 2); - Assertions.fail("DecodingException expected"); - } catch (DecodingException e) { - - } - } - - @Test - public void testDecode20() { - try { - FixedIntegerListEncoder.decode("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 b781cd4c..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,118 +1,149 @@ package com.iab.gpp.encoder.datatype.encoder; -import static org.junit.jupiter.api.Assertions.assertThrows; +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.List; +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 FixedIntegerRangeEncoderTest { @Test public void testEncode1() { - Assertions.assertEquals("000000000000", FixedIntegerRangeEncoder.encode(new ArrayList<>())); + BitString builder = new BitString(); + FixedIntegerRangeEncoder.encode(builder, new ArrayList<>()); + Assertions.assertEquals("000000000000", builder.toString()); } @Test public void testEncode2() { - Assertions.assertEquals("00000000000100000000000000010", FixedIntegerRangeEncoder.encode(Arrays.asList(2))); + BitString builder = new BitString(); + FixedIntegerRangeEncoder.encode(builder, Arrays.asList(2)); + Assertions.assertEquals("00000000000100000000000000010", builder.toString()); } @Test public void testEncode3() { - Assertions.assertEquals("000000000001100000000000000100000000000000110", - FixedIntegerRangeEncoder.encode(Arrays.asList(2, 3, 4, 5, 6))); + BitString builder = new BitString(); + FixedIntegerRangeEncoder.encode(builder, Arrays.asList(2, 3, 4, 5, 6)); + Assertions.assertEquals("000000000001100000000000000100000000000000110", builder.toString()); } @Test public void testEncode4() { - Assertions.assertEquals("00000000001000000000000000010100000000000001010000000000000111", - FixedIntegerRangeEncoder.encode(Arrays.asList(2, 5, 6, 7))); + BitString builder = new BitString(); + FixedIntegerRangeEncoder.encode(builder, Arrays.asList(2, 5, 6, 7)); + Assertions.assertEquals( + "00000000001000000000000000010100000000000001010000000000000111", builder.toString()); } @Test public void testEncode5() { - Assertions.assertEquals("00000000001000000000000000010100000000000001010000000000000111", - FixedIntegerRangeEncoder.encode(Arrays.asList(5, 2, 7, 6))); + BitString builder = new BitString(); + IntegerSet set = new IntegerSet(); + set.addAll(Arrays.asList(6, 7, 2, 5)); + FixedIntegerRangeEncoder.encode(builder, set); + Assertions.assertEquals( + "00000000001000000000000000010100000000000001010000000000000111", builder.toString()); } @Test public void testEncode6() { - Assertions.assertEquals("00000000001000000000000000011100000000000001010000000000001000", - FixedIntegerRangeEncoder.encode(Arrays.asList(3, 5, 6, 7, 8))); + BitString builder = new BitString(); + FixedIntegerRangeEncoder.encode(builder, Arrays.asList(3, 5, 6, 7, 8)); + Assertions.assertEquals( + "00000000001000000000000000011100000000000001010000000000001000", builder.toString()); } @Test public void testEncode7() { - Assertions.assertEquals("000000000011000000000000011000000000000001100000000000000110000", - FixedIntegerRangeEncoder.encode(Arrays.asList(12, 24, 48))); + BitString builder = new BitString(); + FixedIntegerRangeEncoder.encode(builder, Arrays.asList(12, 24, 48)); + Assertions.assertEquals( + "000000000011000000000000011000000000000001100000000000000110000", builder.toString()); } @Test public void testEncode8() { - Assertions.assertEquals("0000000000110000000000000110000000000000011000100000000001100000000000000110001", - FixedIntegerRangeEncoder.encode(Arrays.asList(12, 24, 48, 49))); + BitString builder = new BitString(); + FixedIntegerRangeEncoder.encode(builder, Arrays.asList(12, 24, 48, 49)); + Assertions.assertEquals( + "0000000000110000000000000110000000000000011000100000000001100000000000000110001", + builder.toString()); } @Test public void testEncode9() { + BitString builder = new BitString(); + FixedIntegerRangeEncoder.encode(builder, Arrays.asList(2, 6, 8, 12, 18, 23, 24, 25, 37, 42)); Assertions.assertEquals( "00000000100000000000000000010000000000000001100000000000000100000000000000001100000000000000100101000000000001011100000000000110010000000000010010100000000000101010", - FixedIntegerRangeEncoder.encode(Arrays.asList(2, 6, 8, 12, 18, 23, 24, 25, 37, 42))); + builder.toString()); + } + + private IntegerSet decode(String str) { + return FixedIntegerRangeEncoder.decode(BitString.of(str)); } @Test public void testDecode1() throws DecodingException { - Assertions.assertEquals(new ArrayList<>(), FixedIntegerRangeEncoder.decode("000000000000")); + Assertions.assertEquals(Set.of(), decode("000000000000")); } @Test public void testDecode2() throws DecodingException { - Assertions.assertEquals(Arrays.asList(2), FixedIntegerRangeEncoder.decode("00000000000100000000000000010")); + Assertions.assertEquals(Set.of(2), decode("00000000000100000000000000010")); } @Test public void testDecode3() throws DecodingException { - Assertions.assertEquals(Arrays.asList(2, 3, 4, 5, 6), - FixedIntegerRangeEncoder.decode("000000000001100000000000000100000000000000110")); + Assertions.assertEquals( + Set.of(2, 3, 4, 5, 6), decode("000000000001100000000000000100000000000000110")); } @Test public void testDecode4() throws DecodingException { - Assertions.assertEquals(Arrays.asList(2, 5, 6, 7), - FixedIntegerRangeEncoder.decode("00000000001000000000000000010100000000000001010000000000000111")); + Assertions.assertEquals( + Set.of(2, 5, 6, 7), + decode("00000000001000000000000000010100000000000001010000000000000111")); } @Test public void testDecode5() throws DecodingException { - Assertions.assertEquals(Arrays.asList(3, 5, 6, 7, 8), - FixedIntegerRangeEncoder.decode("00000000001000000000000000011100000000000001010000000000001000")); + Assertions.assertEquals( + Set.of(3, 5, 6, 7, 8), + decode("00000000001000000000000000011100000000000001010000000000001000")); } @Test public void testDecode6() throws DecodingException { - Assertions.assertEquals(Arrays.asList(12, 24, 48), - FixedIntegerRangeEncoder.decode("000000000011000000000000011000000000000001100000000000000110000")); + Assertions.assertEquals( + Set.of(12, 24, 48), + decode("000000000011000000000000011000000000000001100000000000000110000")); } @Test public void testDecode7() throws DecodingException { - Assertions.assertEquals(Arrays.asList(12, 24, 48, 49), FixedIntegerRangeEncoder - .decode("0000000000110000000000000110000000000000011000100000000001100000000000000110001")); + Assertions.assertEquals( + Set.of(12, 24, 48, 49), + decode("0000000000110000000000000110000000000000011000100000000001100000000000000110001")); } @Test public void testDecode8() throws DecodingException { - Assertions.assertEquals(Arrays.asList(2, 6, 8, 12, 18, 23, 24, 25, 37, 42), FixedIntegerRangeEncoder.decode( - "00000000100000000000000000010000000000000001100000000000000100000000000000001100000000000000100101000000000001011100000000000110010000000000010010100000000000101010")); + Assertions.assertEquals( + Set.of(2, 6, 8, 12, 18, 23, 24, 25, 37, 42), + decode( + "00000000100000000000000000010000000000000001100000000000000100000000000000001100000000000000100101000000000001011100000000000110010000000000010010100000000000101010")); } @Test public void testDecode9() { try { - FixedIntegerRangeEncoder.decode("0011"); + decode("0011"); Assertions.fail("DecodingException expected"); } catch (DecodingException e) { @@ -122,16 +153,10 @@ public void testDecode9() { @Test public void testDecode10() { try { - FixedIntegerRangeEncoder.decode("000000000002"); + decode("000000000002"); Assertions.fail("DecodingException expected"); } catch (DecodingException e) { } } - - @Test - public void testGiantRange() { - String max = FibonacciIntegerEncoder.encode(FibonacciIntegerRangeEncoder.MAX_SIZE + 1); - Assertions.assertEquals(new ArrayList<>(), FixedIntegerRangeEncoder.decode("00000000000110000000000000001" + max)); - } } 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 9a90a6dd..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,90 +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.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() { - Assertions.assertEquals("0", FixedLongEncoder.encode(0, 1)); + BitString builder = new BitString(); + builder.writeLong(0, 1); + Assertions.assertEquals("0", builder.toString()); } @Test public void testEncode2() { - Assertions.assertEquals("000000", FixedLongEncoder.encode(0, 6)); + BitString builder = new BitString(); + builder.writeLong(0, 6); + Assertions.assertEquals("000000", builder.toString()); } @Test public void testEncode3() { - Assertions.assertEquals("1", FixedLongEncoder.encode(1, 1)); + BitString builder = new BitString(); + builder.writeLong(1, 1); + Assertions.assertEquals("1", builder.toString()); } @Test public void testEncode4() { - Assertions.assertEquals("0001", FixedLongEncoder.encode(1, 4)); + BitString builder = new BitString(); + builder.writeLong(1, 4); + Assertions.assertEquals("0001", builder.toString()); } @Test public void testEncode5() { - Assertions.assertEquals("00000111", FixedLongEncoder.encode(7, 8)); + BitString builder = new BitString(); + builder.writeLong(7, 8); + Assertions.assertEquals("00000111", builder.toString()); } - @Test public void testEncode6() { - Assertions.assertEquals("001111011111010001110101111011110101", FixedLongEncoder.encode(16630898421L, 36)); + BitString builder = new BitString(); + builder.writeLong(16630898421L, 36); + Assertions.assertEquals("001111011111010001110101111011110101", builder.toString()); } - + @Test public void testEncode7() { try { - FixedIntegerEncoder.encode(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("")); + private long decode(String str) { + return BitString.of(str).readLong(str.length()); } @Test public void testDecode2() throws DecodingException { - Assertions.assertEquals(0, FixedLongEncoder.decode("0")); + Assertions.assertEquals(0, decode("0")); } @Test public void testDecode3() throws DecodingException { - Assertions.assertEquals(0, FixedLongEncoder.decode("000000")); + Assertions.assertEquals(0, decode("000000")); } @Test public void testDecode4() throws DecodingException { - Assertions.assertEquals(1, FixedLongEncoder.decode("1")); + Assertions.assertEquals(1, decode("1")); } @Test public void testDecode5() throws DecodingException { - Assertions.assertEquals(1, FixedLongEncoder.decode("000001")); + Assertions.assertEquals(1, decode("000001")); } @Test public void testDecode6() throws DecodingException { - Assertions.assertEquals(16630898421L, FixedLongEncoder.decode("001111011111010001110101111011110101")); + Assertions.assertEquals(16630898421L, decode("001111011111010001110101111011110101")); } @Test public void testDecode7() throws DecodingException { - Assertions.assertEquals(8, FixedLongEncoder.decode("1000")); + Assertions.assertEquals(8, decode("1000")); } @Test public void testDecode8() throws DecodingException { - Assertions.assertEquals(8, FixedLongEncoder.decode("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 4fef7dcc..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,46 +1,56 @@ 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.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() { - Assertions.assertEquals("000000000001", FixedStringEncoder.encode("AB", 2)); + BitString builder = new BitString(); + FixedStringEncoder.encode(builder, "AB", 2); + Assertions.assertEquals("000000000001", builder.toString()); } @Test public void testEncode2() { - Assertions.assertEquals("100000111111", FixedStringEncoder.encode("a", 2)); + BitString builder = new BitString(); + FixedStringEncoder.encode(builder, "a", 2); + Assertions.assertEquals("100000111111", builder.toString()); } @Test public void testEncode3() { try { - FixedStringEncoder.encode("1", 2); + BitString builder = new BitString(); + FixedStringEncoder.encode(builder, "1", 2); Assertions.fail("DecodingException expected"); } catch (EncodingException e) { } } + private String decode(String str) { + return FixedStringEncoder.decode(BitString.of(str), str.length() / 6); + } + @Test public void testDecode1() { - Assertions.assertEquals("AB", FixedStringEncoder.decode("000000000001")); + Assertions.assertEquals("AB", decode("000000000001")); } @Test public void testDecode2() { - Assertions.assertEquals("a", FixedStringEncoder.decode("100000111111")); + Assertions.assertEquals("a", decode("100000111111")); } @Test public void testDecode3() { try { - FixedStringEncoder.decode("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..63e5e768 --- /dev/null +++ b/iabgpp-encoder/src/test/java/com/iab/gpp/encoder/datatype/encoder/IntegerSetTest.java @@ -0,0 +1,75 @@ +package com.iab.gpp.encoder.datatype.encoder; + +import static org.junit.jupiter.api.Assertions.*; + +import com.iab.gpp.encoder.bitstring.BitSet; +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); + } + + @Test + void boundsTest() { + BitSet bitSet = new BitSet(); + + bitSet.set(10); + bitSet.set(11); + bitSet.set(12); + bitSet.set(13); + + IntegerSet set = new IntegerSet(bitSet, 10, 13, 1); + assertEquals(Set.of(1, 2, 3), set); + + assertThrows(IndexOutOfBoundsException.class, () -> set.add(0)); + assertThrows(IndexOutOfBoundsException.class, () -> set.add(-1)); + assertFalse(set.contains(0)); + assertFalse(set.contains(-1)); + assertTrue(set.contains(1)); + assertTrue(set.contains(2)); + assertTrue(set.contains(3)); + assertFalse(set.contains(4)); + assertFalse(set.contains(100)); + } +} 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 5ed478a5..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,31 +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()); } @@ -33,33 +35,38 @@ public void testEncode3() { public void testDecode1() { HeaderV1 headerV1 = new HeaderV1(); headerV1.decode("DBAA"); - Assertions.assertEquals(new ArrayList<>(), 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(Arrays.asList(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(Arrays.asList(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 3f53a288..9c184d51 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,18 +1,18 @@ 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; 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.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 { @@ -20,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"))); - tcfCaV1.setFieldValue(TcfCaV1Field.LAST_UPDATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC"))); - 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 @@ -33,56 +38,73 @@ 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(false, false, false, false, false, false, true, true, true, true, true, true)); - tcfCaV1.setFieldValue(TcfCaV1Field.PURPOSES_EXPRESS_CONSENT, - Arrays.asList(true, true, true, true, true, true, false, false, false, false, false, false, true, true, true, - true, true, true, false, false, false, false, false, false)); - tcfCaV1.setFieldValue(TcfCaV1Field.PURPOSES_IMPLIED_CONSENT, - Arrays.asList(false, false, false, false, false, false, true, true, true, true, true, true, false, false, false, - false, false, false, true, true, true, true, true, true)); + 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, + 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, - Arrays.asList(true, true, true, false, false, false, true, true, true, false, false, false, true, true, true, - false, false, false, true, true, true, false, false, false)); - tcfCaV1.setFieldValue(TcfCaV1Field.PUB_PURPOSES_IMPLIED_CONSENT, - Arrays.asList(false, false, false, true, true, true, false, false, false, true, true, true, false, false, false, - true, true, true, false, false, false, true, true, true)); + 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, + 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, Arrays.asList(false, true, false)); - tcfCaV1.setFieldValue(TcfCaV1Field.CUSTOM_PURPOSES_IMPLIED_CONSENT, Arrays.asList(true, false, true)); + tcfCaV1.setFieldValue(TcfCaV1Field.CUSTOM_PURPOSES_EXPRESS_CONSENT, Set.of(1)); + 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"))); - tcfCaV1.setFieldValue(TcfCaV1Field.LAST_UPDATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC"))); + 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"))); - tcfCaV1.setFieldValue(TcfCaV1Field.LAST_UPDATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC"))); + 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 public void testEncode4() throws EncodingException, InvalidFieldException { List pubRestrictions = new ArrayList<>(); - pubRestrictions.add(new RangeEntry(1, 1, Arrays.asList(1, 2, 3, 5, 6, 7, 9))); + pubRestrictions.add(new RangeEntry(1, 1, Set.of(1, 2, 3, 5, 6, 7, 9))); 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"))); - tcfCaV1.setFieldValue(TcfCaV1Field.LAST_UPDATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC"))); - 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 @@ -92,35 +114,26 @@ public void testDecode1() { Assertions.assertEquals(0, tcfCaV1.getCmpId()); Assertions.assertEquals(0, tcfCaV1.getCmpVersion()); Assertions.assertEquals(0, tcfCaV1.getVendorListVersion()); + Assertions.assertEquals(0, tcfCaV1.getConsentScreen()); + Assertions.assertEquals(2, tcfCaV1.getPolicyVersion()); + Assertions.assertEquals(1, tcfCaV1.getVersion()); 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.getVendorExpressConsent()); + Assertions.assertEquals(Set.of(), tcfCaV1.getVendorImpliedConsent()); + 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( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false), - tcfCaV1.getSpecialFeatureExpressConsent()); - Assertions - .assertEquals( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false), - tcfCaV1.getPurposesExpressConsent()); - Assertions - .assertEquals( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false), - tcfCaV1.getPurposesImpliedConsent()); - Assertions.assertEquals(Arrays.asList(), tcfCaV1.getVendorExpressConsent()); - Assertions.assertEquals(Arrays.asList(), tcfCaV1.getVendorImpliedConsent()); - Assertions.assertEquals( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false), - tcfCaV1.getPubPurposesExpressConsent()); + ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toInstant(), + tcfCaV1.getCreated()); Assertions.assertEquals( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false), - tcfCaV1.getPubPurposesImpliedConsent()); - Assertions.assertEquals(0, tcfCaV1.getNumCustomPurposes()); - Assertions.assertEquals(Arrays.asList(), tcfCaV1.getCustomPurposesExpressConsent()); - Assertions.assertEquals(Arrays.asList(), tcfCaV1.getCustomPurposesImpliedConsent()); - Assertions.assertEquals(ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")), tcfCaV1.getCreated()); - Assertions.assertEquals(ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")), tcfCaV1.getLastUpdated()); + 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()); @@ -129,37 +142,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(Arrays.asList(false, false, false, false, false, false, true, true, true, true, true, true), - tcfCaV1.getSpecialFeatureExpressConsent()); - Assertions.assertEquals(Arrays.asList(true, true, true, true, true, true, false, false, false, false, false, false, - true, true, true, true, true, true, false, false, false, false, false, false), - tcfCaV1.getPurposesExpressConsent()); - Assertions.assertEquals(Arrays.asList(false, false, false, false, false, false, true, true, true, true, true, true, - false, false, false, false, false, false, true, true, true, true, true, true), - tcfCaV1.getPurposesImpliedConsent()); - Assertions.assertEquals(Arrays.asList(12, 24, 48), tcfCaV1.getVendorExpressConsent()); - Assertions.assertEquals(Arrays.asList(18, 30), tcfCaV1.getVendorImpliedConsent()); - Assertions - .assertEquals( - Arrays.asList(true, true, true, false, false, false, true, true, true, false, false, false, true, true, - true, false, false, false, true, true, true, false, false, false), - tcfCaV1.getPubPurposesExpressConsent()); - Assertions - .assertEquals( - Arrays.asList(false, false, false, true, true, true, false, false, false, true, true, true, false, false, - false, true, true, true, false, false, false, true, true, true), - tcfCaV1.getPubPurposesImpliedConsent()); + 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(3, tcfCaV1.getNumCustomPurposes()); - Assertions.assertEquals(Arrays.asList(false, true, false), tcfCaV1.getCustomPurposesExpressConsent()); - Assertions.assertEquals(Arrays.asList(true, false, true), tcfCaV1.getCustomPurposesImpliedConsent()); - Assertions.assertEquals(ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")), tcfCaV1.getCreated()); - Assertions.assertEquals(ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")), tcfCaV1.getLastUpdated()); + 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("EN", tcfCaV1.getConsentLanguage()); Assertions.assertEquals(5, tcfCaV1.getId()); @@ -171,31 +181,36 @@ public void testDecode3() throws DecodingException { TcfCaV1 tcfCaV1 = new TcfCaV1("BPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAA.YAAAAAAAAAA.IAGO5w"); Assertions.assertEquals(1, tcfCaV1.getDisclosedVendorsSegmentType()); - Assertions.assertEquals(Arrays.asList(1, 2, 3, 5, 6, 7, 10, 11, 12), tcfCaV1.getDisclosedVendors()); + Assertions.assertEquals(Set.of(1, 2, 3, 5, 6, 7, 10, 11, 12), tcfCaV1.getDisclosedVendors()); } @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()); Assertions.assertEquals(1, pubRestictions.get(0).getKey()); Assertions.assertEquals(1, pubRestictions.get(0).getType()); - Assertions.assertEquals(Arrays.asList(1, 2, 3, 5, 6, 7, 9), pubRestictions.get(0).getIds()); + 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 945f7468..a5a0794f 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,46 +1,56 @@ 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; 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.datatype.RangeEntry; -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"))); - tcfEuV2.setFieldValue(TcfEuV2Field.LAST_UPDATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC"))); - 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_8AAAAAAENAAFgAAAAAAAAAAAAAAAAAAAA.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"))); - tcfEuV2.setFieldValue(TcfEuV2Field.LAST_UPDATED, ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC"))); + 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( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false), - tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_CONSENTS)); - Assertions.assertEquals( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false), - 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(Arrays.asList(), tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_CUSTOM_CONSENTS)); - Assertions.assertEquals(Arrays.asList(), 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_8AAAAAAENAAFgAAAAAAAAAAAAAAAAAAAA.YAAAAAAAAAAA.IAAA", tcfEuV2.encode()); } @Test @@ -48,8 +58,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")), tcfEuV2.getCreated()); - Assertions.assertEquals(ZonedDateTime.of(1970, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")), 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()); @@ -58,40 +72,24 @@ public void testDecode1() { Assertions.assertEquals(2, tcfEuV2.getPolicyVersion()); Assertions.assertEquals(false, tcfEuV2.getIsServiceSpecific()); Assertions.assertEquals(false, tcfEuV2.getUseNonStandardStacks()); - Assertions.assertEquals( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false), - tcfEuV2.getSpecialFeatureOptins()); - Assertions - .assertEquals( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false), - tcfEuV2.getPurposeConsents()); - Assertions.assertEquals( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false), - 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(Arrays.asList(), tcfEuV2.getVendorConsents()); - Assertions.assertEquals(Arrays.asList(), tcfEuV2.getVendorLegitimateInterests()); + 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( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false), - tcfEuV2.getPublisherConsents()); - Assertions.assertEquals( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false), - tcfEuV2.getPublisherLegitimateInterests()); + Assertions.assertEquals(Set.of(), tcfEuV2.getPublisherConsents()); + Assertions.assertEquals(Set.of(), tcfEuV2.getPublisherLegitimateInterests()); Assertions.assertEquals(0, tcfEuV2.getNumCustomPurposes()); - Assertions.assertEquals(Arrays.asList(), tcfEuV2.getPublisherCustomConsents()); - Assertions.assertEquals(Arrays.asList(), tcfEuV2.getPublisherCustomLegitimateInterests()); + Assertions.assertEquals(Set.of(), tcfEuV2.getPublisherCustomConsents()); + Assertions.assertEquals(Set.of(), tcfEuV2.getPublisherCustomLegitimateInterests()); Assertions.assertEquals(2, tcfEuV2.getVendorsAllowedSegmentType()); - Assertions.assertEquals(Arrays.asList(), tcfEuV2.getVendorsAllowed()); + Assertions.assertEquals(Set.of(), tcfEuV2.getVendorsAllowed()); Assertions.assertEquals(1, tcfEuV2.getVendorsDisclosedSegmentType()); - Assertions.assertEquals(Arrays.asList(), tcfEuV2.getVendorsDisclosed()); + Assertions.assertEquals(Set.of(), tcfEuV2.getVendorsDisclosed()); Assertions.assertEquals(2, tcfEuV2.getId()); } @@ -101,8 +99,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")), tcfEuV2.getCreated()); - Assertions.assertEquals(ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")), 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()); @@ -111,67 +113,51 @@ public void testDecode2() { Assertions.assertEquals(2, tcfEuV2.getPolicyVersion()); Assertions.assertEquals(true, tcfEuV2.getIsServiceSpecific()); Assertions.assertEquals(false, tcfEuV2.getUseNonStandardStacks()); - Assertions.assertEquals( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false), - tcfEuV2.getSpecialFeatureOptins()); - Assertions - .assertEquals( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false), - tcfEuV2.getPurposeConsents()); - Assertions.assertEquals( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false), - 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(Arrays.asList(), tcfEuV2.getVendorConsents()); - Assertions.assertEquals(Arrays.asList(), tcfEuV2.getVendorLegitimateInterests()); + 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( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, false), - tcfEuV2.getPublisherConsents()); - Assertions.assertEquals( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false), - tcfEuV2.getPublisherLegitimateInterests()); + Assertions.assertEquals(Set.of(), tcfEuV2.getPublisherConsents()); + Assertions.assertEquals(Set.of(), tcfEuV2.getPublisherLegitimateInterests()); Assertions.assertEquals(0, tcfEuV2.getNumCustomPurposes()); - Assertions.assertEquals(Arrays.asList(), tcfEuV2.getPublisherCustomConsents()); - Assertions.assertEquals(Arrays.asList(), tcfEuV2.getPublisherCustomLegitimateInterests()); + Assertions.assertEquals(Set.of(), tcfEuV2.getPublisherCustomConsents()); + Assertions.assertEquals(Set.of(), tcfEuV2.getPublisherCustomLegitimateInterests()); Assertions.assertEquals(2, tcfEuV2.getVendorsAllowedSegmentType()); - Assertions.assertEquals(Arrays.asList(), tcfEuV2.getVendorsAllowed()); + Assertions.assertEquals(Set.of(), tcfEuV2.getVendorsAllowed()); Assertions.assertEquals(1, tcfEuV2.getVendorsDisclosedSegmentType()); - Assertions.assertEquals(Arrays.asList(), tcfEuV2.getVendorsDisclosed()); + Assertions.assertEquals(Set.of(), tcfEuV2.getVendorsDisclosed()); Assertions.assertEquals(2, tcfEuV2.getId()); } - @SuppressWarnings("unchecked") @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 = (List) 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)); @@ -193,8 +179,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 = (List) 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)); @@ -216,206 +203,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()); } - @SuppressWarnings("unchecked") @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( - Arrays.asList(true, false, false, false, false, false, false, false, false, false, false, false), - tcfEuV2.getFieldValue("SpecialFeatureOptins")); - Assertions - .assertEquals( - Arrays.asList(true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, - false, false, false, false, false, false, false, false, false), - tcfEuV2.getFieldValue("PurposeConsents")); - Assertions.assertEquals( - Arrays.asList(false, true, false, false, false, true, true, true, true, true, false, false, false, false, false, - false, false, false, false, false, false, false, false, false), - tcfEuV2.getFieldValue("PurposeLegitimateInterests")); - - Assertions.assertEquals(false, tcfEuV2.getFieldValue("PurposeOneTreatment")); - Assertions.assertEquals("US", tcfEuV2.getFieldValue("PublisherCountryCode")); - - Assertions.assertEquals(772, ((List) tcfEuV2.getFieldValue("VendorConsents")).size()); - - Assertions.assertEquals(280, ((List) tcfEuV2.getFieldValue("VendorLegitimateInterests")).size()); + 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(TcfEuV2Field.PURPOSE_LEGITIMATE_INTERESTS)); + + Assertions.assertEquals(false, tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_ONE_TREATMENT)); + Assertions.assertEquals("US", tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); + + Assertions.assertEquals( + 772, ((IntegerSet) tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_CONSENTS)).size()); + + Assertions.assertEquals( + 280, ((IntegerSet) tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_LEGITIMATE_INTERESTS)).size()); } - @SuppressWarnings("unchecked") @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( - Arrays.asList(true, false, false, false, false, false, false, false, false, false, false, false), - tcfEuV2.getFieldValue("SpecialFeatureOptins")); - Assertions - .assertEquals( - Arrays.asList(true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, - false, false, false, false, false, false, false, false, false), - tcfEuV2.getFieldValue("PurposeConsents")); - Assertions.assertEquals( - Arrays.asList(false, true, false, false, false, true, true, true, true, true, false, false, false, false, false, - false, false, false, false, false, false, false, false, false), - tcfEuV2.getFieldValue("PurposeLegitimateInterests")); - - Assertions.assertEquals(false, tcfEuV2.getFieldValue("PurposeOneTreatment")); - Assertions.assertEquals("US", tcfEuV2.getFieldValue("PublisherCountryCode")); - - Assertions.assertEquals(693, ((List) tcfEuV2.getFieldValue("VendorConsents")).size()); - - Assertions.assertEquals(254, ((List) tcfEuV2.getFieldValue("VendorLegitimateInterests")).size()); + 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(TcfEuV2Field.PURPOSE_LEGITIMATE_INTERESTS)); + + Assertions.assertEquals(false, tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_ONE_TREATMENT)); + Assertions.assertEquals("US", tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); + + Assertions.assertEquals( + 693, ((IntegerSet) tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_CONSENTS)).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( - Arrays.asList(false, false, false, false, false, false, false, false, false, false, false, false), - tcfEuV2.getFieldValue("SpecialFeatureOptins")); - Assertions - .assertEquals( - Arrays.asList(true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, - false, false, false, false, false, false, false, false, false), - tcfEuV2.getFieldValue("PurposeConsents")); - Assertions.assertEquals( - Arrays.asList(false, true, true, true, true, true, true, true, true, true, false, false, false, false, false, - false, false, false, false, false, false, false, false, false), - tcfEuV2.getFieldValue("PurposeLegitimateInterests")); - - Assertions.assertEquals(false, tcfEuV2.getFieldValue("PurposeOneTreatment")); - Assertions.assertEquals("US", tcfEuV2.getFieldValue("PublisherCountryCode")); - - Assertions.assertEquals(Arrays.asList(2, 6, 8, 12, 18, 23, 25, 37, 42), tcfEuV2.getFieldValue("VendorConsents")); - - Assertions.assertEquals(Arrays.asList(2, 6, 8, 12, 18, 23, 37, 42), - tcfEuV2.getFieldValue("VendorLegitimateInterests")); + 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(TcfEuV2Field.PURPOSE_LEGITIMATE_INTERESTS)); + + 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(TcfEuV2Field.VENDOR_CONSENTS)); + + 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[UTC]", tcfEuV2.getFieldValue("Created").toString()); - Assertions.assertEquals("2019-10-07T05:17:54Z[UTC]", 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( - Arrays.asList(true, false, false, false, false, false, false, false, false, false, false, false), - tcfEuV2.getFieldValue("SpecialFeatureOptins")); + "2019-10-07T05:17:54Z", tcfEuV2.getFieldValue(TcfEuV2Field.CREATED).toString()); Assertions.assertEquals( - Arrays.asList(true, false, false, false, false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false), - 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( - Arrays.asList(false, true, false, false, false, false, true, false, true, true, false, false, false, false, - false, false, false, false, false, false, false, false, false, false), - tcfEuV2.getFieldValue("PurposeLegitimateInterests")); + Set.of(2, 7, 9, 10), tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_LEGITIMATE_INTERESTS)); + + Assertions.assertEquals(false, tcfEuV2.getFieldValue(TcfEuV2Field.PURPOSE_ONE_TREATMENT)); + Assertions.assertEquals("GB", tcfEuV2.getFieldValue(TcfEuV2Field.PUBLISHER_COUNTRY_CODE)); - Assertions.assertEquals(false, tcfEuV2.getFieldValue("PurposeOneTreatment")); - Assertions.assertEquals("GB", tcfEuV2.getFieldValue("PublisherCountryCode")); + Assertions.assertEquals( + Set.of(1, 2, 3, 755), tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_CONSENTS)); - Assertions.assertEquals(Arrays.asList(1, 2, 3, 755), tcfEuV2.getFieldValue("VendorConsents")); + Assertions.assertEquals( + Set.of(1, 2, 3, 4, 5, 6, 7, 8, 9), + tcfEuV2.getFieldValue(TcfEuV2Field.VENDOR_LEGITIMATE_INTERESTS)); - Assertions.assertEquals(Arrays.asList(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( + 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(Arrays.asList(10), rangeEntry.getIds()); + 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..cd9e54cb 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() { @@ -151,12 +153,15 @@ public void testEncodeWithGpcSegmentExcluded() { public void testDecode1() { UsCa usCa = new UsCa("BVWSSSVY.YA"); + Assertions.assertEquals(1, usCa.getVersion()); Assertions.assertEquals(1, usCa.getSaleOptOutNotice()); Assertions.assertEquals(1, usCa.getSharingOptOut()); + Assertions.assertEquals(1, usCa.getSharingOptOutNotice()); 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 +179,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 +188,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..79f337ce 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 @@ -122,6 +120,7 @@ public void testEncodeWithGpcSegmentExcluded() { public void testDecode1() { UsCo usCo = new UsCo("BVWSSVg.YA"); + Assertions.assertEquals(1, usCo.getVersion()); Assertions.assertEquals(1, usCo.getSharingNotice()); Assertions.assertEquals(1, usCo.getSaleOptOutNotice()); Assertions.assertEquals(1, usCo.getTargetedAdvertisingOptOutNotice()); @@ -151,11 +150,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..75647697 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) { - + } } @@ -121,12 +121,14 @@ public void testEncodeWithGpcSegmentExcluded() { public void testDecode1() throws DecodingException { UsCt usCt = new UsCt("BVWSSZFg.YA"); + Assertions.assertEquals(1, usCt.getVersion()); Assertions.assertEquals(1, usCt.getSharingNotice()); Assertions.assertEquals(1, usCt.getSaleOptOutNotice()); 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 +145,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..93f49a4a 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) { - + } } @@ -129,13 +130,16 @@ public void testEncodeWithGpcSegmentExcluded() { public void testDecode1() throws DecodingException { UsDe usDe = new UsDe("BVWSSSSVYA.YA"); + Assertions.assertEquals(1, usDe.getVersion()); Assertions.assertEquals(1, usDe.getProcessingNotice()); Assertions.assertEquals(1, usDe.getSaleOptOutNotice()); 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 +156,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..e8cf21f4 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,30 +122,33 @@ public void testSetInvalidValues() { } catch (ValidationException e) { } - } @Test public void testDecode1() throws DecodingException { UsFl usFl = new UsFl("BVWSSZlY"); + Assertions.assertEquals(1, usFl.getVersion()); Assertions.assertEquals(1, usFl.getProcessingNotice()); Assertions.assertEquals(1, usFl.getSaleOptOutNotice()); 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..178de70c 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) { - + } } @@ -129,13 +129,15 @@ public void testEncodeWithGpcSegmentExcluded() { public void testDecode1() throws DecodingException { UsIa usIa = new UsIa("BVVkklWA.YA"); + Assertions.assertEquals(1, usIa.getVersion()); Assertions.assertEquals(1, usIa.getProcessingNotice()); Assertions.assertEquals(1, usIa.getSaleOptOutNotice()); Assertions.assertEquals(1, usIa.getTargetedAdvertisingOptOutNotice()); 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 +155,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 index 3b397757..42501379 100644 --- 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 @@ -1,14 +1,12 @@ 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; -import java.util.Arrays; - public class UsMnTest { @Test @@ -36,7 +34,7 @@ public void testEncode2() { Assertions.assertEquals("BVWSSVWA.YA", usMn.encode()); } - + @Test public void testSetInvalidValues() { UsMn usMn = new UsMn(); @@ -45,77 +43,78 @@ public void testSetInvalidValues() { 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)); + 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) { - + } } @@ -130,12 +129,14 @@ public void testEncodeWithGpcSegmentExcluded() { public void testDecode1() throws DecodingException { UsMn usMn = new UsMn("BVWSSVWA.YA"); + Assertions.assertEquals(1, usMn.getVersion()); 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( + 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()); @@ -153,7 +154,8 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { 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( + 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()); @@ -161,11 +163,13 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { Assertions.assertEquals(2, usMn.getMspaServiceProviderMode()); Assertions.assertEquals(false, usMn.getGpcSegmentIncluded()); } - + @Test() public void testDecodeGarbage() { - Assertions.assertThrows(DecodingException.class, () -> { - new UsMn("z").getProcessingNotice(); - }); + 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..8f18c393 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) { - + } } @@ -129,12 +129,14 @@ public void testEncodeWithGpcSegmentExcluded() { public void testDecode1() throws DecodingException { UsMt usMt = new UsMt("BVWSSZFY.YA"); + Assertions.assertEquals(1, usMt.getVersion()); Assertions.assertEquals(1, usMt.getSharingNotice()); Assertions.assertEquals(1, usMt.getSaleOptOutNotice()); 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 +154,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 +163,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 4d32c057..5c5322f9 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,13 +184,14 @@ 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(2, usNat.getVersion()); Assertions.assertEquals(1, usNat.getSharingNotice()); Assertions.assertEquals(1, usNat.getSaleOptOutNotice()); Assertions.assertEquals(1, usNat.getSharingOptOutNotice()); @@ -198,7 +201,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()); @@ -211,6 +216,7 @@ public void testDecode1() throws DecodingException { public void testDecodeWithGpcSegmentExcluded() throws DecodingException { UsNat usNat = new UsNat("BVVVkkkkkpFY"); + Assertions.assertEquals(2, usNat.getVersion()); Assertions.assertEquals(1, usNat.getSharingNotice()); Assertions.assertEquals(1, usNat.getSaleOptOutNotice()); Assertions.assertEquals(1, usNat.getSharingOptOutNotice()); @@ -220,7 +226,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()); @@ -233,6 +241,7 @@ public void testDecodeWithGpcSegmentExcluded() throws DecodingException { public void testDecodeBackwardsCompatibility() throws DecodingException { UsNat usNat = new UsNat("BVQqAAAACg"); + Assertions.assertEquals(1, usNat.getVersion()); Assertions.assertEquals(1, usNat.getSharingNotice()); Assertions.assertEquals(1, usNat.getSaleOptOutNotice()); Assertions.assertEquals(1, usNat.getSharingOptOutNotice()); @@ -242,19 +251,22 @@ public void testDecodeBackwardsCompatibility() throws DecodingException { 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, 0, 0, 0, 0), usNat.getSensitiveDataProcessing()); - Assertions.assertEquals(Arrays.asList(0, 0, 0), usNat.getKnownChildSensitiveDataConsents()); + 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..a8926c9d 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) { - + } } @@ -129,12 +129,14 @@ public void testEncodeWithGpcSegmentExcluded() { public void testDecode1() throws DecodingException { UsNe usNe = new UsNe("BVWSSVWA.YA"); + Assertions.assertEquals(1, usNe.getVersion()); Assertions.assertEquals(1, usNe.getProcessingNotice()); Assertions.assertEquals(1, usNe.getSaleOptOutNotice()); 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 +154,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 +163,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..41e466f5 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) { - + } } @@ -129,12 +129,14 @@ public void testEncodeWithGpcSegmentExcluded() { public void testDecode1() throws DecodingException { UsNh usNh = new UsNh("BVWSSZFY.YA"); + Assertions.assertEquals(1, usNh.getVersion()); Assertions.assertEquals(1, usNh.getProcessingNotice()); Assertions.assertEquals(1, usNh.getSaleOptOutNotice()); 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 +154,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 +163,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..14deba8a 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) { - + } } @@ -129,13 +130,16 @@ public void testEncodeWithGpcSegmentExcluded() { public void testDecode1() throws DecodingException { UsNj usNj = new UsNj("BVWSSRklWA.YA"); + Assertions.assertEquals(1, usNj.getVersion()); Assertions.assertEquals(1, usNj.getProcessingNotice()); Assertions.assertEquals(1, usNj.getSaleOptOutNotice()); 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 +156,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..20a78202 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) { - + } } @@ -129,12 +130,14 @@ public void testEncodeWithGpcSegmentExcluded() { public void testDecode1() throws DecodingException { UsOr usOr = new UsOr("BVWSSRpFYA.YA"); + Assertions.assertEquals(1, usOr.getVersion()); Assertions.assertEquals(1, usOr.getProcessingNotice()); Assertions.assertEquals(1, usOr.getSaleOptOutNotice()); 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 +155,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 +164,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..c8b477fc 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) { - + } } @@ -129,12 +129,14 @@ public void testEncodeWithGpcSegmentExcluded() { public void testDecode1() throws DecodingException { UsTn usTn = new UsTn("BVWSSVWA.YA"); + Assertions.assertEquals(1, usTn.getVersion()); Assertions.assertEquals(1, usTn.getProcessingNotice()); Assertions.assertEquals(1, usTn.getSaleOptOutNotice()); 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 +154,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 +163,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..8c0aa931 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) { - + } } @@ -129,12 +129,14 @@ public void testEncodeWithGpcSegmentExcluded() { public void testDecode1() throws DecodingException { UsTx usTx = new UsTx("BVWSSVWA.YA"); + Assertions.assertEquals(1, usTx.getVersion()); Assertions.assertEquals(1, usTx.getProcessingNotice()); Assertions.assertEquals(1, usTx.getSaleOptOutNotice()); 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 +154,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 +163,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..20c3e7f3 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,101 +42,106 @@ 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 public void testDecode1() throws DecodingException { UsUt usUt = new UsUt("BVVkklWA"); + Assertions.assertEquals(1, usUt.getVersion()); Assertions.assertEquals(1, usUt.getSharingNotice()); Assertions.assertEquals(1, usUt.getSaleOptOutNotice()); Assertions.assertEquals(1, usUt.getTargetedAdvertisingOptOutNotice()); Assertions.assertEquals(1, usUt.getSaleOptOut()); + Assertions.assertEquals(1, usUt.getSensitiveDataProcessingOptOutNotice()); 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..afea3f8d 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,19 +114,20 @@ public void testSetInvalidValues() { } catch (ValidationException e) { } - } @Test public void testDecode1() throws DecodingException { UsVa usVa = new UsVa("BVWSSVY"); + Assertions.assertEquals(1, usVa.getVersion()); Assertions.assertEquals(1, usVa.getSharingNotice()); Assertions.assertEquals(1, usVa.getSaleOptOutNotice()); 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 +136,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 bd0d839c..57af2ed7 100644 --- a/iabgpp-extras-jackson/pom.xml +++ b/iabgpp-extras-jackson/pom.xml @@ -7,7 +7,7 @@ iabgpp-core com.iabgpp - 3.2.6-SNAPSHOT + 4.0.0-RC1 iabgpp-extras-jackson @@ -25,7 +25,7 @@ com.iabgpp iabgpp-extras - 3.2.6-SNAPSHOT + 4.0.0-RC1 @@ -46,7 +46,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 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 61879021..1cfe8e32 100644 --- a/iabgpp-extras/pom.xml +++ b/iabgpp-extras/pom.xml @@ -7,7 +7,7 @@ com.iabgpp iabgpp-core - 3.2.6-SNAPSHOT + 4.0.0-RC1 iabgpp-extras @@ -18,7 +18,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 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 5d5bd6a7..c8a7ac09 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.iabgpp iabgpp-core - 3.2.6-SNAPSHOT + 4.0.0-RC1 IAB GPP Core Library https://github.com/IABTechLabs/iabtcf-java Encode and decode consent information with the IAB GPP v3.0. @@ -58,6 +58,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 @@ -76,6 +120,9 @@ org.apache.maven.plugins maven-javadoc-plugin 3.3.1 + + public + attach-javadoc