001package org.hl7.fhir.common.hapi.validation.validator;
002
003import ca.uhn.fhir.context.FhirContext;
004import ca.uhn.fhir.context.FhirVersionEnum;
005import ca.uhn.fhir.context.support.IValidationSupport;
006import org.apache.commons.lang3.Validate;
007import org.hl7.fhir.common.hapi.validation.support.BaseValidationSupportWrapper;
008import org.hl7.fhir.instance.model.api.IBaseResource;
009
010import java.util.List;
011import java.util.stream.Collectors;
012
013public class HapiToHl7OrgDstu2ValidatingSupportWrapper extends BaseValidationSupportWrapper
014                implements IValidationSupport {
015        private final FhirContext myHapiCtx;
016
017        /**
018         * Constructor
019         */
020        public HapiToHl7OrgDstu2ValidatingSupportWrapper(IValidationSupport theWrap) {
021                super(FhirContext.forDstu2Hl7Org(), theWrap);
022
023                Validate.isTrue(theWrap.getFhirContext().getVersion().getVersion() == FhirVersionEnum.DSTU2);
024                myHapiCtx = theWrap.getFhirContext();
025        }
026
027        @Override
028        public List<IBaseResource> fetchAllConformanceResources() {
029                return super.fetchAllConformanceResources();
030        }
031
032        @Override
033        public List<IBaseResource> fetchAllStructureDefinitions() {
034                return super.fetchAllStructureDefinitions().stream()
035                                .map(t -> translate(t))
036                                .collect(Collectors.toList());
037        }
038
039        @Override
040        public <T extends IBaseResource> T fetchResource(Class<T> theClass, String theUri) {
041                Class<? extends IBaseResource> type = translateTypeToHapi(theClass);
042                IBaseResource output = super.fetchResource(type, theUri);
043                return theClass.cast(translate(output));
044        }
045
046        @Override
047        public IBaseResource fetchCodeSystem(String theSystem) {
048                IBaseResource output = super.fetchCodeSystem(theSystem);
049                return translate(output);
050        }
051
052        @Override
053        public IBaseResource fetchValueSet(String theUri) {
054                return translate(super.fetchValueSet(theUri));
055        }
056
057        @Override
058        public IBaseResource fetchStructureDefinition(String theUrl) {
059                return translate(super.fetchStructureDefinition(theUrl));
060        }
061
062        private Class<? extends IBaseResource> translateTypeToHapi(Class<? extends IBaseResource> theCodeSystemType) {
063                if (theCodeSystemType == null) {
064                        return null;
065                }
066                String resName = getFhirContext().getResourceType(theCodeSystemType);
067                return myHapiCtx.getResourceDefinition(resName).getImplementingClass();
068        }
069
070        private IBaseResource translate(IBaseResource theInput) {
071                if (theInput == null) {
072                        return null;
073                }
074                String encoded = myHapiCtx.newJsonParser().encodeResourceToString(theInput);
075                return getFhirContext().newJsonParser().parseResource(encoded);
076        }
077}