mirror of
https://github.com/hapifhir/org.hl7.fhir.core.git
synced 2025-02-27 16:15:56 +00:00
Improved handling of profiles with no derivation
This commit is contained in:
parent
60085522f7
commit
46e1e5edd4
@ -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());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user