
001package org.hl7.fhir.r5.utils.xver; 002 003import org.hl7.fhir.r5.context.IWorkerContext; 004import org.hl7.fhir.r5.model.ElementDefinition; 005import org.hl7.fhir.r5.model.StructureDefinition; 006import org.hl7.fhir.utilities.MarkedToMoveToAdjunctPackage; 007import org.hl7.fhir.utilities.Utilities; 008import org.hl7.fhir.utilities.VersionUtilities; 009import org.hl7.fhir.utilities.json.model.JsonObject; 010 011@MarkedToMoveToAdjunctPackage 012public abstract class XVerExtensionManager { 013 014 protected IWorkerContext context; 015 public XVerExtensionManager(IWorkerContext context) { 016 this.context = context; 017 } 018 019 public enum XVerExtensionStatus { 020 BadVersion, Unknown, Invalid, NotAllowed, Valid 021 } 022 023 public static final String XVER_EXT_MARKER = "XVER_EXT_MARKER"; 024 public static final String XVER_VER_MARKER = "XVER_VER_MARKER"; 025 026 027 public abstract XVerExtensionStatus status(String url); 028 029 public abstract StructureDefinition getDefinition(String url); 030 031 public boolean isR5(String url) { 032 String v = url.substring(20, 23); 033 return "5.0".equals(v); 034 } 035 036 public String getElementId(String url) { 037 return url.substring(54); 038 } 039 040 public String getVersion(String url) { 041 return url.substring(20, 23); 042 } 043 044 public String getReference(String url) { 045 String version = getVersion(url); 046 String base = VersionUtilities.getSpecUrl(version); 047 if (base == null) { 048 return null; 049 } else { 050 String path = url.substring(url.indexOf("-")+1); 051 if (!path.contains(".")) { 052 return null; 053 } 054 String type = path.substring(0, path.indexOf(".")); 055 if (Utilities.existsInList(type, "Annotation", "Attachment", "Identifier", "CodeableConcept", "Coding", "Quantity", "Duration", "Range", "Period", "Ratio", "RatioRange", "SampledData", "Signature", "HumanName", "Address", "ContactPoint", "Timing")) { 056 return Utilities.pathURL(base, "datatypes-definitions.html#"+path+"|"+VersionUtilities.getNameForVersion(version)+" "+path); 057 } 058 if (Utilities.existsInList(type, "Element", "BackboneElement", "BackboneType", "PrimitiveType", "DataType", "Base")) { 059 return Utilities.pathURL(base, "types-definitions.html#"+path+"|"+VersionUtilities.getNameForVersion(version)+" "+path); 060 } 061 if (Utilities.existsInList(type, "UsageContext", "RelatedArtifact", "DataRequirement", "ParameterDefinition", "TriggerDefinition", "Expression", "ContactDetail", "ExtendedContactDetail", "VirtualServiceDetail", "Availability", "MonetaryComponent", "Contributor")) { 062 return Utilities.pathURL(base, "metadatatypes-definitions.html#"+path+"|"+VersionUtilities.getNameForVersion(version)+" "+path); 063 } 064 if (Utilities.existsInList(type, "Reference", "CodeableReference")) { 065 return Utilities.pathURL(base, "references-definitions.html#"+path+"|"+VersionUtilities.getNameForVersion(version)+" "+path); 066 } 067 if (Utilities.existsInList(type, "Meta")) { 068 return Utilities.pathURL(base, "resource-definitions.html#"+path+"|"+VersionUtilities.getNameForVersion(version)+" "+path); 069 } 070 return Utilities.pathURL(base, type.toLowerCase()+"-definitions.html#"+path+"|"+VersionUtilities.getNameForVersion(version)+" "+path); 071 } 072 } 073 074 public boolean matchingUrl(String url) { 075 if (url == null || url.length() < 56) { 076 return false; 077 } 078 String pfx = url.substring(0, 20); 079 String v = url.substring(20, 23); 080 String sfx = url.substring(23, 54); 081 return pfx.equals("http://hl7.org/fhir/") && 082 isVersionPattern(v) && sfx.equals("/StructureDefinition/extension-"); 083 } 084 085 protected boolean isVersionPattern(String v) { 086 return v.length() == 3 && Character.isDigit(v.charAt(0)) && v.charAt(1) == '.' && Character.isDigit(v.charAt(2)); 087 } 088}