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}