HAPI updates and validation message enhancements

This commit is contained in:
Grahame Grieve 2019-06-11 05:05:01 +10:00
parent a42f075f69
commit 027104b2b4
6 changed files with 94 additions and 5 deletions

View File

@ -73,8 +73,9 @@ public abstract class BaseReference extends Type implements IBaseReference, ICom
* a part of the FHIR "wire format" and is never transmitted or receieved inline, but this property
* may be changed/accessed by parsers.
*/
public void setResource(IBaseResource theResource) {
public IBaseReference setResource(IBaseResource theResource) {
resource = theResource;
return this;
}
@Override

View File

@ -73,8 +73,9 @@ public abstract class BaseReference extends Type implements IBaseReference, ICom
* a part of the FHIR "wire format" and is never transmitted or receieved inline, but this property
* may be changed/accessed by parsers.
*/
public void setResource(IBaseResource theResource) {
public IBaseReference setResource(IBaseResource theResource) {
resource = theResource;
return this;
}
@Override

View File

@ -73,8 +73,9 @@ public abstract class BaseReference extends Type implements IBaseReference, ICom
* a part of the FHIR "wire format" and is never transmitted or receieved inline, but this property
* may be changed/accessed by parsers.
*/
public void setResource(IBaseResource theResource) {
public IBaseReference setResource(IBaseResource theResource) {
resource = theResource;
return this;
}
@Override

View File

@ -73,8 +73,9 @@ public abstract class BaseReference extends Type implements IBaseReference, ICom
* a part of the FHIR "wire format" and is never transmitted or receieved inline, but this property
* may be changed/accessed by parsers.
*/
public void setResource(IBaseResource theResource) {
public IBaseReference setResource(IBaseResource theResource) {
resource = theResource;
return this;
}
@Override

View File

@ -74,6 +74,7 @@ import org.hl7.fhir.r5.model.Factory;
import org.hl7.fhir.r5.model.Identifier;
import org.hl7.fhir.r5.model.IntegerType;
import org.hl7.fhir.r5.model.MarkdownType;
import org.hl7.fhir.r5.model.OperationOutcome.OperationOutcomeIssueComponent;
import org.hl7.fhir.r5.model.PrimitiveType;
import org.hl7.fhir.r5.model.Questionnaire.QuestionnaireItemComponent;
import org.hl7.fhir.r5.model.Questionnaire.QuestionnaireItemType;
@ -83,6 +84,9 @@ import org.hl7.fhir.r5.model.UriType;
import org.hl7.fhir.r5.model.ValueSet.ConceptReferenceComponent;
import org.hl7.fhir.r5.model.ValueSet.ConceptSetComponent;
import org.hl7.fhir.utilities.StandardsStatus;
import org.hl7.fhir.utilities.validation.ValidationMessage;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity;
import org.hl7.fhir.utilities.validation.ValidationMessage.IssueType;
import org.hl7.fhir.utilities.validation.ValidationMessage.Source;
@ -659,6 +663,15 @@ public class ToolingExtensions {
throw new Error("Unable to read extension "+uri+" as an integer");
}
public static int readIntegerExtension(Element e, String uri, int defaultValue) {
Extension ex = ExtensionHelper.getExtension(e, uri);
if (ex == null)
return defaultValue;
if (ex.getValue() instanceof IntegerType)
return ((IntegerType) ex.getValue()).getValue();
throw new Error("Unable to read extension "+uri+" as an integer");
}
public static Map<String, String> getLanguageTranslations(Element e) {
Map<String, String> res = new HashMap<String, String>();
for (Extension ext : e.getExtension()) {
@ -697,6 +710,71 @@ public class ToolingExtensions {
ToolingExtensions.setCodeExtension(dr, ToolingExtensions.EXT_NORMATIVE_VERSION, normativeVersion);
}
public static ValidationMessage readValidationMessage(OperationOutcomeIssueComponent issue, Source source) {
ValidationMessage vm = new ValidationMessage();
vm.setSource(source);
vm.setLevel(mapSeverity(issue.getSeverity()));
vm.setType(mapType(issue.getCode()));
if (issue.hasExtension(ToolingExtensions.EXT_ISSUE_LINE))
vm.setLine(ToolingExtensions.readIntegerExtension(issue, ToolingExtensions.EXT_ISSUE_LINE, 0));
if (issue.hasExtension(ToolingExtensions.EXT_ISSUE_COL))
vm.setCol(ToolingExtensions.readIntegerExtension(issue, ToolingExtensions.EXT_ISSUE_COL, 0));
if (issue.hasExpression())
vm.setLocation(issue.getExpression().get(0).asStringValue());
vm.setMessage(issue.getDetails().getText());
if (issue.hasExtension("http://hl7.org/fhir/StructureDefinition/rendering-xhtml"))
vm.setHtml(ToolingExtensions.readStringExtension(issue, "http://hl7.org/fhir/StructureDefinition/rendering-xhtml"));
return vm;
}
private static IssueType mapType(org.hl7.fhir.r5.model.OperationOutcome.IssueType code) {
switch (code) {
case BUSINESSRULE: return IssueType.BUSINESSRULE;
case CODEINVALID: return IssueType.CODEINVALID;
case CONFLICT: return IssueType.CONFLICT;
case DELETED: return IssueType.DELETED;
case DUPLICATE: return IssueType.DUPLICATE;
case EXCEPTION: return IssueType.EXCEPTION;
case EXPIRED: return IssueType.EXPIRED;
case EXTENSION: return IssueType.EXTENSION;
case FORBIDDEN: return IssueType.FORBIDDEN;
case INCOMPLETE: return IssueType.INCOMPLETE;
case INFORMATIONAL: return IssueType.INFORMATIONAL;
case INVALID: return IssueType.INVALID;
case INVARIANT: return IssueType.INVARIANT;
case LOCKERROR: return IssueType.LOCKERROR;
case LOGIN: return IssueType.LOGIN;
case MULTIPLEMATCHES: return IssueType.MULTIPLEMATCHES;
case NOSTORE: return IssueType.NOSTORE;
case NOTFOUND: return IssueType.NOTFOUND;
case NOTSUPPORTED: return IssueType.NOTSUPPORTED;
case NULL: return IssueType.NULL;
case PROCESSING: return IssueType.PROCESSING;
case REQUIRED: return IssueType.REQUIRED;
case SECURITY: return IssueType.SECURITY;
case STRUCTURE: return IssueType.STRUCTURE;
case SUPPRESSED: return IssueType.SUPPRESSED;
case THROTTLED: return IssueType.THROTTLED;
case TIMEOUT: return IssueType.TIMEOUT;
case TOOCOSTLY: return IssueType.TOOCOSTLY;
case TOOLONG: return IssueType.TOOLONG;
case TRANSIENT: return IssueType.TRANSIENT;
case UNKNOWN: return IssueType.UNKNOWN;
case VALUE: return IssueType.VALUE;
default: return null;
}
}
private static IssueSeverity mapSeverity(org.hl7.fhir.r5.model.OperationOutcome.IssueSeverity severity) {
switch (severity) {
case ERROR: return IssueSeverity.ERROR;
case FATAL: return IssueSeverity.FATAL;
case INFORMATION: return IssueSeverity.INFORMATION;
case WARNING: return IssueSeverity.WARNING;
default: return null;
}
}
// public static boolean hasOID(ValueSet vs) {
// return hasExtension(vs, EXT_OID);
// }

View File

@ -64,6 +64,7 @@ public class ValidationMessage implements Comparator<ValidationMessage>, Compara
ProfileValidator,
ResourceValidator,
InstanceValidator,
Template,
Schema,
Schematron,
Publisher,
@ -154,6 +155,7 @@ public class ValidationMessage implements Comparator<ValidationMessage>, Compara
* Content invalid against the specification or a profile.
*/
INVALID,
DELETED,
/**
* A structural issue in the content such as wrong namespace, or unable to parse the content completely, or invalid json syntax.
*/
@ -181,6 +183,7 @@ public class ValidationMessage implements Comparator<ValidationMessage>, Compara
/**
* The user or system was not able to be authenticated (either there is no process, or the proferred token is unacceptable).
*/
MULTIPLEMATCHES,
UNKNOWN,
/**
* User session expired; a login may be required.
@ -738,5 +741,9 @@ public class ValidationMessage implements Comparator<ValidationMessage>, Compara
return this;
}
public void setHtml(String html) {
this.html = html;
}
}