* fix bug rendering content references in profiles

This commit is contained in:
Grahame Grieve 2020-11-05 14:13:50 +11:00
parent e6cda40274
commit 6626b72b4f
1 changed files with 50 additions and 10 deletions

View File

@ -3219,12 +3219,17 @@ public class ProfileUtilities extends TranslatingUtilities {
Cell c = gen.new Cell(); Cell c = gen.new Cell();
r.getCells().add(c); r.getCells().add(c);
if (e.hasContentReference()) { if (e.hasContentReference()) {
ElementDefinition ed = getElementByName(profile.getSnapshot().getElement(), e.getContentReference()); ElementInStructure ed = getElementByName(profile.getSnapshot().getElement(), e.getContentReference(), profile);
if (ed == null) if (ed == null)
c.getPieces().add(gen.new Piece(null, translate("sd.table", "Unknown reference to %s", e.getContentReference()), null)); c.getPieces().add(gen.new Piece(null, translate("sd.table", "Unknown reference to %s", e.getContentReference()), null));
else { else {
c.getPieces().add(gen.new Piece(null, translate("sd.table", "See ", ed.getPath()), null)); if (ed.getSource() == profile) {
c.getPieces().add(gen.new Piece("#"+ed.getPath(), tail(ed.getPath()), ed.getPath())); c.getPieces().add(gen.new Piece(null, translate("sd.table", "See ", ed.getElement().getPath()), null));
c.getPieces().add(gen.new Piece("#"+ed.getElement().getPath(), tail(ed.getElement().getPath()), ed.getElement().getPath()));
} else {
c.getPieces().add(gen.new Piece(null, translate("sd.table", "See ", ed.getElement().getPath()), null));
c.getPieces().add(gen.new Piece(ed.getSource().getUserString("path")+"#"+ed.getElement().getPath(), tail(ed.getElement().getPath())+" ("+ed.getSource().getType()+")", ed.getElement().getPath()));
}
} }
return c; return c;
} }
@ -3409,16 +3414,46 @@ public class ProfileUtilities extends TranslatingUtilities {
} }
private ElementDefinition getElementByName(List<ElementDefinition> elements, String contentReference) { private class ElementInStructure {
for (ElementDefinition ed : elements) {
if (("#"+ed.getPath()).equals(contentReference)) { private StructureDefinition source;
return ed; private ElementDefinition element;
}
if (("#"+ed.getId()).equals(contentReference)) { public ElementInStructure(StructureDefinition source, ElementDefinition ed) {
return ed; this.source = source;
this.element = ed;
}
public StructureDefinition getSource() {
return source;
}
public ElementDefinition getElement() {
return element;
}
}
private ElementInStructure getElementByName(List<ElementDefinition> elements, String contentReference, StructureDefinition source) {
if (contentReference.contains("#")) {
String url = contentReference.substring(0, contentReference.indexOf("#"));
contentReference = contentReference.substring(contentReference.indexOf("#"));
if (!url.equals(source.getUrl())) {
source = context.fetchResource(StructureDefinition.class, url);
if (source == null) {
throw new FHIRException("Unable to resolve StructureDefinition "+url+" resolving content reference "+contentReference);
}
elements = source.getSnapshot().getElement();
} }
} }
throw new Error("getElementByName: can't find "+contentReference+"in "+elements.toString()); for (ElementDefinition ed : elements) {
if (("#"+ed.getPath()).equals(contentReference)) {
return new ElementInStructure(source, ed);
}
if (("#"+ed.getId()).equals(contentReference)) {
return new ElementInStructure(source, ed);
}
}
throw new Error("getElementByName: can't find "+contentReference+" in "+elements.toString()+" from "+source.getUrl());
// return null; // return null;
} }
@ -4575,11 +4610,16 @@ public class ProfileUtilities extends TranslatingUtilities {
if (used) { if (used) {
if (definition.hasContentReference()) { if (definition.hasContentReference()) {
ElementDefinition ed = getElementByName(profile.getSnapshot().getElement(), definition.getContentReference()); ElementInStructure ed = getElementByName(profile.getSnapshot().getElement(), definition.getContentReference(), profile);
if (ed == null) if (ed == null)
c.getPieces().add(gen.new Piece(null, "Unknown reference to "+definition.getContentReference(), null)); c.getPieces().add(gen.new Piece(null, "Unknown reference to "+definition.getContentReference(), null));
else else {
c.getPieces().add(gen.new Piece("#"+ed.getPath(), "See "+ed.getPath(), null)); if (ed.getSource() == profile) {
c.getPieces().add(gen.new Piece("#"+ed.getElement().getPath(), "See "+ed.getElement().getPath(), null));
} else {
c.getPieces().add(gen.new Piece(ed.getSource().getUserData("path")+"#"+ed.getElement().getPath(), "See "+ed.getSource().getType()+"."+ed.getElement().getPath(), null));
}
}
} }
if (definition.getPath().endsWith("url") && definition.hasFixed()) { if (definition.getPath().endsWith("url") && definition.hasFixed()) {
c.getPieces().add(checkForNoChange(definition.getFixed(), gen.new Piece(null, "\""+buildJson(definition.getFixed())+"\"", null).addStyle("color: darkgreen"))); c.getPieces().add(checkForNoChange(definition.getFixed(), gen.new Piece(null, "\""+buildJson(definition.getFixed())+"\"", null).addStyle("color: darkgreen")));