Fixed issues with version-conversion differentiating profile and targetProfile

Fixed problem where parser would get stuck in an infinite loop when allowing unexpected elements and actually encountering one
Fixed problem with localizing relative links in narrative if the reference starts with ../
This commit is contained in:
Lloyd McKenzie 2019-09-03 11:08:29 -06:00
parent 239084ed0f
commit cf797915eb
7 changed files with 63 additions and 40 deletions

View File

@ -28,6 +28,7 @@ public class VersionConvertorConstants {
public final static String MODIFIER_REASON_EXTENSION = "http://hl7.org/fhir/4.0/StructureDefinition/extension-ElementDefinition.isModifierReason";
public final static String MODIFIER_TAKEN = "http://hl7.org/fhir/4.0/StructureDefinition/extension-MedicationStatment.taken";
public final static String MODIFIER_REASON_LEGACY = "No Modifier Reason provideed in previous versions of FHIR";
public final static String PROFILE_EXTENSION = "http://hl7.org/fhir/4.0/StructureDefinition/extension-ElementDefinition.type.profile";
public static String refToVS(String url) {
if (url == null)

View File

@ -1421,17 +1421,15 @@ public class VersionConvertor_14_30 {
org.hl7.fhir.dstu3.model.ElementDefinition.TypeRefComponent tgt = new org.hl7.fhir.dstu3.model.ElementDefinition.TypeRefComponent();
copyElement(src, tgt);
tgt.setCode(src.getCode());
for (org.hl7.fhir.dstu2016may.model.UriType t : src.getProfile()) {
if (src.hasTarget()) {
// We don't have a good way to distinguish resources that have both 'profile' and 'targetProfile' when the type is reference, so the best we can do is by name.
String baseName = t.getValue().toLowerCase();
if (baseName.contains("reference") && !baseName.contains("documentreference"))
tgt.setProfile(t.getValueAsString());
else
tgt.setTargetProfile(t.getValueAsString());
}
for (org.hl7.fhir.dstu2016may.model.UriType u : src.getProfile()) {
if (src.getCode().equals("Reference"))
tgt.setTargetProfile(u.getValue());
else
tgt.setProfile(t.getValueAsString());
tgt.setProfile(u.getValue());
}
for (org.hl7.fhir.dstu2016may.model.Extension t : src.getExtensionsByUrl(VersionConvertorConstants.PROFILE_EXTENSION)) {
// We don't have a good way to distinguish resources that have both 'profile' and 'targetProfile' when the type is reference, so the best we can do is by name.
tgt.setProfile(t.getValue().toString());
}
for (org.hl7.fhir.dstu2016may.model.Enumeration<org.hl7.fhir.dstu2016may.model.ElementDefinition.AggregationMode> t : src.getAggregation())
tgt.addAggregation(convertAggregationMode(t.getValue()));
@ -1448,14 +1446,16 @@ public class VersionConvertor_14_30 {
if (src.hasTarget()) {
if (src.hasTargetProfile()) {
tgt.addProfile(src.getTargetProfile());
String baseName = src.getTargetProfile().toLowerCase();
if (baseName.contains("reference") && !baseName.contains("documentreference"))
throw new Error("2016May Target profile contains the word 'reference':" + src.getTargetProfile());
}
if (src.hasProfile()) {
tgt.addProfile(src.getProfile());
if (!src.getProfile().toLowerCase().contains("reference"))
throw new Error("2016May profile doesn't contain the word 'reference':" + src.getTargetProfile());
if (src.getCode().equals("Reference")) {
org.hl7.fhir.dstu2016may.model.Extension t = new org.hl7.fhir.dstu2016may.model.Extension(VersionConvertorConstants.PROFILE_EXTENSION);
t.setValue(new org.hl7.fhir.dstu2016may.model.StringType(src.getProfile()));
tgt.addExtension(t);
} else
tgt.addProfile(src.getProfile());
// if (!u.toString().toLowerCase().contains("reference"))
// throw new Error("2016May profile doesn't contain the word 'reference':" + u);
}
} else
tgt.addProfile(src.getProfile());

View File

@ -1506,12 +1506,14 @@ public class VersionConvertor_14_40 {
}
if (tgt.hasTarget()) {
for (org.hl7.fhir.dstu2016may.model.UriType u : src.getProfile()) {
// We don't have a good way to distinguish resources that have both 'profile' and 'targetProfile' when the type is reference, so the best we can do is by name.
String baseName = u.getValue().toLowerCase();
if (baseName.contains("reference") && !baseName.contains("documentreference"))
tgt.addProfile(u.getValue());
if (src.getCode().equals("Reference"))
tgt.addTargetProfile(u.getValue());
else
tgt.addTargetProfile(u.getValue());
tgt.addProfile(u.getValue());
}
for (org.hl7.fhir.dstu2016may.model.Extension t : src.getExtensionsByUrl(VersionConvertorConstants.PROFILE_EXTENSION)) {
// We don't have a good way to distinguish resources that have both 'profile' and 'targetProfile' when the type is reference, so the best we can do is by name.
tgt.addProfile(t.getValue().toString());
}
} else {
for (org.hl7.fhir.dstu2016may.model.UriType u : src.getProfile())
@ -1541,9 +1543,14 @@ public class VersionConvertor_14_40 {
throw new Error("2016May Target profile contains the word 'reference':" + u);
}
for (org.hl7.fhir.r4.model.UriType u : src.getProfile()) {
tgt.addProfile(u.getValue());
if (!u.toString().toLowerCase().contains("reference"))
throw new Error("2016May profile doesn't contain the word 'reference':" + u);
if (src.getCode().equals("Reference")) {
org.hl7.fhir.dstu2016may.model.Extension t = new org.hl7.fhir.dstu2016may.model.Extension(VersionConvertorConstants.PROFILE_EXTENSION);
t.setValue(convertType(u));
tgt.addExtension(t);
} else
tgt.addProfile(u.getValue());
// if (!u.toString().toLowerCase().contains("reference"))
// throw new Error("2016May profile doesn't contain the word 'reference':" + u);
}
} else {
for (org.hl7.fhir.r4.model.UriType u : src.getProfile()) {

View File

@ -1507,11 +1507,14 @@ public class VersionConvertor_14_50 {
if (tgt.hasTarget()) {
for (org.hl7.fhir.dstu2016may.model.UriType u : src.getProfile()) {
// We don't have a good way to distinguish resources that have both 'profile' and 'targetProfile' when the type is reference, so the best we can do is by name.
String baseName = u.getValue().toLowerCase();
if (baseName.contains("reference") && !baseName.contains("documentreference"))
tgt.addProfile(u.getValue());
if (src.getCode().equals("Reference"))
tgt.addTargetProfile(u.getValue());
else
tgt.addTargetProfile(u.getValue());
tgt.addProfile(u.getValue());
}
for (org.hl7.fhir.dstu2016may.model.Extension t : src.getExtensionsByUrl(VersionConvertorConstants.PROFILE_EXTENSION)) {
// We don't have a good way to distinguish resources that have both 'profile' and 'targetProfile' when the type is reference, so the best we can do is by name.
tgt.addProfile(t.getValue().toString());
}
} else {
for (org.hl7.fhir.dstu2016may.model.UriType u : src.getProfile())
@ -1534,16 +1537,18 @@ public class VersionConvertor_14_50 {
tgt.setCode(src.getCode());
list.add(tgt);
if (src.hasTarget()) {
for (org.hl7.fhir.r5.model.UriType u : src.getTargetProfile()) {
tgt.addProfile(u.getValue());
String baseName = u.getValue().toLowerCase();
if (baseName.contains("reference") && !baseName.contains("documentreference"))
throw new Error("2016May Target profile contains the word 'reference':" + u);
}
for (org.hl7.fhir.r5.model.UriType u : src.getProfile()) {
org.hl7.fhir.dstu2016may.model.Extension t = new org.hl7.fhir.dstu2016may.model.Extension(VersionConvertorConstants.PROFILE_EXTENSION);
t.setValue(convertType(u));
tgt.addExtension(t);
}
for (org.hl7.fhir.r5.model.UriType u : src.getTargetProfile()) {
if (!u.equals(src.getTargetProfile().get(0))) {
tgt = tgt.copy();
tgt.getProfile().clear();
list.add(tgt);
}
tgt.addProfile(u.getValue());
if (!u.toString().toLowerCase().contains("reference"))
throw new Error("2016May profile doesn't contain the word 'reference':" + u);
}
} else {
for (org.hl7.fhir.r5.model.UriType u : src.getProfile()) {

View File

@ -33,6 +33,7 @@ import org.hl7.fhir.dstu3.model.Parameters;
import org.hl7.fhir.dstu3.model.Parameters.ParametersParameterComponent;
import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.r5.model.BooleanType;
import org.hl7.fhir.r5.model.CanonicalType;
import org.hl7.fhir.r5.model.Questionnaire;
import org.hl7.fhir.r5.model.CodeableConcept;
import org.hl7.fhir.r5.model.Enumeration;
@ -1736,8 +1737,15 @@ public class VersionConvertor_30_50 {
copyElement(src, tgt);
tgt.setCodeElement(convertUri(src.getCodeElement()));
}
if (src.hasProfile())
tgt.addProfile(src.getProfile());
if (src.hasProfile()) {
boolean found = false;
for (CanonicalType p: tgt.getProfile()) {
if (p.equals(src.getProfile()))
found = true;
}
if (!found)
tgt.addProfile(src.getProfile());
}
if (src.hasTargetProfile())
tgt.addTargetProfile(src.getTargetProfile());
for (org.hl7.fhir.dstu3.model.Enumeration<org.hl7.fhir.dstu3.model.ElementDefinition.AggregationMode> t : src.getAggregation()) {

View File

@ -285,9 +285,11 @@ public abstract class XmlParserBase extends ParserBase implements IParser {
}
protected void unknownContent(XmlPullParser xpp) throws FHIRFormatError {
protected void unknownContent(XmlPullParser xpp) throws FHIRFormatError, XmlPullParserException, IOException {
if (!isAllowUnknownContent())
throw new FHIRFormatError("Unknown Content "+xpp.getName()+" @ "+pathForLocation(xpp));
else if (xpp.getEventType()==XmlPullParser.START_TAG)
skipElementWithContent(xpp);
}
protected XhtmlNode parseXhtml(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError {

View File

@ -1511,7 +1511,7 @@ public class ProfileUtilities extends TranslatingUtilities {
j++;
if (j < markdown.length()) {
String url = markdown.substring(i+2, j);
if (!Utilities.isAbsoluteUrl(url)) {
if (!Utilities.isAbsoluteUrl(url) && !url.startsWith("..")) {
b.append("](");
b.append(webUrl);
i = i + 1;