001/*- 002 * #%L 003 * Smile CDR - CDR 004 * %% 005 * Copyright (C) 2016 - 2025 Smile CDR, Inc. 006 * %% 007 * All rights reserved. 008 * #L% 009 */ 010package ca.cdr.api.model.json; 011 012import ca.uhn.fhir.model.api.annotation.ExampleSupplier; 013import com.fasterxml.jackson.annotation.JsonProperty; 014import io.swagger.v3.oas.annotations.media.Schema; 015import jakarta.annotation.Nonnull; 016import org.apache.commons.lang3.Validate; 017 018import java.util.ArrayList; 019import java.util.List; 020import java.util.function.Supplier; 021 022/** 023 * This class implements the rules used for data tokenization in the 024 * FHIR Storage module. 025 */ 026@Schema( 027 name = "TokenizationRules", 028 description = 029 "Defines a collection of rules for [FHIR Repository Tokenization](/docs/fhir_repository/tokenization.md)") 030@ExampleSupplier(TokenizationRulesJson.ExampleSupplier.class) 031public class TokenizationRulesJson implements IModelJson { 032 033 @JsonProperty("rules") 034 private List<TokenizationRuleJson> myRules; 035 036 public List<TokenizationRuleJson> getRules() { 037 if (myRules == null) { 038 myRules = new ArrayList<>(); 039 } 040 return myRules; 041 } 042 043 public void setRules(List<TokenizationRuleJson> theRules) { 044 myRules = theRules; 045 } 046 047 public TokenizationRuleJson addRule() { 048 TokenizationRuleJson rule = new TokenizationRuleJson(); 049 addRule(rule); 050 return rule; 051 } 052 053 public TokenizationRulesJson addRule(@Nonnull TokenizationRuleJson theRule) { 054 Validate.notNull(theRule, "theRule must not be null"); 055 getRules().add(theRule); 056 return this; 057 } 058 059 public static class ExampleSupplier implements Supplier<TokenizationRulesJson> { 060 @Override 061 public TokenizationRulesJson get() { 062 TokenizationRulesJson rules = new TokenizationRulesJson(); 063 064 rules.addRule() 065 .setDescription("Rule for a path including a search parameter") 066 .setPath("Patient.identifier") 067 .setSearchParameter("identifier") 068 .setStatus(TokenizationRuleJson.RuleStatusEnum.ACTIVE) 069 .setSearchValueNormalization(TokenizationValueNormalizationEnum.IDENTIFIER); 070 071 rules.addRule() 072 .setDescription("Another rule for a path including a search parameter") 073 .setPath("Patient.name.family") 074 .setSearchParameter("family") 075 .setStatus(TokenizationRuleJson.RuleStatusEnum.ACTIVE) 076 .setSearchValueNormalization(TokenizationValueNormalizationEnum.STRING); 077 078 rules.addRule() 079 .setDescription("This rule is in 'QUIESCE' status, so it will not be applied to any new data") 080 .setPath("Patient.name.given") 081 .setSearchParameter("given") 082 .setStatus(TokenizationRuleJson.RuleStatusEnum.QUIESCE) 083 .setSearchValueNormalization(TokenizationValueNormalizationEnum.STRING); 084 085 rules.addRule() 086 .setDescription("Rule for a path with no associated search parameter") 087 .setPath("Patient.maritalStatus") 088 .setStatus(TokenizationRuleJson.RuleStatusEnum.ACTIVE) 089 .setSearchValueNormalization(TokenizationValueNormalizationEnum.NONE); 090 091 return rules; 092 } 093 } 094}