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}