use of org.hl7.fhir.definitions.model.TypeRef in project kindling by HL7.
the class ProfileGenerator method defineElement.
/**
* note: snapshot implies that we are generating a resource or a data type; for other profiles, the snapshot is generated elsewhere
* @param isInterface
*/
private ElementDefinition defineElement(Profile ap, StructureDefinition p, List<ElementDefinition> elements, ElementDefn e, String path, Set<String> slices, List<SliceHandle> parentSlices, SnapShotMode snapshot, boolean root, String defType, String inheritedType, boolean defaults) throws Exception {
boolean handleDiscriminator = true;
if (!Utilities.noString(e.getProfileName()) && !e.getDiscriminator().isEmpty() && !slices.contains(path)) {
handleDiscriminator = false;
// hey, we jumped straight into the slices with setting up the slicing (allowed in the spreadsheets, but not otherwise)
ElementDefinition slicer = new ElementDefinition();
elements.add(slicer);
slicer.setId(path);
slicer.setPath(path);
processDiscriminator(e, path, slicer);
if (e.getMaxCardinality() != null)
slicer.setMax(e.getMaxCardinality() == Integer.MAX_VALUE ? "*" : e.getMaxCardinality().toString());
slices.add(path);
}
// todo for task 12259
// if (ap != null) {
// String base = isImplicitTypeConstraint(path);
// if (base != null) {
// ElementDefinition typeConstrainer = new ElementDefinition(ElementDefinition.NOT_MODIFIER, ElementDefinition.NOT_IN_SUMMARY);
// elements.add(typeConstrainer);
// typeConstrainer.setId(base);
// typeConstrainer.setPath(base);
// String type = path.substring(base.length()-3);
// if (definitions.hasPrimitiveType(Utilities.uncapitalize(type)))
// type = Utilities.uncapitalize(type);
// typeConstrainer.addType().setCode(type);
// }
// }
ElementDefinition ce = new ElementDefinition(defaults, ElementDefinition.NOT_MODIFIER, ElementDefinition.NOT_IN_SUMMARY);
elements.add(ce);
if (e.getStandardsStatus() != null)
ToolingExtensions.setStandardsStatus(ce, e.getStandardsStatus(), e.getNormativeVersion());
ce.setId(path);
ce.setPath(path);
if (e.isXmlAttribute())
ce.addRepresentation(PropertyRepresentation.XMLATTR);
List<SliceHandle> myParents = new ArrayList<ProfileGenerator.SliceHandle>();
myParents.addAll(parentSlices);
// which holds Slicing information)
if (e.hasDescriminator() || !Utilities.noString(e.getProfileName())) {
if (e.getDiscriminator().size() > 0 && !slices.contains(path) && handleDiscriminator) {
processDiscriminator(e, path, ce);
slices.add(path);
}
if (!Utilities.noString(e.getProfileName())) {
SliceHandle hnd = new SliceHandle();
// though this it not used?
hnd.name = path;
myParents.add(hnd);
if (path.contains(".")) {
// We don't want a slice name on the root
ce.setSliceName(e.getProfileName());
ce.setId(ce.getId() + ":" + e.getProfileName());
}
}
}
if (e.isTranslatable()) {
ce.addExtension(BuildExtensions.EXT_TRANSLATABLE, new BooleanType(true));
}
if (Utilities.existsInList(ce.getPath(), "Element.extension", "DomainResource.extension", "DomainResource.modifierExtension") && !ce.hasSlicing() && !ce.hasSliceName()) {
ce.getSlicing().setDescription("Extensions are always sliced by (at least) url").setRules(SlicingRules.OPEN).addDiscriminator().setType(DiscriminatorType.VALUE).setPath("url");
}
if (!Utilities.noString(inheritedType) && snapshot != SnapShotMode.None) {
ElementDefn inh = definitions.getElementDefn(inheritedType);
buildDefinitionFromElement(path, ce, inh, ap, p, inheritedType, definitions.getBaseResources().containsKey(inheritedType) && definitions.getBaseResources().get(inheritedType).isInterface());
} else if (path.contains(".") && Utilities.noString(e.typeCode()) && snapshot != SnapShotMode.None) {
addElementConstraints(defType, ce);
}
buildDefinitionFromElement(path, ce, e, ap, p, null, false);
if (!Utilities.noString(e.getStatedType())) {
ToolingExtensions.addStringExtension(ce, "http://hl7.org/fhir/StructureDefinition/structuredefinition-explicit-type-name", e.getStatedType());
}
if (e.isNoBindingAllowed()) {
ToolingExtensions.addBooleanExtension(ce, BuildExtensions.EXT_NO_BINDING, true);
}
if (!root) {
if (e.typeCode().startsWith("@")) {
ce.setContentReference("#" + getIdForPath(elements, e.typeCode().substring(1)));
} else if (Utilities.existsInList(path, "Element.id", "Extension.url") || path.endsWith(".id")) {
TypeRefComponent tr = ce.addType();
tr.getFormatCommentsPre().add("Note: special primitive values have a FHIRPath system type. e.g. this is compiler magic (j)");
tr.setCode(Constants.NS_SYSTEM_TYPE + "String");
if (path.equals("Extension.url")) {
ToolingExtensions.addUriExtension(tr, ToolingExtensions.EXT_FHIR_TYPE, "uri");
} else if (p.getKind() == StructureDefinitionKind.RESOURCE) {
ToolingExtensions.addUriExtension(tr, ToolingExtensions.EXT_FHIR_TYPE, "id");
} else {
ToolingExtensions.addUriExtension(tr, ToolingExtensions.EXT_FHIR_TYPE, "string");
}
} else {
List<TypeRef> expandedTypes = new ArrayList<TypeRef>();
for (TypeRef t : e.getTypes()) {
// Expand any Resource(A|B|C) references
if (t.hasParams() && !Utilities.existsInList(t.getName(), "Reference", "canonical", "CodeableReference")) {
throw new Exception("Only resource types can specify parameters. Path " + path + " in profile " + p.getName());
}
if (t.getParams().size() > 1) {
if (t.getProfile() != null && t.getParams().size() != 1) {
throw new Exception("Cannot declare profile on a resource reference declaring multiple resource types. Path " + path + " in profile " + p.getName());
}
for (String param : t.getParams()) {
if (definitions.hasLogicalModel(param)) {
for (String pn : definitions.getLogicalModel(param).getImplementations()) {
TypeRef childType = new TypeRef(t.getName());
childType.getParams().add(pn);
childType.getAggregations().addAll(t.getAggregations());
expandedTypes.add(childType);
}
} else {
TypeRef childType = new TypeRef(t.getName());
childType.getParams().add(param);
childType.getAggregations().addAll(t.getAggregations());
expandedTypes.add(childType);
}
}
} else if (t.isWildcardType()) {
// this list is filled out manually because it may be running before the types referred to have been loaded
for (String n : TypesUtilities.wildcardTypes(version.toString())) expandedTypes.add(new TypeRef(n));
} else if (!t.getName().startsWith("=")) {
if (definitions.isLoaded() && (!definitions.hasResource(t.getName()) && !definitions.hasType(t.getName()) && !definitions.hasElementDefn(t.getName()) && !definitions.getBaseResources().containsKey(t.getName()) && !t.getName().equals("xhtml"))) {
throw new Exception("Bad Type '" + t.getName() + "' at " + path + " in profile " + p.getUrl());
}
expandedTypes.add(t);
}
}
if (expandedTypes.isEmpty()) {
if (defType != null)
ce.addType().setCode(defType);
} else
for (TypeRef t : expandedTypes) {
String profile = null;
String tc = null;
if (definitions.getConstraints().containsKey(t.getName())) {
ProfiledType pt = definitions.getConstraints().get(t.getName());
tc = pt.getBaseType();
profile = "http://hl7.org/fhir/StructureDefinition/" + pt.getName();
} else {
tc = t.getName();
profile = t.getProfile();
}
TypeRefComponent type = ce.getType(tc);
if (profile == null && t.hasParams()) {
profile = t.getParams().get(0);
}
if (t.getPatterns() != null) {
for (String s : t.getPatterns()) {
type.addExtension("http://hl7.org/fhir/StructureDefinition/elementdefinition-pattern", new CanonicalType("http://hl7.org/fhir/StructureDefinition/" + s));
}
}
if (profile != null) {
if (type.getWorkingCode().equals("Extension")) {
// check that the extension is being used correctly:
StructureDefinition ext = context.getExtensionStructure(null, profile);
if (ext == null) {
throw new Exception("Unable to resolve extension definition: " + profile);
}
boolean srcMod = ext.getSnapshot().getElement().get(0).getIsModifier();
boolean tgtMod = e.isModifier();
if (srcMod && !tgtMod)
throw new Exception("The extension '" + profile + "' is a modifier extension, but is being used as if it is not a modifier extension");
if (!srcMod && tgtMod)
throw new Exception("The extension '" + profile + "' is not a modifier extension, but is being used as if it is a modifier extension");
}
List<String> pr = new ArrayList<>();
if (profile.startsWith("http:") || profile.startsWith("#")) {
pr.add(profile);
} else if (definitions.hasLogicalModel(profile)) {
for (String pn : definitions.getLogicalModel(profile).getImplementations()) pr.add("http://hl7.org/fhir/StructureDefinition/" + pn);
} else
pr.add("http://hl7.org/fhir/StructureDefinition/" + (profile.equals("Any") ? "Resource" : profile));
if (type.getWorkingCode().equals("Reference") || type.getWorkingCode().equals("canonical") || type.getWorkingCode().equals("CodeableReference")) {
for (String pn : pr) {
type.addTargetProfile(pn);
if (e.hasHierarchy())
ToolingExtensions.addBooleanExtension(type, ToolingExtensions.EXT_HIERARCHY, e.getHierarchy());
}
} else
for (String pn : pr) {
type.addProfile(pn);
}
}
for (String aggregation : t.getAggregations()) {
type.addAggregation(AggregationMode.fromCode(aggregation));
}
}
}
}
String w5 = translateW5(e.getW5());
if (w5 != null)
addMapping(p, ce, "http://hl7.org/fhir/fivews", w5, ap);
if (e.isTranslatable())
ce.addExtension("http://hl7.org/fhir/StructureDefinition/elementdefinition-translatable", new BooleanType(true));
if (!Utilities.noString(e.getOrderMeaning()))
ce.setOrderMeaning(e.getOrderMeaning());
if (e.hasBinding()) {
ce.setBinding(generateBinding(e.getBinding()));
}
if (snapshot != SnapShotMode.None && !e.getElements().isEmpty()) {
// makeExtensionSlice("extension", p, c, e, path);
// if (snapshot == SnapShotMode.Resource) {
// makeExtensionSlice("modifierExtension", p, c, e, path);
// if (!path.contains(".")) {
// c.getElement().add(createBaseDefinition(p, path, definitions.getBaseResources().get("Resource").getRoot().getElementByName("language")));
// c.getElement().add(createBaseDefinition(p, path, definitions.getBaseResources().get("DomainResource").getRoot().getElementByName("text")));
// c.getElement().add(createBaseDefinition(p, path, definitions.getBaseResources().get("DomainResource").getRoot().getElementByName("contained")));
// }
// }
}
if (defaults)
ce.makeBase();
Set<String> containedSlices = new HashSet<String>();
if (snapshot != SnapShotMode.None) {
if (!root && Utilities.noString(e.typeCode())) {
if (snapshot == SnapShotMode.Resource)
defineAncestorElements("BackboneElement", path, snapshot, containedSlices, p, elements, defType, defaults);
else
defineAncestorElements("Element", path, snapshot, containedSlices, p, elements, defType, defaults);
} else if (root && !Utilities.noString(e.typeCode()))
defineAncestorElements(e.typeCode(), path, snapshot, containedSlices, p, elements, defType, defaults);
}
for (ElementDefn child : e.getElements()) defineElement(ap, p, elements, child, path + "." + child.getName(), containedSlices, myParents, snapshot, false, defType, null, defaults);
return ce;
}
use of org.hl7.fhir.definitions.model.TypeRef in project kindling by HL7.
the class JsonLDGenerator method generateElement.
private void generateElement(ElementDefn root, String name, ElementDefn e, JsonObject base, Set<String> types) throws Exception {
if ((e.getTypes().size() == 1 && e.getTypes().get(0).isWildcardType())) {
if (!e.getName().contains("[x]"))
throw new Exception("Element " + e.getName() + " in " + root.getName() + " has multiple types as a choice doesn't have a [x] in the element name");
for (TypeRef tr : datatypes) {
String tn = tr.getName();
if (tn.equals("SimpleQuantity"))
tn = "Quantity";
else
tn = Utilities.capitalize(tn);
String en = e.getName().substring(0, e.getName().length() - 3) + tn;
JsonObject property = new JsonObject();
base.add(name + "." + en, property);
property.addProperty("@id", "http://hl7.org/fhir/" + name + "." + en);
}
// if (e.getTypes().size() == 1)
// generateAny(root, e, e.getName().replace("[x]", ""), props, relative);
// else {
// for (TypeRef t : e.getTypes()) {
// JsonObject property = new JsonObject();
// JsonObject property_ = null;
// String en = e.getName().replace("[x]", "");
// props.add(en+upFirst(t.getName()), property);
// property.addProperty("description", e.getDefinition());
// String tref = null;
// String type = null;
// String pattern = null;
// if (definitions.getPrimitives().containsKey(t.getName())) {
// DefinedCode def = definitions.getPrimitives().get(t.getName());
// type = def.getJsonType();
// pattern = def.getRegex();
// if (!Utilities.noString(pattern))
// property.addProperty("pattern", pattern);
//
// property.addProperty("type", type);
// property_ = new JsonObject();
// props.add("_"+en+upFirst(t.getName()), property_);
// property_.addProperty("description", "Extensions for "+en+upFirst(t.getName()));
// tref = (relative ? "#" : "Element.schema.json#") +"/definitions/Element";
// property_.addProperty("$ref", tref);
// } else {
// String tn = encodeType(e, t, true);
// tref = (relative ? "#" : tn.replace(".", "_")+".schema.json#") +"/definitions/"+tn.replace(".", "_");
// property.addProperty("$ref", tref);
// }
// }
// }
} else if (e.getName().endsWith("[x]")) {
for (TypeRef tr : e.getTypes()) {
String tn = tr.getName();
if (tn.equals("SimpleQuantity"))
tn = "Quantity";
else
tn = Utilities.capitalize(tn);
String en = e.getName().substring(0, e.getName().length() - 3) + tn;
JsonObject property = new JsonObject();
base.add(name + "." + en, property);
property.addProperty("@id", "http://hl7.org/fhir/" + name + "." + en);
}
} else {
JsonObject property = new JsonObject();
base.add(name + "." + e.getName(), property);
if (e.getPath() == null)
property.addProperty("@id", "http://hl7.org/fhir/" + name + "." + e.getName());
else
property.addProperty("@id", "http://hl7.org/fhir/" + e.getPath());
// if we're using lists:
// if (e.unbounded())
// property.addProperty("@container", "@list");
// property.addProperty("fhir-@type", "http://hl7.org/fhir/"+e.typeCode());
// String tref = null;
// String type = null;
// String pattern = null;
//
// if (e.usesCompositeType()/* && types.containsKey(root.getElementByName(e.typeCode().substring(1)))*/) {
// ElementDefn ref = root.getElementByName(definitions, e.typeCode().substring(1), true, false);
// String rtn = types.get(ref);
// if (rtn == null)
// throw new Exception("logic error in schema generator (null composite reference in "+types.toString()+")");
//
// if(rtn == "Type")
// rtn = "Element";
// type=rtn;
// tref = "#/definitions/"+rtn.replace(".", "_");
// } else if (e.getTypes().size() == 0 && e.getElements().size() > 0){
// tref = "#/definitions/"+types.get(e).replace(".", "_");
// type=types.get(e).replace(".", "_");
// } else if (e.getTypes().size() == 1) {
// String tn = encodeType(e, e.getTypes().get(0), true);
// type=tn;
// if (definitions.getPrimitives().containsKey(e.typeCode())) {
// DefinedCode def = definitions.getPrimitives().get(e.typeCode());
// type = def.getJsonType();
// pattern = def.getRegex();
// property_ = new JsonObject();
// props.add("_"+e.getName(), property_);
// property_.addProperty("description", "Extensions for "+e.getName());
// tref = (relative ? "#" : "Element.schema.json#") +"/definitions/Element";
// BindingSpecification cd = e.getBinding();
//
// if (cd != null && (cd.getBinding() == BindingSpecification.BindingMethod.CodeList)) {
// ValueSet vs = cd.getValueSet();
// if (vs!= null) {
// ValueSet ex = workerContext.expandVS(vs, true, false).getValueset();
// JsonArray enums = new JsonArray();
// for (ValueSetExpansionContainsComponent cc : ex.getExpansion().getContains()) {
// enums.add(new JsonPrimitive(cc.getCode()));
// }
// property.add("enum", enums);
// pattern = null;
// }
// }
// } else {
// tref = (relative ? "#" : tn.replace(".", "_")+".schema.json#") +"/definitions/"+tn.replace(".", "_");
// }
// } else
// throw new Exception("how do we get here? "+e.getName()+" in "+root.getName()+" "+Integer.toString(e.getTypes().size()));
//
// if (e.unbounded()) {
// property.addProperty("type", "array");
// if (property_ != null) {
// property_.addProperty("type", "array");
// JsonObject items = new JsonObject();
// property.add("items", items);
// items.addProperty("type", type);
// if (!Utilities.noString(pattern))
// items.addProperty("pattern", pattern);
//
// items = new JsonObject();
// property_.add("items", items);
// items.addProperty("$ref", tref);
// } else {
// JsonObject items = new JsonObject();
// property.add("items", items);
// items.addProperty("$ref", tref);
// }
// } else {
// if (property_ != null) {
// property.addProperty("type", type);
// if (!Utilities.noString(pattern))
// property.addProperty("pattern", pattern);
//
// property_.addProperty("$ref", tref);
// } else if("div".equals(e.getName()) && "xhtml".equals(type)) {
// // Is there a better type, or ref for html?
// property.addProperty("type", "string");
// } else {
// property.addProperty("$ref", tref);
// }
// }
// if (e.getMinCardinality() > 0 && property_ == null)
// required.add(e.getName());
}
}
use of org.hl7.fhir.definitions.model.TypeRef in project kindling by HL7.
the class SchemaGenerator method generate.
public void generate(Definitions definitions, IniFile ini, String tmpResDir, String xsdDir, String dstDir, String srcDir, String version, String genDate, BuildWorkerContext workerContext) throws Exception {
this.genDate = genDate;
this.version = version;
this.workerContext = workerContext;
File dir = new CSFile(xsdDir);
File[] list = dir.listFiles();
if (list != null) {
for (File f : list) {
if (!f.isDirectory() && f.getName().endsWith(".schema.json"))
f.delete();
}
}
JsonObject schema = new JsonObject();
schema.addProperty("$schema", "http://json-schema.org/draft-06/schema#");
schema.addProperty("id", "http://hl7.org/fhir/json-schema/" + version.substring(0, version.lastIndexOf(".")));
// schema.addProperty("$ref", "#/definitions/ResourceList");
schema.addProperty("description", "see http://hl7.org/fhir/json.html#schema for information about the FHIR Json Schemas");
List<String> names = new ArrayList<String>();
names.addAll(definitions.getResources().keySet());
names.addAll(definitions.getBaseResources().keySet());
addAllResourcesChoice(definitions, schema, names);
names.clear();
names.addAll(definitions.getPrimitives().keySet());
Collections.sort(names);
for (String n : names) {
new JsonGenerator(definitions, workerContext, definitions.getKnownTypes(), version).generate(definitions.getPrimitives().get(n), version, genDate, schema);
}
new JsonGenerator(definitions, workerContext, definitions.getKnownTypes(), version).generate(new DefinedCode().setCode("xhtml").setDefinition("xhtml - escaped html (see specfication)"), version, genDate, schema);
for (TypeRef tr : definitions.getKnownTypes()) {
if (!definitions.getPrimitives().containsKey(tr.getName()) && !definitions.getConstraints().containsKey(tr.getName())) {
TypeDefn root = definitions.getElementDefn(tr.getName());
if (!isBackboneElement(root.getName())) {
JsonObject s = new JsonGenerator(definitions, workerContext, definitions.getKnownTypes(), version).generate(root, version, genDate, null);
save(s, tmpResDir + root.getName().replace(".", "_") + ".schema.json");
new JsonGenerator(definitions, workerContext, definitions.getKnownTypes(), version).generate(root, version, genDate, schema);
}
}
}
names.clear();
names.addAll(definitions.getResources().keySet());
names.addAll(definitions.getBaseResources().keySet());
Collections.sort(names);
for (String name : names) {
ResourceDefn root = definitions.getResourceByName(name);
JsonObject s = new JsonGenerator(definitions, workerContext, definitions.getKnownTypes(), version).generate(root.getRoot(), version, genDate, null);
save(s, tmpResDir + root.getName().replace(".", "_") + ".schema.json");
if (!root.isAbstract()) {
new JsonGenerator(definitions, workerContext, definitions.getKnownTypes(), version).generate(root.getRoot(), version, genDate, schema);
}
}
// save(generateAllResourceChoice(names), xsdDir+"ResourceList.schema.json");
save(schema, xsdDir + "fhir.schema.json");
dir = new CSFile(xsdDir);
list = dir.listFiles();
for (File f : list) {
if (!f.isDirectory() && f.getName().endsWith(".schema.json"))
Utilities.copyFile(f, new CSFile(dstDir + f.getName()));
}
}
use of org.hl7.fhir.definitions.model.TypeRef in project kindling by HL7.
the class ResourceDependencyGenerator method genElement.
protected Row genElement(ElementDefn e, HierarchicalTableGenerator gen, boolean resource, String path, boolean isProfile, String prefix, RenderMode mode, boolean isRoot) throws Exception {
Row row = gen.new Row();
row.setAnchor(path);
// 1. Name
Cell gc = gen.new Cell(null, dictLinks() ? pageName + "#" + path.replace("[", "_").replace("]", "_") : null, e.getName(), path + " : " + e.getDefinition(), null);
row.getCells().add(gc);
if (e.getStandardsStatus() != null) {
gc.addPiece(gen.new Piece(null, " ", null));
gc.addStyledText("Publication Status = " + e.getStandardsStatus().toDisplay(), e.getStandardsStatus().getAbbrev(), "black", e.getStandardsStatus().getColor(), prefix + "versions.html#std-process", true);
}
Cell dc;
if (resource) {
// card.
row.getCells().add(gen.new Cell());
row.setIcon("icon_resource.png", HierarchicalTableGenerator.TEXT_ICON_RESOURCE);
if (Utilities.noString(e.typeCode())) {
row.getCells().add(gen.new Cell(null, null, "n/a", null, null));
// analysis
row.getCells().add(dc = gen.new Cell());
} else {
// type
row.getCells().add(gen.new Cell(null, prefix + definitions.getSrcFile(e.typeCode()) + ".html#" + e.typeCode(), e.typeCode(), null, null));
// analysis
row.getCells().add(dc = gen.new Cell(null, null, path.contains(".") ? e.describeCardinality() : "", null, null));
}
} else {
if (!e.getElements().isEmpty()) {
// card.
row.getCells().add(gen.new Cell(null, null, path.contains(".") ? e.describeCardinality() : "", null, null));
row.setIcon("icon_element.gif", HierarchicalTableGenerator.TEXT_ICON_ELEMENT);
if (mode == RenderMode.RESOURCE)
row.getCells().add(gen.new Cell(null, prefix + definitions.getBackboneLink(), "BackboneElement", null, null));
else if (e.getName().equals("Element"))
row.getCells().add(gen.new Cell(null, null, "n/a", null, null));
else
row.getCells().add(gen.new Cell(null, prefix + definitions.getBackboneLink(), "Element", null, null));
// analysis
row.getCells().add(dc = gen.new Cell());
} else if (e.getTypes().size() == 1) {
// card.
row.getCells().add(gen.new Cell(null, null, path.contains(".") ? e.describeCardinality() : "", null, null));
String t = e.getTypes().get(0).getName();
Cell c;
if (t.startsWith("@")) {
row.setIcon("icon_reuse.png", HierarchicalTableGenerator.TEXT_ICON_REUSE);
row.getCells().add(c = gen.new Cell("see ", "#" + t.substring(1), t.substring(t.lastIndexOf(".") + 1), t.substring(1), null));
// analysis
row.getCells().add(dc = gen.new Cell());
} else if (t.equals("Reference") || t.equals("canonical")) {
row.setIcon("icon_reference.png", HierarchicalTableGenerator.TEXT_ICON_REFERENCE);
row.getCells().add(c = gen.new Cell());
c.getPieces().add(gen.new Piece(prefix + "references.html", t, null));
c.getPieces().add(gen.new Piece(null, "(", null));
boolean first = true;
for (String rt : e.getTypes().get(0).getParams()) {
if (definitions.hasLogicalModel(rt)) {
for (String rtn : definitions.getLogicalModel(rt).getImplementations()) {
if (!first)
c.getPieces().add(gen.new Piece(null, " | ", null));
c.getPieces().add(gen.new Piece(prefix + findPage(rtn) + ".html", rtn, null));
first = false;
}
} else {
if (!first)
c.getPieces().add(gen.new Piece(null, " | ", null));
if (first && isProfile && e.getTypes().get(0).getProfile() != null)
c.getPieces().add(gen.new Piece(null, e.getTypes().get(0).getProfile(), null));
else
c.getPieces().add(gen.new Piece(prefix + findPage(rt) + ".html", rt, null));
first = false;
}
}
c.getPieces().add(gen.new Piece(null, ")", null));
// analysis
row.getCells().add(dc = gen.new Cell());
for (String rt : e.getTypes().get(0).getParams()) if (definitions.hasLogicalModel(rt)) {
for (String rtn : definitions.getLogicalModel(rt).getImplementations()) {
addTypeToAnalysis(gen, row, dc, true, e.getStandardsStatus(), rtn);
}
} else
addTypeToAnalysis(gen, row, dc, true, e.getStandardsStatus(), rt);
} else if (definitions.getPrimitives().containsKey(t)) {
row.setIcon("icon_primitive.png", HierarchicalTableGenerator.TEXT_ICON_PRIMITIVE);
row.getCells().add(c = gen.new Cell(null, prefix + "datatypes.html#" + t, t, null, null));
// analysis
row.getCells().add(dc = gen.new Cell());
addTypeToAnalysis(gen, row, dc, false, e.getStandardsStatus(), e.typeCode());
} else {
if (t.equals("Extension"))
row.setIcon("icon_extension_simple.png", HierarchicalTableGenerator.TEXT_ICON_EXTENSION);
else
row.setIcon("icon_datatype.gif", HierarchicalTableGenerator.TEXT_ICON_DATATYPE);
row.getCells().add(c = gen.new Cell(null, prefix + definitions.getSrcFile(t) + ".html#" + t.replace("*", "open"), t, null, null));
// analysis
row.getCells().add(dc = gen.new Cell());
addTypeToAnalysis(gen, row, dc, false, e.getStandardsStatus(), t);
}
} else {
row.getCells().add(gen.new Cell(null, null, e.describeCardinality(), null, null));
row.setIcon("icon_choice.gif", HierarchicalTableGenerator.TEXT_ICON_CHOICE);
row.getCells().add(gen.new Cell(null, null, "", null, null));
// analysis
row.getCells().add(dc = gen.new Cell());
}
}
if (e.hasBinding() && e.getBinding() != null && e.getBinding().getBinding() != BindingMethod.Unbound && (e.getBinding().getStrength() == BindingStrength.REQUIRED || e.getBinding().getStrength() == BindingStrength.EXTENSIBLE)) {
addBindingToAnalysis(gen, row, dc, e.getBinding().getStrength() == BindingStrength.REQUIRED, e.getStandardsStatus(), e.getBinding());
// if (cc.getPieces().size() == 1)
// cc.addPiece(gen.new Piece("br"));
// cc.getPieces().add(gen.new Piece(getBindingLink(prefix, e), e.getBinding().getValueSet() != null ? e.getBinding().getValueSet().getName() : e.getBinding().getName(),
// e.getBinding().getDefinition()));
// cc.getPieces().add(gen.new Piece(null, " (", null));
// BindingSpecification b = e.getBinding();
// if (b.hasMax() ) {
// cc.getPieces().add(gen.new Piece(prefix+"terminologies.html#"+b.getStrength().toCode(), b.getStrength().getDisplay(), b.getStrength().getDefinition()));
// cc.getPieces().add(gen.new Piece(null, " but limited to ", null));
// ValueSet vs = b.getMaxValueSet();
// cc.getPieces().add(gen.new Piece(vs.getUserString("path"), vs.getName(), null));
// } else
// cc.getPieces().add(gen.new Piece(prefix+"terminologies.html#"+b.getStrength().toCode(), b.getStrength().getDisplay(), b.getStrength().getDefinition()));
// cc.getPieces().add(gen.new Piece(null, ")", null));
}
if (e.getTypes().size() > 1) {
// create a child for each choice
for (TypeRef tr : e.getTypes()) {
Row choicerow = gen.new Row();
String t = tr.getName();
if (t.equals("Reference")) {
choicerow.getCells().add(gen.new Cell(null, null, e.getName().replace("[x]", "Reference"), null, null));
choicerow.getCells().add(gen.new Cell(null, null, "", null, null));
choicerow.setIcon("icon_reference.png", HierarchicalTableGenerator.TEXT_ICON_REFERENCE);
Cell c = gen.new Cell();
choicerow.getCells().add(c);
c.getPieces().add(gen.new Piece(prefix + "references.html", "Reference", null));
c.getPieces().add(gen.new Piece(null, "(", null));
boolean first = true;
List<String> tt = new ArrayList<>();
for (String rt : tr.getParams()) {
if (definitions.hasLogicalModel(rt))
tt.addAll(definitions.getLogicalModel(rt).getImplementations());
else
tt.add(rt);
}
Collections.sort(tt);
for (String rt : tt) {
if (!first)
c.getPieces().add(gen.new Piece(null, " | ", null));
c.getPieces().add(gen.new Piece(prefix + findPage(rt) + ".html", rt, null));
first = false;
}
// analysis
choicerow.getCells().add(dc = gen.new Cell());
for (String rt : tt) addTypeToAnalysis(gen, choicerow, dc, true, e.getStandardsStatus(), rt);
} else if (definitions.getPrimitives().containsKey(t)) {
choicerow.getCells().add(gen.new Cell(null, null, e.getName().replace("[x]", Utilities.capitalize(t)), definitions.getPrimitives().get(t).getDefinition(), null));
choicerow.getCells().add(gen.new Cell(null, null, "", null, null));
choicerow.setIcon("icon_primitive.png", HierarchicalTableGenerator.TEXT_ICON_PRIMITIVE);
choicerow.getCells().add(gen.new Cell(null, prefix + "datatypes.html#" + t, t, null, null));
// analysis
choicerow.getCells().add(dc = gen.new Cell());
addTypeToAnalysis(gen, choicerow, dc, false, e.getStandardsStatus(), t);
} else if (definitions.getConstraints().containsKey(t)) {
ProfiledType pt = definitions.getConstraints().get(t);
choicerow.getCells().add(gen.new Cell(null, null, e.getName().replace("[x]", Utilities.capitalize(pt.getBaseType())), definitions.getTypes().containsKey(t) ? definitions.getTypes().get(t).getDefinition() : null, null));
choicerow.getCells().add(gen.new Cell(null, null, "", null, null));
choicerow.setIcon("icon_datatype.gif", HierarchicalTableGenerator.TEXT_ICON_DATATYPE);
choicerow.getCells().add(gen.new Cell(null, definitions.getSrcFile(t) + ".html#" + t.replace("*", "open"), t, null, null));
// analysis
choicerow.getCells().add(dc = gen.new Cell());
addTypeToAnalysis(gen, choicerow, dc, false, e.getStandardsStatus(), t);
} else {
choicerow.getCells().add(gen.new Cell(null, null, e.getName().replace("[x]", Utilities.capitalize(t)), definitions.getTypes().containsKey(t) ? definitions.getTypes().get(t).getDefinition() : null, null));
choicerow.getCells().add(gen.new Cell(null, null, "", null, null));
choicerow.setIcon("icon_datatype.gif", HierarchicalTableGenerator.TEXT_ICON_DATATYPE);
choicerow.getCells().add(gen.new Cell(null, definitions.getSrcFile(t) + ".html#" + t.replace("*", "open"), t, null, null));
// analysis
choicerow.getCells().add(dc = gen.new Cell());
addTypeToAnalysis(gen, choicerow, dc, false, e.getStandardsStatus(), t);
}
row.getSubRows().add(choicerow);
}
} else
for (ElementDefn c : e.getElements()) row.getSubRows().add(genElement(c, gen, false, path + '.' + c.getName(), isProfile, prefix, mode, false));
return row;
}
use of org.hl7.fhir.definitions.model.TypeRef in project kindling by HL7.
the class SchematronGenerator method generateInvariants.
private void generateInvariants(Section section, String path, ElementDefn ed, Definitions definitions, List<String> parents, String name) throws Exception {
if (definitions.getBaseResources().containsKey(ed.typeCode()))
generateInvariants(section, path, definitions.getBaseResources().get(ed.typeCode()).getRoot(), definitions, parents, name);
// logger.log("generate: "+path+" ("+parents.toString()+")");
if (name.contains("("))
name = name.substring(0, name.indexOf("("));
if (ed.getElements().size() > 0) {
path = path == null ? "f:" + name : path + (recursesToSelf(ed) ? "/" : "") + "/f:" + name;
genInvs(section, path, ed);
genChildren(section, path, null, ed, definitions, parents);
} else {
for (TypeRef tr : ed.typeCode().equals("*") ? allTypes() : ed.getTypes()) {
String en = name;
if (en.endsWith("[x]")) {
if (definitions.getConstraints().containsKey(tr.getName()))
en = en.replace("[x]", definitions.getConstraints().get(tr.getName()).getBaseType());
else
en = en.replace("[x]", Utilities.capitalize(tr.summary()));
}
if (en.contains("("))
en = en.substring(0, en.indexOf("("));
if (en.equals("div"))
en = "h:" + en;
else
en = "f:" + en;
String sPath = path == null ? en : path + "/" + en;
genInvs(section, sPath, ed);
ElementDefn td = getType(tr, definitions);
if (td != null) {
genInvs(section, sPath, td);
genChildren(section, sPath, tr.summary(), td, definitions, parents);
}
}
}
}
Aggregations