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}