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.r5.model.StructureDefinition; 011 012public class PEDefinitionSubExtension extends PEDefinition { 013 014 private ElementDefinition eed; 015 private ElementDefinition ved; 016 private ElementDefinition ued; 017 018 public PEDefinitionSubExtension(PEBuilder builder, StructureDefinition profile, ElementDefinition definition, String ppath) { 019 super(builder, definition.getSliceName(), profile, definition, ppath); 020 List<ElementDefinition> childDefs = builder.getChildren(profile, definition); 021 eed = getElementByName(childDefs, "extension"); 022 ved = getElementByName(childDefs, "value[x]"); 023 ued = getElementByName(childDefs, "url"); 024 } 025 026 @Override 027 public void listTypes(List<PEType> types) { 028 if (ved.isRequired() || eed.isProhibited()) { 029 for (TypeRefComponent t : ved.getType()) { 030 if (t.hasProfile()) { 031 for (CanonicalType u : t.getProfile()) { 032 types.add(builder.makeType(t, u)); 033 } 034 } else { 035 types.add(builder.makeType(t.getWorkingCode())); 036 } 037 } 038 } else { 039 types.add(builder.makeType("Extension")); 040 } 041 } 042 043 private ElementDefinition getElementByName(List<ElementDefinition> children, String name) { 044 for (ElementDefinition ed : children) { 045 if (name.equals(ed.getName())) { 046 return ed; 047 } 048 } 049 return null; 050 } 051 052 @Override 053 protected void makeChildren(String typeUrl, List<PEDefinition> children, boolean allFixed) { 054 if (ved.isRequired() || eed.isProhibited()) { 055 children.addAll(builder.listChildren(allFixed, this, profile, ved, typeUrl)); 056 } else { 057 if (eed.getSlicing().getRules() != SlicingRules.CLOSED) { 058 children.addAll(builder.listChildren(allFixed, this, profile, eed, "http://hl7.org/fhir/StructureDefinition/Extension", "value[x]", "url")); 059 } 060 children.addAll(builder.listSlices(profile, eed, this)); 061 } 062 } 063 064 @Override 065 public String fhirpath() { 066 if (ved.isRequired() || eed.isProhibited()) { 067 return "extension('"+ued.getFixed().primitiveValue()+"').value"; 068 } else { 069 return "extension('"+ued.getFixed().primitiveValue()+"')"; 070 } 071 } 072 073 public PEDefinitionElementMode mode() { 074 return PEDefinitionElementMode.Extension; 075 } 076 077}