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