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.TypeRefComponent;
008import org.hl7.fhir.r5.model.StructureDefinition;
009import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
010
011public class PEDefinitionElement extends PEDefinition {
012
013  public PEDefinitionElement(PEBuilder builder, StructureDefinition profile, ElementDefinition definition, String ppath) {
014    super(builder, definition.getName(), profile, definition, ppath);
015  }
016
017  @Override
018  public void listTypes(List<PEType> types) {
019    for (TypeRefComponent t : definition.getType()) {
020      if (t.hasProfile()) {
021        for (CanonicalType u : t.getProfile()) {
022          types.add(builder.makeType(t, u));
023        }
024      } else if (!t.getCode().startsWith("http://hl7.org/fhirpath/")) {
025        types.add(new PEType(t.getWorkingCode(), t.getWorkingCode(), "http://hl7.org/fhir/StructureDefinition/"+t.getWorkingCode()));
026      }
027    }
028  }
029
030  @Override
031  protected void makeChildren(String typeUrl, List<PEDefinition> children, boolean allFixed) {
032    children.addAll(builder.listChildren(allFixed, this, profile, definition, typeUrl));            
033  }
034
035  @Override
036  public String fhirpath() {
037    String base = definition.getName().replace("[x]", "");
038    if (definition.hasSlicing()) {
039      // get all the slices 
040      CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(" or ");
041      List<PEDefinition> slices = builder.listSlices(profile, definition, this);
042      // list all the fhirpaths
043      for (PEDefinition slice : slices) {
044        b.append("("+builder.makeSliceExpression(profile, definition.getSlicing(), slice.definition())+")");
045      }
046      if (b.count() == 0)
047        return base;
048      else
049        return base+".where(("+b.toString()+").not())";
050    } else {
051      return base;
052    }
053  }
054
055
056}