private ValidationResult serverValidateCode(Parameters pin, boolean doCache) throws Exception { if (noTerminologyServer) return new ValidationResult(null, null, TerminologyServiceErrorClass.NOSERVICE); String cacheName = doCache ? generateCacheName(pin) : null; ValidationResult res = loadFromCache(cacheName); if (res != null) return res; log("Terminology Server: $validate-code " + describeValidationParameters(pin)); for (ParametersParameterComponent pp : pin.getParameter()) if (pp.getName().equals("profile")) throw new Error("Can only specify profile in the context"); if (expProfile == null) throw new Exception("No ExpansionProfile provided"); pin.addParameter().setName("profile").setResource(expProfile); Parameters pout = txServer.operateType(ValueSet.class, "validate-code", pin); boolean ok = false; String message = "No Message returned"; String display = null; TerminologyServiceErrorClass err = TerminologyServiceErrorClass.UNKNOWN; for (ParametersParameterComponent p : pout.getParameter()) { if (p.getName().equals("result")) ok = ((BooleanType) p.getValue()).getValue().booleanValue(); else if (p.getName().equals("message")) message = ((StringType) p.getValue()).getValue(); else if (p.getName().equals("display")) display = ((StringType) p.getValue()).getValue(); else if (p.getName().equals("cause")) { try { IssueType it = IssueType.fromCode(((StringType) p.getValue()).getValue()); if (it == IssueType.UNKNOWN) err = TerminologyServiceErrorClass.UNKNOWN; else if (it == IssueType.NOTSUPPORTED) err = TerminologyServiceErrorClass.VALUESET_UNSUPPORTED; } catch (FHIRException e) { } } } if (!ok) res = new ValidationResult(IssueSeverity.ERROR, message, err); else if (display != null) res = new ValidationResult(new ConceptDefinitionComponent().setDisplay(display)); else res = new ValidationResult(null); saveToCache(res, cacheName); return res; }
@SuppressWarnings("rawtypes") private String describeValidationParameters(Parameters pin) { CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(); for (ParametersParameterComponent p : pin.getParameter()) { if (p.hasValue() && p.getValue() instanceof PrimitiveType) { b.append(p.getName() + "=" + ((PrimitiveType) p.getValue()).asStringValue()); } else if (p.hasValue() && p.getValue() instanceof Coding) { b.append("system=" + ((Coding) p.getValue()).getSystem()); b.append("code=" + ((Coding) p.getValue()).getCode()); b.append("display=" + ((Coding) p.getValue()).getDisplay()); } else if (p.hasValue() && p.getValue() instanceof CodeableConcept) { if (((CodeableConcept) p.getValue()).hasCoding()) { Coding c = ((CodeableConcept) p.getValue()).getCodingFirstRep(); b.append("system=" + c.getSystem()); b.append("code=" + c.getCode()); b.append("display=" + c.getDisplay()); } else if (((CodeableConcept) p.getValue()).hasText()) { b.append("text=" + ((CodeableConcept) p.getValue()).getText()); } } else if (p.hasResource() && (p.getResource() instanceof ValueSet)) { b.append("valueset=" + getVSSummary((ValueSet) p.getResource())); } } return b.toString(); }