diff --git a/hapi-fhir-structures-dstu3/src/main/java/org/hl7/fhir/dstu3/elementmodel/Property.java b/hapi-fhir-structures-dstu3/src/main/java/org/hl7/fhir/dstu3/elementmodel/Property.java index 0c5a2510b81..62ade417214 100644 --- a/hapi-fhir-structures-dstu3/src/main/java/org/hl7/fhir/dstu3/elementmodel/Property.java +++ b/hapi-fhir-structures-dstu3/src/main/java/org/hl7/fhir/dstu3/elementmodel/Property.java @@ -3,6 +3,7 @@ package org.hl7.fhir.dstu3.elementmodel; import java.util.ArrayList; import java.util.List; +import org.apache.commons.lang3.StringUtils; import org.hl7.fhir.dstu3.conformance.ProfileUtilities; import org.hl7.fhir.dstu3.context.IWorkerContext; import org.hl7.fhir.dstu3.formats.FormatUtilities; @@ -240,7 +241,13 @@ public class Property { } } if (!"xhtml".equals(t)) { - sd = context.fetchResource(StructureDefinition.class, "http://hl7.org/fhir/StructureDefinition/"+t); + final String url; + if (StringUtils.isNotBlank(ed.getType().get(0).getProfile())) { + url = ed.getType().get(0).getProfile(); + } else { + url = "http://hl7.org/fhir/StructureDefinition/" + t; + } + sd = context.fetchResource(StructureDefinition.class, url); if (sd == null) throw new DefinitionException("Unable to find class '"+t+"' for name '"+elementName+"' on property "+definition.getPath()); children = ProfileUtilities.getChildMap(sd, sd.getSnapshot().getElement().get(0)); diff --git a/hapi-fhir-structures-hl7org-dstu2/src/main/java/org/hl7/fhir/instance/validation/InstanceValidator.java b/hapi-fhir-structures-hl7org-dstu2/src/main/java/org/hl7/fhir/instance/validation/InstanceValidator.java index 8c453d9900c..5a323ca47ff 100644 --- a/hapi-fhir-structures-hl7org-dstu2/src/main/java/org/hl7/fhir/instance/validation/InstanceValidator.java +++ b/hapi-fhir-structures-hl7org-dstu2/src/main/java/org/hl7/fhir/instance/validation/InstanceValidator.java @@ -993,8 +993,15 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat return null; } - private StructureDefinition getProfileForType(String type) throws Exception { - return context.fetchResource(StructureDefinition.class, "http://hl7.org/fhir/StructureDefinition/" + type); + private StructureDefinition getProfileForType(ElementDefinition ed, String type) throws Exception { + //return context.fetchResource(StructureDefinition.class, "http://hl7.org/fhir/StructureDefinition/" + type); + final String url; + if (!"Reference".equals(type) && ed.getType().get(0).hasProfile()) { + url = ed.getType().get(0).getProfile().get(0).getValue(); + } else { + url = "http://hl7.org/fhir/StructureDefinition/" + type; + } + return context.fetchResource(StructureDefinition.class, url); } private Element getValueForDiscriminator(WrapperElement element, String discriminator, ElementDefinition criteria) { @@ -1182,8 +1189,14 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat return context.fetchResource(StructureDefinition.class, pr); } - private ElementDefinition resolveType(String type) throws EOperationOutcome, Exception { - String url = "http://hl7.org/fhir/StructureDefinition/" + type; + private ElementDefinition resolveType(ElementDefinition ed, String type) throws EOperationOutcome, Exception { + final String url; + if (ed.getType().get(0).hasProfile()) { + url = ed.getType().get(0).getProfile().get(0).getValue(); + } else { + url = "http://hl7.org/fhir/StructureDefinition/" + type; + } + StructureDefinition sd = context.fetchResource(StructureDefinition.class, url); if (sd == null || !sd.hasSnapshot()) return null; @@ -1803,7 +1816,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat type = null; } } - NodeStack localStack = stack.push(ei.element, ei.count, ei.definition, type == null ? typeDefn : resolveType(type)); + NodeStack localStack = stack.push(ei.element, ei.count, ei.definition, type == null ? typeDefn : resolveType(ei.definition, type)); String localStackLiterapPath = localStack.getLiteralPath(); String eiPath = ei.path; assert(eiPath.equals(localStackLiterapPath)) : "ei.path: " + ei.path + " - localStack.getLiterapPath: " + localStackLiterapPath; @@ -1828,7 +1841,7 @@ public class InstanceValidator extends BaseValidator implements IResourceValidat validateContains(errors, ei.path, ei.definition, definition, ei.element, localStack, !isBundleEntry(ei.path) && !isParametersEntry(ei.path)); // if // (str.matches(".*([.,/])work\\1$")) else { - StructureDefinition p = getProfileForType(type); + StructureDefinition p = getProfileForType(ei.definition, type); if (rule(errors, IssueType.STRUCTURE, ei.line(), ei.col(), ei.path, p != null, "Unknown type " + type)) { validateElement(errors, p, p.getSnapshot().getElement().get(0), profile, ei.definition, ei.element, type, localStack); }