use of org.hl7.fhir.definitions.model.ElementDefn in project kindling by HL7.
the class JsonSpecGenerator method getInvariants.
private String getInvariants(ElementDefn elem) {
StringBuilder b = new StringBuilder();
boolean first = true;
for (Invariant i : elem.getStatedInvariants()) {
if (!first)
b.append("; ");
first = false;
b.append(i.getId() + ": " + i.getEnglish());
}
return b.toString();
}
use of org.hl7.fhir.definitions.model.ElementDefn in project kindling by HL7.
the class JsonSpecGenerator method generateCoreElemDetails.
private void generateCoreElemDetails(ElementDefn elem, int indent, String rootName, String pathName, boolean backbone, boolean last, int width, String en, TypeRef type, boolean doco) throws Exception {
if (elem.getName().equals("extension")) {
write(" (<a href=\"" + prefix + "extensibility.html\">Extensions</a> - see <a href=\"" + prefix + "json.html#extensions\">JSON page</a>)\r\n");
return;
}
if (elem.getName().equals("modifierExtension")) {
write(" (<a href=\"" + prefix + "extensibility.html#modifier\">Modifier Extensions</a> - see <a href=\"" + prefix + "json.html#modifier\">JSON page</a>)\r\n");
return;
}
// 1. name
for (int i = 0; i < indent; i++) {
write(" ");
}
if (defPage == null) {
if (elem.isModifier() || elem.isMustSupport())
write("\"<span style=\"text-decoration: underline\" title=\"" + Utilities.escapeXml(elem.getEnhancedDefinition()) + "\">");
else
write("\"<span title=\"" + Utilities.escapeXml(elem.getDefinition()) + "\">");
} else if (elem.isModifier() || elem.getMustSupport())
write("\"<a href=\"" + (defPage + "#" + pathName + "." + en) + "\" title=\"" + Utilities.escapeXml(elem.getEnhancedDefinition()) + "\" class=\"dict\"><span style=\"text-decoration: underline\">");
else
write("\"<a href=\"" + (defPage + "#" + pathName + "." + en) + "\" title=\"" + Utilities.escapeXml(elem.getDefinition()) + "\" class=\"dict\">");
if (defPage == null) {
write(en + "</span>");
} else if (elem.isModifier() || elem.getMustSupport())
write(en + "</span></a>");
else
write(en + "</a>");
write("\" : ");
// 2. value
boolean delayedCloseArray = false;
boolean sharedDT = definitions.dataTypeIsSharedInfo(elem.typeCode());
if (elem.getMaxCardinality() != null && elem.getMaxCardinality() > 1)
write("[");
if (elem.usesCompositeType()) {
write("{ <span style=\"color: darkgreen\">");
write("Content as for " + elem.typeCode().substring(1) + "</span> }");
} else if (type == null) {
// inline definition
assert (elem.getElements().size() > 0);
write("{");
delayedCloseArray = true;
} else if (type.isXhtml()) {
// element contains xhtml
write("\"(Escaped XHTML)\"");
} else if (definitions.getPrimitives().containsKey(type.getName()) && !type.hasParams()) {
if (!(type.getName().equals("integer") || type.getName().equals("boolean") || type.getName().equals("decimal")))
write("\"");
write("<<span style=\"color: darkgreen\"><a href=\"" + prefix + (dtRoot + definitions.getSrcFile(type.getName()) + ".html#" + type.getName()) + "\">" + type.getName() + "</a></span>>");
if (!(type.getName().equals("integer") || type.getName().equals("boolean") || type.getName().equals("decimal")))
write("\"");
} else {
write("{");
width = writeTypeLinks(elem, indent, type);
write(" }");
}
if (!delayedCloseArray && (elem.getMaxCardinality() != null && elem.getMaxCardinality() > 1))
write("]");
if (!last && !delayedCloseArray)
write(",");
if (!elem.hasFixed() && doco) {
write(" <span style=\"color: Gray\">//</span>");
// 3. optionality
writeCardinality(elem);
// 4. doco
write(" ");
if (elem.getName().equals("extension")) {
write(" <a href=\"" + prefix + "extensibility.html\"><span style=\"color: navy; opacity: 0.8\">See Extensions</span></a>");
} else if ("See Extensions".equals(elem.getShortDefn())) {
write(" <a href=\"" + prefix + "extensibility.html\"><span style=\"color: navy; opacity: 0.8\">" + Utilities.escapeXml(elem.getShortDefn()) + "</span></a>");
} else {
String ref = getBindingLink(elem);
write("<span style=\"color: navy; opacity: 0.8\"><a href=\"" + (Utilities.isAbsoluteUrl(ref) ? "" : prefix) + ref + "\" style=\"color: navy; opacity: 0.8\">" + Utilities.escapeXml(elem.getShortDefn()) + "</a></span>");
}
}
if (elem.getMaxCardinality() != null && elem.getMaxCardinality() == 0)
write("</span>");
if (elem.getElements().size() > 0) {
write("\r\n");
int c = 0;
for (ElementDefn child : elem.getElements()) {
generateCoreElem(child, indent + 1, rootName, pathName + "." + en, backbone, ++c == elem.getElements().size());
}
for (int i = 0; i < indent; i++) {
write(" ");
}
}
if (elem.getElements().size() > 0) {
write("}");
if (delayedCloseArray && elem.getMaxCardinality() != null && elem.getMaxCardinality() > 1)
write("]");
if (!last && delayedCloseArray)
write(",");
}
write("\r\n");
}
use of org.hl7.fhir.definitions.model.ElementDefn in project kindling by HL7.
the class ProfileGenerator method genUml.
private void genUml(TypeDefn t) {
if (!uml.hasClass(t.getName())) {
UMLClass c = new UMLClass(t.getName(), UMLClassType.Class);
uml.getTypes().put(t.getName(), c);
}
UMLClass c = uml.getClassByName(t.getName());
c.setDocumentation(t.getDefinition());
if (!t.getTypes().isEmpty()) {
c.setSpecialises(uml.getClassByName(t.typeCodeNoParams()));
}
if (!c.hasAttributes()) {
for (ElementDefn e : t.getElements()) {
UMLAttribute a = null;
if (t.getTypes().isEmpty()) {
a = new UMLAttribute(e.getName(), Integer.toString(e.getMinCardinality()), Integer.toString(e.getMaxCardinality()), uml.getClassByNameCreate("Base"));
} else if (t.getTypes().size() == 1 && !isReference(t.getTypes().get(0).getName())) {
a = new UMLAttribute(e.getName(), Integer.toString(e.getMinCardinality()), Integer.toString(e.getMaxCardinality()), uml.getClassByNameCreate(e.typeCode()));
} else {
String tn = t.getTypes().get(0).getName();
boolean allSame = true;
for (int i = 1; i < t.getTypes().size(); i++) {
allSame = tn.equals(t.getTypes().get(i).getName());
}
if (allSame && isReference(tn)) {
a = new UMLAttribute(e.getName(), Integer.toString(e.getMinCardinality()), Integer.toString(e.getMaxCardinality()), uml.getClassByNameCreate(tn));
for (TypeRef tr : t.getTypes()) {
for (String p : tr.getParams()) {
a.getTargets().add(p);
}
}
} else {
boolean allPrimitive = true;
for (TypeRef tr : t.getTypes()) {
if (!definitions.hasPrimitiveType(tr.getName())) {
allPrimitive = false;
}
}
if (allPrimitive) {
a = new UMLAttribute(e.getName(), Integer.toString(e.getMinCardinality()), Integer.toString(e.getMaxCardinality()), uml.getClassByNameCreate("PrimitiveType"));
} else {
a = new UMLAttribute(e.getName(), Integer.toString(e.getMinCardinality()), Integer.toString(e.getMaxCardinality()), uml.getClassByNameCreate("DataType"));
}
for (TypeRef tr : t.getTypes()) {
a.getTypes().add(tr.getName());
for (String p : tr.getParams()) {
a.getTargets().add(p);
}
}
}
}
c.getAttributes().add(a);
}
}
}
use of org.hl7.fhir.definitions.model.ElementDefn in project kindling by HL7.
the class ProfileGenerator method convertElements.
public void convertElements(ElementDefn src, StructureDefinition ed, String path) throws Exception {
ElementDefinition dst = new ElementDefinition();
if (!ed.hasDifferential())
ed.setDifferential(new StructureDefinitionDifferentialComponent());
ed.getDifferential().getElement().add(dst);
String thisPath = path == null ? "Extension" : path;
dst.setId(thisPath);
dst.setPath(thisPath);
if (!Utilities.noString(src.getProfileName()))
dst.setSliceName(src.getProfileName());
dst.setShort(src.getShortDefn());
dst.setDefinition(preProcessMarkdown(src.getDefinition(), "Element Definition"));
dst.setComment(preProcessMarkdown(src.getComments(), "Element Comments"));
if (src.getMaxCardinality() != null) {
if (src.getMaxCardinality() == Integer.MAX_VALUE)
dst.setMax("*");
else
dst.setMax(src.getMaxCardinality().toString());
}
if (src.getMinCardinality() != null)
dst.setMin(src.getMinCardinality());
if (src.getFixed() != null)
dst.setFixed(src.getFixed());
if (src.hasMustSupport())
dst.setMustSupport(src.isMustSupport());
if (src.hasModifier())
dst.setIsModifier(src.isModifier());
if (dst.getIsModifier())
dst.setIsModifierReason(src.getModifierReason());
if (src.hasSummaryItem() && dst.getPath().contains("."))
dst.setIsSummaryElement(Factory.newBoolean(src.isSummary()));
for (Invariant id : src.getStatedInvariants()) dst.addCondition(id.getId());
// dDst.
for (TypeRef t : src.getTypes()) {
if (t.hasParams()) {
for (String tp : t.getParams()) {
if (definitions.hasLogicalModel(tp)) {
for (String tpn : definitions.getLogicalModel(tp).getImplementations()) {
ElementDefinition.TypeRefComponent type = dst.getType(t.getName());
String pr = "http://hl7.org/fhir/StructureDefinition/" + tpn;
type.addTargetProfile(pr);
}
} else {
ElementDefinition.TypeRefComponent type = dst.getType(t.getName());
String pr = t.hasProfile() ? t.getProfile() : // this should only happen if t.getParams().size() == 1
"http://hl7.org/fhir/StructureDefinition/" + (tp.equals("Any") ? "Resource" : tp);
if (type.getWorkingCode().equals("Reference") || type.getWorkingCode().equals("canonical") || type.getWorkingCode().equals("CodeableReference"))
type.addTargetProfile(pr);
else
type.addProfile(pr);
}
}
} else if (t.isWildcardType()) {
for (String n : TypesUtilities.wildcardTypes(version.toString())) dst.getType(n);
} else {
if (definitions != null && definitions.getConstraints().containsKey(t.getName())) {
ProfiledType ct = definitions.getConstraints().get(t.getName());
ElementDefinition.TypeRefComponent type = dst.getType(ct.getBaseType());
type.addProfile("http://hl7.org/fhir/StructureDefinition/" + ct.getName());
} else if ("Extension.url".equals(path)) {
// juat don't populate it
// ElementDefinition.TypeRefComponent tt = dst.addType();
// tt.setCodeElement(new UriType());
// tt.getFormatCommentsPre().add("Note: special primitive values do not have an assigned type. e.g. this is compiler magic. XML, JSON and RDF types provided by extension");
// ToolingExtensions.addStringExtension(tt.getCodeElement(), ToolingExtensions.EXT_JSON_TYPE, "string");
// ToolingExtensions.addStringExtension(tt.getCodeElement(), ToolingExtensions.EXT_XML_TYPE, "xs:anyURI");
// ToolingExtensions.addStringExtension(tt.getCodeElement(), ToolingExtensions.EXT_RDF_TYPE, "xs:anyURI");
} else {
ElementDefinition.TypeRefComponent type = dst.getType(t.getName());
if (t.hasProfile())
if (type.getWorkingCode().equals("Reference") || type.getWorkingCode().equals("CodeableReference"))
type.addTargetProfile(t.getProfile());
else
type.addProfile(t.getProfile());
}
}
}
if (definitions != null) {
// igtodo - catch this
for (String mu : definitions.getMapTypes().keySet()) {
if (src.hasMapping(mu)) {
addMapping(ed, dst, mu, src.getMapping(mu), null);
}
}
}
for (String in : src.getInvariants().keySet()) {
ElementDefinitionConstraintComponent con = new ElementDefinitionConstraintComponent();
Invariant inv = src.getInvariants().get(in);
con.setKey(inv.getId());
if (!con.hasKey()) {
extensionCounter++;
con.setKey("exd-" + Integer.toString(extensionCounter));
}
con.setRequirements(inv.getRequirements());
if (Utilities.noString(inv.getSeverity()))
con.setSeverity(ConstraintSeverity.ERROR);
else
con.setSeverity(ConstraintSeverity.fromCode(inv.getSeverity()));
con.setHuman(inv.getEnglish());
con.setXpath(inv.getXpath());
if (!"n/a".equals(inv.getExpression()))
con.setExpression(inv.getExpression());
dst.getConstraint().add(con);
}
if (src.hasBinding())
dst.setBinding(generateBinding(src.getBinding()));
if (src.getElements().isEmpty()) {
if (path == null)
throw new Exception("?error parsing extension");
} else {
ElementDefn url = src.getElements().get(0);
if (!url.getName().equals("url"))
throw new Exception("first child of extension should be 'url', not " + url.getName() + " for structure definition " + ed.getUrl());
convertElements(url, ed, thisPath + ".url");
// this pair might leave elements out of order, but we're going to sort them later
if (!hasValue(src)) {
ElementDefn value = new ElementDefn();
value.setName("value[x]");
value.setMinCardinality(0);
value.setMaxCardinality(0);
convertElements(value, ed, thisPath + ".value[x]");
} else {
ElementDefn ext = new ElementDefn();
// can't have an extension if you have a value
ext.setName("extension");
ext.setMaxCardinality(0);
convertElements(ext, ed, thisPath + ".extension");
}
if (src.getElements().size() == 2 && src.getElements().get(0).getName().equals("url") && src.getElements().get(1).getName().equals("value[x]")) {
ElementDefn value = src.getElements().get(1);
value.setMinCardinality(1);
convertElements(value, ed, thisPath + ".value[x]");
} else {
for (ElementDefn child : src.getElements()) {
if (child != url) {
if (child.getName().startsWith("value") && !child.getName().startsWith("valueSet"))
convertElements(child, ed, thisPath + "." + child.getName());
else {
if (child.getElements().size() == 0 || !child.getElements().get(0).getName().equals("url")) {
ElementDefn childUrl = new ElementDefn();
childUrl.setName("url");
childUrl.setXmlAttribute(true);
childUrl.getTypes().add(new TypeRef("uri"));
childUrl.setFixed(new UriType(child.getName()));
child.getElements().add(0, childUrl);
}
if (!hasValue(child)) {
ElementDefn value = new ElementDefn();
value.setName("value[x]");
value.setMinCardinality(0);
value.setMaxCardinality(0);
child.getElements().add(value);
}
convertElements(child, ed, thisPath + ".extension");
}
}
}
}
}
}
use of org.hl7.fhir.definitions.model.ElementDefn in project kindling by HL7.
the class ProfileGenerator method processDiscriminator.
private void processDiscriminator(ElementDefn e, String path, ElementDefinition ce) throws Exception {
ce.setSlicing(new ElementDefinitionSlicingComponent());
ce.getSlicing().setDescription(e.getSliceDescription());
String[] d = e.getDiscriminator().get(0).split("\\|");
if (d.length >= 1)
ce.getSlicing().addDiscriminator(ProfileUtilities.interpretR2Discriminator(d[0].trim(), false));
if (d.length >= 2)
ce.getSlicing().setOrdered(Boolean.parseBoolean(d[1].trim()));
else
ce.getSlicing().setOrdered(false);
if (d.length >= 3)
ce.getSlicing().setRules(SlicingRules.fromCode(d[2].trim()));
else
ce.getSlicing().setRules(SlicingRules.OPEN);
for (int i = 1; i < e.getDiscriminator().size(); i++) {
// we've already process the first in the list
String s = e.getDiscriminator().get(i).trim();
if (s.contains("|"))
throw new Exception("illegal discriminator \"" + s + "\" at " + path);
ce.getSlicing().addDiscriminator(ProfileUtilities.interpretR2Discriminator(s, false));
}
}
Aggregations