Add support for Base in logical models on any version of FHIR
This commit is contained in:
parent
674432a8ad
commit
8c4b379806
|
@ -25,6 +25,7 @@ import java.io.OutputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
@ -66,6 +67,7 @@ import org.hl7.fhir.r5.model.ElementDefinition.TypeRefComponent;
|
||||||
import org.hl7.fhir.r5.model.Enumeration;
|
import org.hl7.fhir.r5.model.Enumeration;
|
||||||
import org.hl7.fhir.r5.model.Enumerations.BindingStrength;
|
import org.hl7.fhir.r5.model.Enumerations.BindingStrength;
|
||||||
import org.hl7.fhir.r5.model.Enumerations.FHIRVersion;
|
import org.hl7.fhir.r5.model.Enumerations.FHIRVersion;
|
||||||
|
import org.hl7.fhir.r5.model.Enumerations.PublicationStatus;
|
||||||
import org.hl7.fhir.r5.model.Extension;
|
import org.hl7.fhir.r5.model.Extension;
|
||||||
import org.hl7.fhir.r5.model.IdType;
|
import org.hl7.fhir.r5.model.IdType;
|
||||||
import org.hl7.fhir.r5.model.IntegerType;
|
import org.hl7.fhir.r5.model.IntegerType;
|
||||||
|
@ -5218,6 +5220,36 @@ public class ProfileUtilities extends TranslatingUtilities {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static StructureDefinition makeBaseDefinition(FHIRVersion fhirVersion) {
|
||||||
|
StructureDefinition base = new StructureDefinition();
|
||||||
|
base.setId("Base");
|
||||||
|
base.setUrl("http://hl7.org/fhir/StructureDefinition/Base");
|
||||||
|
base.setVersion(fhirVersion.toCode());
|
||||||
|
base.setName("Base");
|
||||||
|
base.setStatus(PublicationStatus.ACTIVE);
|
||||||
|
base.setDate(new Date());
|
||||||
|
base.setFhirVersion(fhirVersion);
|
||||||
|
base.setKind(StructureDefinitionKind.COMPLEXTYPE);
|
||||||
|
base.setAbstract(true);
|
||||||
|
base.setType("Base");
|
||||||
|
ElementDefinition e = base.getSnapshot().getElementFirstRep();
|
||||||
|
e.setId("Base");
|
||||||
|
e.setPath("Base");
|
||||||
|
e.setMin(0);
|
||||||
|
e.setMax("*");
|
||||||
|
e.getBase().setPath("Base");
|
||||||
|
e.getBase().setMin(0);
|
||||||
|
e.getBase().setMax("*");
|
||||||
|
e.setIsModifier(false);
|
||||||
|
e = base.getDifferential().getElementFirstRep();
|
||||||
|
e.setId("Base");
|
||||||
|
e.setPath("Base");
|
||||||
|
e.setMin(0);
|
||||||
|
e.setMax("*");
|
||||||
|
return base;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -594,17 +594,27 @@ public class SimpleWorkerContext extends BaseWorkerContext implements IWorkerCon
|
||||||
}
|
}
|
||||||
|
|
||||||
public void generateSnapshot(StructureDefinition p) throws DefinitionException, FHIRException {
|
public void generateSnapshot(StructureDefinition p) throws DefinitionException, FHIRException {
|
||||||
if (!p.hasSnapshot() && p.getKind() != StructureDefinitionKind.LOGICAL) {
|
generateSnapshot(p, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void generateSnapshot(StructureDefinition p, boolean logical) throws DefinitionException, FHIRException {
|
||||||
|
if (!p.hasSnapshot() && (logical || p.getKind() != StructureDefinitionKind.LOGICAL)) {
|
||||||
if (!p.hasBaseDefinition())
|
if (!p.hasBaseDefinition())
|
||||||
throw new DefinitionException("Profile "+p.getName()+" ("+p.getUrl()+") has no base and no snapshot");
|
throw new DefinitionException("Profile "+p.getName()+" ("+p.getUrl()+") has no base and no snapshot");
|
||||||
StructureDefinition sd = fetchResource(StructureDefinition.class, p.getBaseDefinition());
|
StructureDefinition sd = fetchResource(StructureDefinition.class, p.getBaseDefinition());
|
||||||
if (sd == null)
|
if (sd == null && "http://hl7.org/fhir/StructureDefinition/Base".equals(p.getBaseDefinition())) {
|
||||||
|
sd = ProfileUtilities.makeBaseDefinition(p.getFhirVersion());
|
||||||
|
}
|
||||||
|
if (sd == null) {
|
||||||
throw new DefinitionException("Profile "+p.getName()+" ("+p.getUrl()+") base "+p.getBaseDefinition()+" could not be resolved");
|
throw new DefinitionException("Profile "+p.getName()+" ("+p.getUrl()+") base "+p.getBaseDefinition()+" could not be resolved");
|
||||||
|
}
|
||||||
List<ValidationMessage> msgs = new ArrayList<ValidationMessage>();
|
List<ValidationMessage> msgs = new ArrayList<ValidationMessage>();
|
||||||
List<String> errors = new ArrayList<String>();
|
List<String> errors = new ArrayList<String>();
|
||||||
ProfileUtilities pu = new ProfileUtilities(this, msgs, this);
|
ProfileUtilities pu = new ProfileUtilities(this, msgs, this);
|
||||||
pu.setThrowException(false);
|
pu.setThrowException(false);
|
||||||
pu.sortDifferential(sd, p, p.getUrl(), errors);
|
if (sd.getDerivation() == TypeDerivationRule.CONSTRAINT) {
|
||||||
|
pu.sortDifferential(sd, p, p.getUrl(), errors);
|
||||||
|
}
|
||||||
pu.setDebug(false);
|
pu.setDebug(false);
|
||||||
for (String err : errors)
|
for (String err : errors)
|
||||||
msgs.add(new ValidationMessage(Source.ProfileValidator, IssueType.EXCEPTION, p.getUserString("path"), "Error sorting Differential: "+err, ValidationMessage.IssueSeverity.ERROR));
|
msgs.add(new ValidationMessage(Source.ProfileValidator, IssueType.EXCEPTION, p.getUserString("path"), "Error sorting Differential: "+err, ValidationMessage.IssueSeverity.ERROR));
|
||||||
|
|
Loading…
Reference in New Issue