All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.iab.gpp.encoder.section.TcfCaV1 Maven / Gradle / Ivy

There is a newer version: 3.2.3
Show newest version
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.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;

public class TcfCaV1 extends AbstractLazilyEncodableSection {
  
  public static int ID = 5;
  public static int VERSION = 1;
  public static String NAME = "tcfcav1";

  public TcfCaV1() {
    super();
  }

  public TcfCaV1(String encodedString) {
    super();
    decode(encodedString);
  }

  @Override
  public int getId() {
    return TcfCaV1.ID;
  }

  @Override
  public String getName() {
    return TcfCaV1.NAME;
  }

  @Override
  public int getVersion() {
    return TcfCaV1.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 + "'");
          }
        }
      }
    }
    
    return segments;
  }

  @Override
  public String encodeSection(List segments) {
    List encodedSegments = new ArrayList<>();

    encodedSegments.add(segments.get(0).encode());
    encodedSegments.add(segments.get(1).encode());
    if(!this.getDisclosedVendors().isEmpty()) {
      encodedSegments.add(segments.get(2).encode());
    }
    
    return String.join(".", encodedSegments);
  }

  @Override
  public void setFieldValue(String fieldName, Object value) throws InvalidFieldException {
    super.setFieldValue(fieldName, value);

    if (!fieldName.equals(TcfCaV1Field.CREATED) && !fieldName.equals(TcfCaV1Field.LAST_UPDATED)) {
      ZonedDateTime utcDateTime = ZonedDateTime.now(ZoneId.of("UTC"));

      super.setFieldValue(TcfCaV1Field.CREATED, utcDateTime);
      super.setFieldValue(TcfCaV1Field.LAST_UPDATED, utcDateTime);
    }
  }

  
  public ZonedDateTime getCreated() {
    return (ZonedDateTime) this.getFieldValue(TcfCaV1Field.CREATED);
  }

  public ZonedDateTime getLastUpdated() {
    return (ZonedDateTime) this.getFieldValue(TcfCaV1Field.LAST_UPDATED);
  }

  public Integer getCmpId() {
    return (Integer) this.getFieldValue(TcfCaV1Field.CMP_ID);
  }

  public Integer getCmpVersion() {
    return (Integer) this.getFieldValue(TcfCaV1Field.CMP_VERSION);
  }

  public Integer getConsentScreen() {
    return (Integer) this.getFieldValue(TcfCaV1Field.CONSENT_SCREEN);
  }

  public String getConsentLanguage() {
    return (String) this.getFieldValue(TcfCaV1Field.CONSENT_LANGUAGE);
  }

  public Integer getVendorListVersion() {
    return (Integer) this.getFieldValue(TcfCaV1Field.VENDOR_LIST_VERSION);
  }

  public Integer getPolicyVersion() {
    return (Integer) this.getFieldValue(TcfCaV1Field.TCF_POLICY_VERSION);
  }

  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);
  }

  @SuppressWarnings("unchecked")
  public List getPurposesExpressConsent() {
    return (List) this.getFieldValue(TcfCaV1Field.PURPOSES_EXPRESS_CONSENT);
  }

  @SuppressWarnings("unchecked")
  public List getPurposesImpliedConsent() {
    return (List) this.getFieldValue(TcfCaV1Field.PURPOSES_IMPLIED_CONSENT);
  }

  @SuppressWarnings("unchecked")
  public List getVendorExpressConsent() {
    return (List) this.getFieldValue(TcfCaV1Field.VENDOR_EXPRESS_CONSENT);
  }

  @SuppressWarnings("unchecked")
  public List getVendorImpliedConsent() {
    return (List) 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);
  }

  @SuppressWarnings("unchecked")
  public List getPubPurposesImpliedConsent() {
    return (List) 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);
  }

  @SuppressWarnings("unchecked")
  public List getCustomPurposesImpliedConsent() {
    return (List) 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);
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy