001package org.hl7.fhir.r4.utils; 002 003import java.util.ArrayList; 004import java.util.List; 005 006import org.hl7.fhir.r4.utils.TypesUtilities.TypeClassification; 007import org.hl7.fhir.utilities.Utilities; 008 009 010public class TypesUtilities { 011 012 public enum TypeClassification { 013 PRIMITIVE, DATATYPE, METADATATYPE, SPECIAL; 014 015 public String toDisplay() { 016 switch (this) { 017 case DATATYPE: return "Data Type"; 018 case METADATATYPE: return "MetaDataType"; 019 case PRIMITIVE: return "Primitive Type"; 020 case SPECIAL: return "Special Type"; 021 } 022 return "??"; 023 } 024 } 025 026 public static class WildcardInformation { 027 private TypeClassification classification; 028 private String typeName; 029 private String comment; 030 public WildcardInformation(String typeName, String comment, TypeClassification classification) { 031 super(); 032 this.typeName = typeName; 033 this.comment = comment; 034 this.classification = classification; 035 } 036 public WildcardInformation(String typeName, TypeClassification classification) { 037 super(); 038 this.typeName = typeName; 039 this.classification = classification; 040 } 041 public String getTypeName() { 042 return typeName; 043 } 044 public String getComment() { 045 return comment; 046 } 047 public TypeClassification getClassification() { 048 return classification; 049 } 050 051 } 052 053 public static List<String> wildcardTypes() { 054 List<String> res = new ArrayList<String>(); 055 for (WildcardInformation wi : wildcards()) 056 res.add(wi.getTypeName()); 057 return res; 058 } 059 060 // this is the master list for what data types are allowed where the types = * 061 // that this list is incomplete means that the following types cannot have fixed values in a profile: 062 // Narrative 063 // Meta 064 // Any of the IDMP data types 065 // You have to walk into them to profile them. 066 // 067 public static List<WildcardInformation> wildcards() { 068 List<WildcardInformation> res = new ArrayList<WildcardInformation>(); 069 070 // primitive types 071 res.add(new WildcardInformation("base64Binary", TypeClassification.PRIMITIVE)); 072 res.add(new WildcardInformation("boolean", TypeClassification.PRIMITIVE)); 073 res.add(new WildcardInformation("canonical", TypeClassification.PRIMITIVE)); 074 res.add(new WildcardInformation("code", "(only if the extension definition provides a <a href=\"terminologies.html#code\">fixed</a> binding to a suitable set of codes)", TypeClassification.PRIMITIVE)); 075 res.add(new WildcardInformation("date", TypeClassification.PRIMITIVE)); 076 res.add(new WildcardInformation("dateTime", TypeClassification.PRIMITIVE)); 077 res.add(new WildcardInformation("decimal", TypeClassification.PRIMITIVE)); 078 res.add(new WildcardInformation("id", TypeClassification.PRIMITIVE)); 079 res.add(new WildcardInformation("instant", TypeClassification.PRIMITIVE)); 080 res.add(new WildcardInformation("integer", TypeClassification.PRIMITIVE)); 081 res.add(new WildcardInformation("markdown", TypeClassification.PRIMITIVE)); 082 res.add(new WildcardInformation("oid", TypeClassification.PRIMITIVE)); 083 res.add(new WildcardInformation("positiveInt", TypeClassification.PRIMITIVE)); 084 res.add(new WildcardInformation("string", TypeClassification.PRIMITIVE)); 085 res.add(new WildcardInformation("time", TypeClassification.PRIMITIVE)); 086 res.add(new WildcardInformation("unsignedInt", TypeClassification.PRIMITIVE)); 087 res.add(new WildcardInformation("uri", TypeClassification.PRIMITIVE)); 088 res.add(new WildcardInformation("url", TypeClassification.PRIMITIVE)); 089 res.add(new WildcardInformation("uuid", TypeClassification.PRIMITIVE)); 090 091 // Complex general purpose data types 092 res.add(new WildcardInformation("Address", TypeClassification.DATATYPE)); 093 res.add(new WildcardInformation("Age", TypeClassification.DATATYPE)); 094 res.add(new WildcardInformation("Annotation", TypeClassification.DATATYPE)); 095 res.add(new WildcardInformation("Attachment", TypeClassification.DATATYPE)); 096 res.add(new WildcardInformation("CodeableConcept", TypeClassification.DATATYPE)); 097 res.add(new WildcardInformation("Coding", TypeClassification.DATATYPE)); 098 res.add(new WildcardInformation("ContactPoint", TypeClassification.DATATYPE)); 099 res.add(new WildcardInformation("Count", TypeClassification.DATATYPE)); 100 res.add(new WildcardInformation("Distance", TypeClassification.DATATYPE)); 101 res.add(new WildcardInformation("Duration", TypeClassification.DATATYPE)); 102 res.add(new WildcardInformation("HumanName", TypeClassification.DATATYPE)); 103 res.add(new WildcardInformation("Identifier", TypeClassification.DATATYPE)); 104 res.add(new WildcardInformation("Money", TypeClassification.DATATYPE)); 105 res.add(new WildcardInformation("Period", TypeClassification.DATATYPE)); 106 res.add(new WildcardInformation("Quantity", TypeClassification.DATATYPE)); 107 res.add(new WildcardInformation("Range", TypeClassification.DATATYPE)); 108 res.add(new WildcardInformation("Ratio", TypeClassification.DATATYPE)); 109 res.add(new WildcardInformation("Reference", " - a reference to another resource", TypeClassification.DATATYPE)); 110 res.add(new WildcardInformation("SampledData", TypeClassification.DATATYPE)); 111 res.add(new WildcardInformation("Signature", TypeClassification.DATATYPE)); 112 res.add(new WildcardInformation("Timing", TypeClassification.DATATYPE)); 113 114 // metadata types 115 res.add(new WildcardInformation("ContactDetail", TypeClassification.METADATATYPE)); 116 res.add(new WildcardInformation("Contributor", TypeClassification.METADATATYPE)); 117 res.add(new WildcardInformation("DataRequirement", TypeClassification.METADATATYPE)); 118 res.add(new WildcardInformation("Expression", TypeClassification.METADATATYPE)); 119 res.add(new WildcardInformation("ParameterDefinition", TypeClassification.METADATATYPE)); 120 res.add(new WildcardInformation("RelatedArtifact", TypeClassification.METADATATYPE)); 121 res.add(new WildcardInformation("TriggerDefinition", TypeClassification.METADATATYPE)); 122 res.add(new WildcardInformation("UsageContext", TypeClassification.METADATATYPE)); 123 124 // special cases 125 res.add(new WildcardInformation("Dosage", TypeClassification.SPECIAL)); 126 return res; 127 } 128 129 public static boolean isPrimitive(String code) { 130 return Utilities.existsInList(code, "boolean", "integer", "string", "decimal", "uri", "url", "canonical", "base64Binary", "instant", "date", "dateTime", "time", "code", "oid", "id", "markdown", "unsignedInt", "positiveInt", "xhtml"); 131 } 132} 133