001package org.hl7.fhir.r4.utils;
002
003import org.hl7.fhir.r4.model.CodeableConcept;
004import org.hl7.fhir.r4.model.OperationOutcome;
005import org.hl7.fhir.r4.model.OperationOutcome.IssueSeverity;
006import org.hl7.fhir.r4.model.OperationOutcome.IssueType;
007import org.hl7.fhir.r4.model.OperationOutcome.OperationOutcomeIssueComponent;
008import org.hl7.fhir.r4.model.StringType;
009import org.hl7.fhir.utilities.validation.ValidationMessage;
010
011public class OperationOutcomeUtilities {
012
013
014  public static OperationOutcomeIssueComponent convertToIssue(ValidationMessage message, OperationOutcome op) {
015    OperationOutcomeIssueComponent issue = new OperationOutcome.OperationOutcomeIssueComponent();
016    issue.setCode(convert(message.getType()));
017    if (message.getLocation() != null) {
018      StringType s = new StringType();
019      s.setValue(message.getLocation()+(message.getLine()>= 0 && message.getCol() >= 0 ? " (line "+Integer.toString(message.getLine())+", col"+Integer.toString(message.getCol())+")" : "") );
020      issue.getLocation().add(s);
021    }
022    issue.setSeverity(convert(message.getLevel()));
023    CodeableConcept c = new CodeableConcept();
024    c.setText(message.getMessage());
025    issue.setDetails(c);
026    if (message.getSource() != null) {
027      issue.getExtension().add(ToolingExtensions.makeIssueSource(message.getSource()));
028    }
029    return issue;
030  }
031
032  private static IssueSeverity convert(org.hl7.fhir.utilities.validation.ValidationMessage.IssueSeverity level) {
033    switch (level) {
034    case FATAL : return IssueSeverity.FATAL;
035    case ERROR : return IssueSeverity.ERROR;
036    case WARNING : return IssueSeverity.WARNING;
037    case INFORMATION : return IssueSeverity.INFORMATION;
038         case NULL : return IssueSeverity.NULL;
039    }
040    return IssueSeverity.NULL;
041  }
042
043  private static IssueType convert(org.hl7.fhir.utilities.validation.ValidationMessage.IssueType type) {
044    switch (type) {
045    case INVALID: 
046    case STRUCTURE: return IssueType.STRUCTURE;
047    case REQUIRED: return IssueType.REQUIRED;
048    case VALUE: return IssueType.VALUE;
049    case INVARIANT: return IssueType.INVARIANT;
050    case SECURITY: return IssueType.SECURITY;
051    case LOGIN: return IssueType.LOGIN;
052    case UNKNOWN: return IssueType.UNKNOWN;
053    case EXPIRED: return IssueType.EXPIRED;
054    case FORBIDDEN: return IssueType.FORBIDDEN;
055    case SUPPRESSED: return IssueType.SUPPRESSED;
056    case PROCESSING: return IssueType.PROCESSING;
057    case NOTSUPPORTED: return IssueType.NOTSUPPORTED;
058    case DUPLICATE: return IssueType.DUPLICATE;
059    case NOTFOUND: return IssueType.NOTFOUND;
060    case TOOLONG: return IssueType.TOOLONG;
061    case CODEINVALID: return IssueType.CODEINVALID;
062    case EXTENSION: return IssueType.EXTENSION;
063    case TOOCOSTLY: return IssueType.TOOCOSTLY;
064    case BUSINESSRULE: return IssueType.BUSINESSRULE;
065    case CONFLICT: return IssueType.CONFLICT;
066    case INCOMPLETE: return IssueType.INCOMPLETE;
067    case TRANSIENT: return IssueType.TRANSIENT;
068    case LOCKERROR: return IssueType.LOCKERROR;
069    case NOSTORE: return IssueType.NOSTORE;
070    case EXCEPTION: return IssueType.EXCEPTION;
071    case TIMEOUT: return IssueType.TIMEOUT;
072    case THROTTLED: return IssueType.THROTTLED;
073    case INFORMATIONAL: return IssueType.INFORMATIONAL;
074         case NULL: return IssueType.NULL;
075    }
076    return IssueType.NULL;
077  }
078}