Improved handling of profiles with no derivation

This commit is contained in:
Grahame Grieve 2020-01-11 06:19:00 +11:00
parent 60085522f7
commit 46e1e5edd4

View File

@ -444,20 +444,29 @@ public class ProfileUtilities extends TranslatingUtilities {
* @throws Exception * @throws Exception
*/ */
public void generateSnapshot(StructureDefinition base, StructureDefinition derived, String url, String webUrl, String profileName) throws DefinitionException, FHIRException { public void generateSnapshot(StructureDefinition base, StructureDefinition derived, String url, String webUrl, String profileName) throws DefinitionException, FHIRException {
if (base == null) if (base == null) {
throw new DefinitionException("no base profile provided"); throw new DefinitionException("no base profile provided");
if (derived == null) }
if (derived == null) {
throw new DefinitionException("no derived structure provided"); throw new DefinitionException("no derived structure provided");
}
if (!base.hasType()) if (!base.hasType()) {
throw new DefinitionException("Base profile "+base.getUrl()+" has no type"); throw new DefinitionException("Base profile "+base.getUrl()+" has no type");
if (!derived.hasType()) }
if (!derived.hasType()) {
throw new DefinitionException("Derived profile "+derived.getUrl()+" has no type"); throw new DefinitionException("Derived profile "+derived.getUrl()+" has no type");
if (!base.getType().equals(derived.getType()) && derived.getDerivation().equals(TypeDerivationRule.CONSTRAINT)) }
if (!derived.hasDerivation()) {
throw new DefinitionException("Derived profile "+derived.getUrl()+" has no derivation value and so can't be processed");
}
if (!base.getType().equals(derived.getType()) && derived.getDerivation() == TypeDerivationRule.CONSTRAINT) {
throw new DefinitionException("Base & Derived profiles have different types ("+base.getUrl()+" = "+base.getType()+" vs "+derived.getUrl()+" = "+derived.getType()+")"); throw new DefinitionException("Base & Derived profiles have different types ("+base.getUrl()+" = "+base.getType()+" vs "+derived.getUrl()+" = "+derived.getType()+")");
}
if (snapshotStack.contains(derived.getUrl())) if (snapshotStack.contains(derived.getUrl())) {
throw new DefinitionException("Circular snapshot references detected; cannot generate snapshot (stack = "+snapshotStack.toString()+")"); throw new DefinitionException("Circular snapshot references detected; cannot generate snapshot (stack = "+snapshotStack.toString()+")");
}
snapshotStack.add(derived.getUrl()); snapshotStack.add(derived.getUrl());
if (!Utilities.noString(webUrl) && !webUrl.endsWith("/")) if (!Utilities.noString(webUrl) && !webUrl.endsWith("/"))
@ -486,7 +495,7 @@ public class ProfileUtilities extends TranslatingUtilities {
// we actually delegate the work to a subroutine so we can re-enter it with a different cursors // we actually delegate the work to a subroutine so we can re-enter it with a different cursors
StructureDefinitionDifferentialComponent diff = cloneDiff(derived.getDifferential()); // we make a copy here because we're sometimes going to hack the differential while processing it. Have to migrate user data back afterwards StructureDefinitionDifferentialComponent diff = cloneDiff(derived.getDifferential()); // we make a copy here because we're sometimes going to hack the differential while processing it. Have to migrate user data back afterwards
StructureDefinitionSnapshotComponent baseSnapshot = base.getSnapshot(); StructureDefinitionSnapshotComponent baseSnapshot = base.getSnapshot();
if (derived.getDerivation().equals(TypeDerivationRule.SPECIALIZATION)) { if (derived.getDerivation() == TypeDerivationRule.SPECIALIZATION) {
String derivedType = derived.getType(); String derivedType = derived.getType();
if (StructureDefinitionKind.LOGICAL.equals(derived.getKind()) && derived.getType().contains("/")) { if (StructureDefinitionKind.LOGICAL.equals(derived.getKind()) && derived.getType().contains("/")) {
derivedType = derivedType.substring(derivedType.lastIndexOf("/")+1); derivedType = derivedType.substring(derivedType.lastIndexOf("/")+1);
@ -498,7 +507,7 @@ public class ProfileUtilities extends TranslatingUtilities {
} }
processPaths("", derived.getSnapshot(), baseSnapshot, diff, baseCursor, diffCursor, baseSnapshot.getElement().size()-1, processPaths("", derived.getSnapshot(), baseSnapshot, diff, baseCursor, diffCursor, baseSnapshot.getElement().size()-1,
derived.getDifferential().hasElement() ? derived.getDifferential().getElement().size()-1 : -1, url, webUrl, derived.present(), null, null, false, base.getUrl(), null, false, null, new ArrayList<ElementRedirection>(), base); derived.getDifferential().hasElement() ? derived.getDifferential().getElement().size()-1 : -1, url, webUrl, derived.present(), null, null, false, base.getUrl(), null, false, null, new ArrayList<ElementRedirection>(), base);
if (derived.getDerivation().equals(TypeDerivationRule.SPECIALIZATION)) { if (derived.getDerivation() == TypeDerivationRule.SPECIALIZATION) {
for (ElementDefinition e : diff.getElement()) { for (ElementDefinition e : diff.getElement()) {
if (!e.hasUserData(GENERATED_IN_SNAPSHOT)) { if (!e.hasUserData(GENERATED_IN_SNAPSHOT)) {
ElementDefinition outcome = updateURLs(url, webUrl, e.copy()); ElementDefinition outcome = updateURLs(url, webUrl, e.copy());