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 if (theCodeSystemType == null) { 065 return null; 066 } 067 String resName = getFhirContext().getResourceType(theCodeSystemType); 068 return myHapiCtx.getResourceDefinition(resName).getImplementingClass(); 069 } 070 071 private IBaseResource translate(IBaseResource theInput) { 072 if (theInput == null) { 073 return null; 074 } 075 String encoded = myHapiCtx.newJsonParser().encodeResourceToString(theInput); 076 return getFhirContext().newJsonParser().parseResource(encoded); 077 } 078}