
001/*- 002 * #%L 003 * HAPI FHIR Storage api 004 * %% 005 * Copyright (C) 2014 - 2025 Smile CDR, Inc. 006 * %% 007 * Licensed under the Apache License, Version 2.0 (the "License"); 008 * you may not use this file except in compliance with the License. 009 * You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, software 014 * distributed under the License is distributed on an "AS IS" BASIS, 015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 016 * See the License for the specific language governing permissions and 017 * limitations under the License. 018 * #L% 019 */ 020package ca.uhn.fhir.jpa.validation; 021 022import ca.uhn.fhir.context.FhirContext; 023import org.hl7.fhir.r5.elementmodel.Element; 024import org.hl7.fhir.r5.model.ElementDefinition; 025import org.hl7.fhir.r5.model.StructureDefinition; 026import org.hl7.fhir.r5.model.ValueSet; 027import org.hl7.fhir.r5.utils.validation.IMessagingServices; 028import org.hl7.fhir.r5.utils.validation.IResourceValidator; 029import org.hl7.fhir.r5.utils.validation.IValidationPolicyAdvisor; 030import org.hl7.fhir.r5.utils.validation.constants.BindingKind; 031import org.hl7.fhir.r5.utils.validation.constants.ContainedReferenceValidationPolicy; 032import org.hl7.fhir.r5.utils.validation.constants.ReferenceValidationPolicy; 033import org.hl7.fhir.utilities.validation.ValidationMessage; 034import org.slf4j.Logger; 035import org.slf4j.LoggerFactory; 036import org.springframework.beans.factory.annotation.Autowired; 037 038import java.util.Arrays; 039import java.util.EnumSet; 040import java.util.List; 041import java.util.Set; 042 043public class ValidatorPolicyAdvisor implements IValidationPolicyAdvisor { 044 045 private static final Logger ourLog = LoggerFactory.getLogger(ValidatorPolicyAdvisor.class); 046 047 @Autowired 048 private ValidationSettings myValidationSettings; 049 050 @Autowired 051 private FhirContext myFhirContext; 052 053 @Override 054 public EnumSet<ResourceValidationAction> policyForResource( 055 IResourceValidator validator, Object appContext, StructureDefinition type, String path) { 056 return EnumSet.allOf(ResourceValidationAction.class); 057 } 058 059 @Override 060 public EnumSet<ElementValidationAction> policyForElement( 061 IResourceValidator validator, 062 Object appContext, 063 StructureDefinition structure, 064 ElementDefinition element, 065 String path) { 066 return EnumSet.allOf(ElementValidationAction.class); 067 } 068 069 @Override 070 public EnumSet<CodedContentValidationAction> policyForCodedContent( 071 IResourceValidator validator, 072 Object appContext, 073 String stackPath, 074 ElementDefinition definition, 075 StructureDefinition structure, 076 BindingKind kind, 077 AdditionalBindingPurpose purpose, 078 ValueSet valueSet, 079 List<String> systems) { 080 return EnumSet.allOf(CodedContentValidationAction.class); 081 } 082 083 @Override 084 public SpecialValidationAction policyForSpecialValidation( 085 IResourceValidator validator, 086 Object appContext, 087 SpecialValidationRule rule, 088 String stackPath, 089 Element resource, 090 Element element) { 091 return null; 092 } 093 094 @Override 095 public ContainedReferenceValidationPolicy policyForContained( 096 IResourceValidator validator, 097 Object appContext, 098 StructureDefinition structure, 099 ElementDefinition element, 100 String containerType, 101 String containerId, 102 Element.SpecialElement containingResourceType, 103 String path, 104 String url) { 105 return ContainedReferenceValidationPolicy.CHECK_VALID; 106 } 107 108 @Override 109 public List<StructureDefinition> getImpliedProfilesForResource( 110 IResourceValidator validator, 111 Object appContext, 112 String stackPath, 113 ElementDefinition definition, 114 StructureDefinition structure, 115 Element resource, 116 boolean valid, 117 IMessagingServices msgServices, 118 List<ValidationMessage> messages) { 119 return Arrays.asList(); 120 } 121 122 @Override 123 public boolean isSuppressMessageId(String path, String messageId) { 124 return false; 125 } 126 127 @Override 128 public ReferenceValidationPolicy policyForReference( 129 IResourceValidator validator, 130 Object appContext, 131 String path, 132 String url, 133 ReferenceDestinationType destinationType) { 134 int slashIdx = url.indexOf("/"); 135 if (slashIdx > 0 && myFhirContext.getResourceTypes().contains(url.substring(0, slashIdx))) { 136 return myValidationSettings.getLocalReferenceValidationDefaultPolicy(); 137 } 138 return ReferenceValidationPolicy.IGNORE; 139 } 140 141 @Override 142 public IValidationPolicyAdvisor getPolicyAdvisor() { 143 return this; 144 } 145 146 @Override 147 public IValidationPolicyAdvisor setPolicyAdvisor(IValidationPolicyAdvisor policyAdvisor) { 148 return this; 149 } 150 151 @Override 152 public ReferenceValidationPolicy getReferencePolicy() { 153 return ReferenceValidationPolicy.IGNORE; 154 } 155 156 @Override 157 public Set<String> getCheckReferencesTo() { 158 return Set.of(); 159 } 160}