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 implements IValidationSupport {
014        private final FhirContext myHapiCtx;
015
016        /**
017         * Constructor
018         */
019        public HapiToHl7OrgDstu2ValidatingSupportWrapper(IValidationSupport theWrap) {
020                super(FhirContext.forDstu2Hl7Org(), theWrap);
021
022                Validate.isTrue(theWrap.getFhirContext().getVersion().getVersion() == FhirVersionEnum.DSTU2);
023                myHapiCtx = theWrap.getFhirContext();
024        }
025
026        @Override
027        public List<IBaseResource> fetchAllConformanceResources() {
028                return super.fetchAllConformanceResources();
029        }
030
031        @Override
032        public List<IBaseResource> fetchAllStructureDefinitions() {
033                return super
034                        .fetchAllStructureDefinitions()
035                        .stream()
036                        .map(t -> translate(t))
037                        .collect(Collectors.toList());
038        }
039
040        @Override
041        public <T extends IBaseResource> T fetchResource(Class<T> theClass, String theUri) {
042                Class<? extends IBaseResource> type = translateTypeToHapi(theClass);
043                IBaseResource output = super.fetchResource(type, theUri);
044                return theClass.cast(translate(output));
045        }
046
047        @Override
048        public IBaseResource fetchCodeSystem(String theSystem) {
049                IBaseResource output = super.fetchCodeSystem(theSystem);
050                return translate(output);
051        }
052
053        @Override
054        public IBaseResource fetchValueSet(String theUri) {
055                return translate(super.fetchValueSet(theUri));
056        }
057
058        @Override
059        public IBaseResource fetchStructureDefinition(String theUrl) {
060                return translate(super.fetchStructureDefinition(theUrl));
061        }
062
063        private Class<? extends IBaseResource> translateTypeToHapi(Class<? extends IBaseResource> theCodeSystemType) {
064                String resName = getFhirContext().getResourceType(theCodeSystemType);
065                return myHapiCtx.getResourceDefinition(resName).getImplementingClass();
066        }
067
068        private IBaseResource translate(IBaseResource theInput) {
069                if (theInput == null) {
070                        return null;
071                }
072                String encoded = myHapiCtx.newJsonParser().encodeResourceToString(theInput);
073                return getFhirContext().newJsonParser().parseResource(encoded);
074        }
075}