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}