001package org.hl7.fhir.r4.terminologies; 002 003import javax.net.ssl.SSLEngineResult.HandshakeStatus; 004 005import org.hl7.fhir.exceptions.FHIRException; 006import org.hl7.fhir.r4.context.IWorkerContext; 007import org.hl7.fhir.r4.model.CanonicalType; 008import org.hl7.fhir.r4.model.CodeSystem; 009import org.hl7.fhir.r4.model.Identifier; 010import org.hl7.fhir.r4.model.Meta; 011import org.hl7.fhir.r4.model.UriType; 012import org.hl7.fhir.r4.model.ValueSet; 013import org.hl7.fhir.r4.model.ValueSet.ConceptSetComponent; 014import org.hl7.fhir.r4.utils.ToolingExtensions; 015import org.hl7.fhir.utilities.StandardsStatus; 016import org.hl7.fhir.utilities.Utilities; 017 018public class ValueSetUtilities { 019 020 public static ValueSet makeShareable(ValueSet vs) { 021 if (!vs.hasMeta()) 022 vs.setMeta(new Meta()); 023 for (UriType t : vs.getMeta().getProfile()) 024 if (t.getValue().equals("http://hl7.org/fhir/StructureDefinition/shareablevalueset")) 025 return vs; 026 vs.getMeta().getProfile().add(new CanonicalType("http://hl7.org/fhir/StructureDefinition/shareablevalueset")); 027 return vs; 028 } 029 030 public static void checkShareable(ValueSet vs) { 031 if (!vs.hasMeta()) 032 throw new Error("ValueSet "+vs.getUrl()+" is not shareable"); 033 for (UriType t : vs.getMeta().getProfile()) { 034 if (t.getValue().equals("http://hl7.org/fhir/StructureDefinition/shareablevalueset")) 035 return; 036 } 037 throw new Error("ValueSet "+vs.getUrl()+" is not shareable"); 038 } 039 040 public static boolean hasOID(ValueSet vs) { 041 return getOID(vs) != null; 042 } 043 044 public static String getOID(ValueSet vs) { 045 for (Identifier id : vs.getIdentifier()) { 046 if ("urn:ietf:rfc:3986".equals(id.getSystem()) && id.hasValue() && id.getValue().startsWith("urn:oid:")) 047 return id.getValue().substring(8); 048 } 049 return null; 050 } 051 052 public static void setOID(ValueSet vs, String oid) { 053 if (!oid.startsWith("urn:oid:")) 054 oid = "urn:oid:" + oid; 055 for (Identifier id : vs.getIdentifier()) { 056 if ("urn:ietf:rfc:3986".equals(id.getSystem()) && id.hasValue() && id.getValue().startsWith("urn:oid:")) { 057 id.setValue(oid); 058 return; 059 } 060 } 061 vs.addIdentifier().setSystem("urn:ietf:rfc:3986").setValue(oid); 062 } 063 064 public static void markStatus(ValueSet vs, String wg, StandardsStatus status, String pckage, String fmm, IWorkerContext context) throws FHIRException { 065 if (vs.hasUserData("external.url")) 066 return; 067 068 if (wg != null) { 069 if (!ToolingExtensions.hasExtension(vs, ToolingExtensions.EXT_WORKGROUP) || 070 (Utilities.existsInList(ToolingExtensions.readStringExtension(vs, ToolingExtensions.EXT_WORKGROUP), "fhir", "vocab") && !Utilities.existsInList(wg, "fhir", "vocab"))) { 071 ToolingExtensions.setCodeExtension(vs, ToolingExtensions.EXT_WORKGROUP, wg); 072 } 073 } 074 if (status != null) { 075 StandardsStatus ss = StandardsStatus.fromCode(ToolingExtensions.readStringExtension(vs, ToolingExtensions.EXT_BALLOT_STATUS)); 076 if (ss == null || ss.isLowerThan(status)) 077 ToolingExtensions.setStringExtension(vs, ToolingExtensions.EXT_BALLOT_STATUS, status.toDisplay()); 078 if (pckage != null) { 079 if (!vs.hasUserData("ballot.package")) 080 vs.setUserData("ballot.package", pckage); 081 else if (!pckage.equals(vs.getUserString("ballot.package"))) 082 System.out.println("Code System "+vs.getUrl()+": ownership clash "+pckage+" vs "+vs.getUserString("ballot.package")); 083 } 084 } 085 if (fmm != null) { 086 String sfmm = ToolingExtensions.readStringExtension(vs, ToolingExtensions.EXT_FMM_LEVEL); 087 if (Utilities.noString(sfmm) || Integer.parseInt(sfmm) < Integer.parseInt(fmm)) 088 ToolingExtensions.setIntegerExtension(vs, ToolingExtensions.EXT_FMM_LEVEL, Integer.parseInt(fmm)); 089 } 090 if (vs.hasUserData("cs")) 091 CodeSystemUtilities.markStatus((CodeSystem) vs.getUserData("cs"), wg, status, pckage, fmm); 092 else if (status == StandardsStatus.NORMATIVE && context != null) { 093 for (ConceptSetComponent csc : vs.getCompose().getInclude()) { 094 if (csc.hasSystem()) { 095 CodeSystem cs = context.fetchCodeSystem(csc.getSystem()); 096 if (cs != null) { 097 CodeSystemUtilities.markStatus(cs, wg, status, pckage, fmm); 098 } 099 } 100 } 101 } 102 } 103 104 private static int ssval(String status) { 105 if ("Draft".equals("status")) 106 return 1; 107 if ("Informative".equals("status")) 108 return 2; 109 if ("External".equals("status")) 110 return 3; 111 if ("Trial Use".equals("status")) 112 return 3; 113 if ("Normative".equals("status")) 114 return 4; 115 return -1; 116 } 117 118}