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}