001package org.hl7.fhir.r5.profilemodel; 002 003import java.util.List; 004 005import org.hl7.fhir.r5.model.CanonicalType; 006import org.hl7.fhir.r5.model.ElementDefinition; 007import org.hl7.fhir.r5.model.ElementDefinition.SlicingRules; 008import org.hl7.fhir.r5.model.ElementDefinition.TypeRefComponent; 009import org.hl7.fhir.r5.profilemodel.PEDefinition.PEDefinitionElementMode; 010import org.hl7.fhir.utilities.Utilities; 011import org.hl7.fhir.r5.model.StructureDefinition; 012 013public class PEDefinitionExtension extends PEDefinition { 014 015 private StructureDefinition extension; 016 private ElementDefinition sliceDefinition; 017 private ElementDefinition eed; 018 private ElementDefinition ved; 019 020 public PEDefinitionExtension(PEBuilder builder, String name, StructureDefinition profile, ElementDefinition definition, ElementDefinition sliceDefinition, StructureDefinition extension, String ppath) { 021 super(builder, name, profile, definition, ppath); 022 this.sliceDefinition = sliceDefinition; 023 this.extension= extension; 024 eed = extension.getSnapshot().getElementByPath("Extension.extension"); 025 ved = extension.getSnapshot().getElementByPath("Extension.value[x]"); 026 } 027 028 @Override 029 public void listTypes(List<PEType> types) { 030 if (ved.isRequired() || eed.isProhibited()) { 031 for (TypeRefComponent t : ved.getType()) { 032 if (t.hasProfile()) { 033 for (CanonicalType u : t.getProfile()) { 034 types.add(builder.makeType(t, u)); 035 } 036 } else { 037 types.add(builder.makeType(t.getWorkingCode())); 038 } 039 } 040 } else { 041 types.add(builder.makeType("Extension")); 042 } 043 } 044 045 @Override 046 protected void makeChildren(String typeUrl, List<PEDefinition> children, boolean allFixed) { 047 if (ved.isRequired() || eed.isProhibited()) { 048 children.addAll(builder.listChildren(allFixed, this, extension, ved, typeUrl)); 049 } else { 050 if (eed.getSlicing().getRules() != SlicingRules.CLOSED) { 051 children.addAll(builder.listChildren(allFixed, this, extension, eed, "http://hl7.org/fhir/StructureDefinition/Extension", "value[x]", "url")); 052 } 053 children.addAll(builder.listSlices(extension, eed, this)); 054 } 055 } 056 057 @Override 058 public String fhirpath() { 059 if (ved.isRequired() || eed.isProhibited()) { 060 return "extension('"+extension.getUrl()+"').value"; 061 } else { 062 return "extension('"+extension.getUrl()+"')"; 063 } 064 } 065 066 public PEDefinitionElementMode mode() { 067 return PEDefinitionElementMode.Extension; 068 } 069}