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}