diff --git a/org.hl7.fhir.core.generator/configuration/BackboneElement.java b/org.hl7.fhir.core.generator/configuration/BackboneElement.java new file mode 100644 index 000000000..4e4b584b8 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/BackboneElement.java @@ -0,0 +1,7 @@ + + public void checkNoModifiers(String noun, String verb) throws FHIRException { + if (hasModifierExtension()) { + throw new FHIRException("Found unknown Modifier Exceptions on "+noun+" doing "+verb); + } + + } diff --git a/org.hl7.fhir.core.generator/configuration/BackboneType.java b/org.hl7.fhir.core.generator/configuration/BackboneType.java new file mode 100644 index 000000000..4e4b584b8 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/BackboneType.java @@ -0,0 +1,7 @@ + + public void checkNoModifiers(String noun, String verb) throws FHIRException { + if (hasModifierExtension()) { + throw new FHIRException("Found unknown Modifier Exceptions on "+noun+" doing "+verb); + } + + } diff --git a/org.hl7.fhir.core.generator/configuration/BaseConformance.java b/org.hl7.fhir.core.generator/configuration/BaseConformance.java new file mode 100644 index 000000000..311d0a5c6 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/BaseConformance.java @@ -0,0 +1,6 @@ + + @Override + public String toString() { + return getUrl(); + } + diff --git a/org.hl7.fhir.core.generator/configuration/Binary.java b/org.hl7.fhir.core.generator/configuration/Binary.java new file mode 100644 index 000000000..86ae59a75 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/Binary.java @@ -0,0 +1,17 @@ + + @Override + public byte[] getContent() { + return getData(); + } + + @Override + public IBaseBinary setContent(byte[] arg0) { + return setData(arg0); + } + + @Override + public Base64BinaryType getContentElement() { + return getDataElement(); + } + + diff --git a/org.hl7.fhir.core.generator/configuration/Bundle.java b/org.hl7.fhir.core.generator/configuration/Bundle.java new file mode 100644 index 000000000..b0de4c0aa --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/Bundle.java @@ -0,0 +1,48 @@ + /** + * Returns the {@link #getLink() link} which matches a given {@link BundleLinkComponent#getRelation() relation}. + * If no link is found which matches the given relation, returns null. If more than one + * link is found which matches the given relation, returns the first matching BundleLinkComponent. + * + * @param theRelation + * The relation, such as \"next\", or \"self. See the constants such as {@link IBaseBundle#LINK_SELF} and {@link IBaseBundle#LINK_NEXT}. + * @return Returns a matching BundleLinkComponent, or null + * @see IBaseBundle#LINK_NEXT + * @see IBaseBundle#LINK_PREV + * @see IBaseBundle#LINK_SELF + */ + public BundleLinkComponent getLink(String theRelation) { + org.apache.commons.lang3.Validate.notBlank(theRelation, "theRelation may not be null or empty"); + for (BundleLinkComponent next : getLink()) { + if (theRelation.equals(next.getRelation())) { + return next; + } + } + return null; + } + + /** + * Returns the {@link #getLink() link} which matches a given {@link BundleLinkComponent#getRelation() relation}. + * If no link is found which matches the given relation, creates a new BundleLinkComponent with the + * given relation and adds it to this Bundle. If more than one + * link is found which matches the given relation, returns the first matching BundleLinkComponent. + * + * @param theRelation + * The relation, such as \"next\", or \"self. See the constants such as {@link IBaseBundle#LINK_SELF} and {@link IBaseBundle#LINK_NEXT}. + * @return Returns a matching BundleLinkComponent, or null + * @see IBaseBundle#LINK_NEXT + * @see IBaseBundle#LINK_PREV + * @see IBaseBundle#LINK_SELF + */ + public BundleLinkComponent getLinkOrCreate(String theRelation) { + org.apache.commons.lang3.Validate.notBlank(theRelation, "theRelation may not be null or empty"); + for (BundleLinkComponent next : getLink()) { + if (theRelation.equals(next.getRelation())) { + return next; + } + } + BundleLinkComponent retVal = new BundleLinkComponent(); + retVal.setRelation(theRelation); + getLink().add(retVal); + return retVal; + } + diff --git a/org.hl7.fhir.core.generator/configuration/BundleEntryComponent.java b/org.hl7.fhir.core.generator/configuration/BundleEntryComponent.java new file mode 100644 index 000000000..1acb67e8c --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/BundleEntryComponent.java @@ -0,0 +1,48 @@ + /** + * Returns the {@link #getLink() link} which matches a given {@link BundleLinkComponent#getRelation() relation}. + * If no link is found which matches the given relation, returns null. If more than one + * link is found which matches the given relation, returns the first matching BundleLinkComponent. + * + * @param theRelation + * The relation, such as \"next\", or \"self. See the constants such as {@link IBaseBundle#LINK_SELF} and {@link IBaseBundle#LINK_NEXT}. + * @return Returns a matching BundleLinkComponent, or null + * @see IBaseBundle#LINK_NEXT + * @see IBaseBundle#LINK_PREV + * @see IBaseBundle#LINK_SELF + */ + public BundleLinkComponent getLink(String theRelation) { + org.apache.commons.lang3.Validate.notBlank(theRelation, "theRelation may not be null or empty"); + for (BundleLinkComponent next : getLink()) { + if (theRelation.equals(next.getRelation())) { + return next; + } + } + return null; + } + + /** + * Returns the {@link #getLink() link} which matches a given {@link BundleLinkComponent#getRelation() relation}. + * If no link is found which matches the given relation, creates a new BundleLinkComponent with the + * given relation and adds it to this Bundle. If more than one + * link is found which matches the given relation, returns the first matching BundleLinkComponent. + * + * @param theRelation + * The relation, such as \"next\", or \"self. See the constants such as {@link IBaseBundle#LINK_SELF} and {@link IBaseBundle#LINK_NEXT}. + * @return Returns a matching BundleLinkComponent, or null + * @see IBaseBundle#LINK_NEXT + * @see IBaseBundle#LINK_PREV + * @see IBaseBundle#LINK_SELF + */ + public BundleLinkComponent getLinkOrCreate(String theRelation) { + org.apache.commons.lang3.Validate.notBlank(theRelation, "theRelation may not be null or empty"); + for (BundleLinkComponent next : getLink()) { + if (theRelation.equals(next.getRelation())) { + return next; + } + } + BundleLinkComponent retVal = new BundleLinkComponent(); + retVal.setRelation(theRelation); + getLink().add(retVal); + return retVal; + } + diff --git a/org.hl7.fhir.core.generator/configuration/CanonicalResource.java b/org.hl7.fhir.core.generator/configuration/CanonicalResource.java new file mode 100644 index 000000000..63da0ae20 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/CanonicalResource.java @@ -0,0 +1,12 @@ + @Override + public String toString() { + return fhirType()+"["+getUrl()+"]"; + } + + public String present() { + if (hasTitle()) + return getTitle(); + if (hasName()) + return getName(); + return toString(); + } diff --git a/org.hl7.fhir.core.generator/configuration/CapabilityStatement.java b/org.hl7.fhir.core.generator/configuration/CapabilityStatement.java new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/CapabilityStatement.java @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/org.hl7.fhir.core.generator/configuration/CodeSystem.java b/org.hl7.fhir.core.generator/configuration/CodeSystem.java new file mode 100644 index 000000000..e9b8fa196 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/CodeSystem.java @@ -0,0 +1,7 @@ + public PropertyComponent getProperty(String code) { + for (PropertyComponent pd : getProperty()) { + if (pd.getCode().equalsIgnoreCase(code)) + return pd; + } + return null; + } diff --git a/org.hl7.fhir.core.generator/configuration/CodeType.java b/org.hl7.fhir.core.generator/configuration/CodeType.java new file mode 100644 index 000000000..4511b7296 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/CodeType.java @@ -0,0 +1,38 @@ + + private String system; + + @Override + public String getSystem() { + return system; + } + + @Override + public boolean hasSystem() { + return system != null; + } + + public CodeType setSystem(String system) { + this.system = system; + return this; + } + + @Override + public String getVersion() { + return null; + } + + @Override + public boolean hasVersion() { + return false; + } + + @Override + public String getDisplay() { + return null; + } + + @Override + public boolean hasDisplay() { + return false; + } + diff --git a/org.hl7.fhir.core.generator/configuration/CodeableConcept.java b/org.hl7.fhir.core.generator/configuration/CodeableConcept.java new file mode 100644 index 000000000..3175e2751 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/CodeableConcept.java @@ -0,0 +1,15 @@ + + public boolean hasCoding(String system, String code) { + for (Coding c : getCoding()) { + if (system.equals(c.getSystem()) && code.equals(c.getCode())) + return true; + } + return false; + } + + public CodeableConcept(Coding code) { + super(); + addCoding(code); + } + + diff --git a/org.hl7.fhir.core.generator/configuration/Coding.java b/org.hl7.fhir.core.generator/configuration/Coding.java new file mode 100644 index 000000000..8e020a79c --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/Coding.java @@ -0,0 +1,26 @@ + @Override + public boolean supportsVersion() { + return true; + } + + @Override + public boolean supportsDisplay() { + return true; + } + + + public boolean is(String system, String code) { + return hasSystem() && hasCode() && this.getSystem().equals(system) && this.getCode().equals(code); + } + + public String toString() { + String base = getSystem(); + if (hasVersion()) + base = base+"|"+getVersion(); + base = base + "#"+getCode(); + if (hasDisplay()) + base = base+": "+getDisplay(); + return base; + + } + diff --git a/org.hl7.fhir.core.generator/configuration/ConceptDefinitionComponent.java b/org.hl7.fhir.core.generator/configuration/ConceptDefinitionComponent.java new file mode 100644 index 000000000..503a5e63e --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/ConceptDefinitionComponent.java @@ -0,0 +1,6 @@ + + @Override + public String toString() { + return getCode()+": "+getDisplay(); + } + diff --git a/org.hl7.fhir.core.generator/configuration/DomainResource.java b/org.hl7.fhir.core.generator/configuration/DomainResource.java new file mode 100644 index 000000000..39a1cb86c --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/DomainResource.java @@ -0,0 +1,84 @@ + + public void checkNoModifiers(String noun, String verb) throws FHIRException { + if (hasModifierExtension()) { + throw new FHIRException("Found unknown Modifier Exceptions on "+noun+" doing "+verb); + } + + } + + public void addExtension(String url, DataType value) { + Extension ex = new Extension(); + ex.setUrl(url); + ex.setValue(value); + getExtension().add(ex); + } + + + + + public boolean hasExtension(String url) { + for (Extension e : getExtension()) + if (url.equals(e.getUrl())) + return true; + return false; + } + + public Extension getExtensionByUrl(String theUrl) { + org.apache.commons.lang3.Validate.notBlank(theUrl, "theUrl must not be blank or null"); + ArrayList retVal = new ArrayList(); + for (Extension next : getExtension()) { + if (theUrl.equals(next.getUrl())) { + retVal.add(next); + } + } + if (retVal.size() == 0) + return null; + else { + org.apache.commons.lang3.Validate.isTrue(retVal.size() == 1, "Url "+theUrl+" must have only one match"); + return retVal.get(0); + } + } + + public Resource getContained(String ref) { + if (ref == null) + return null; + + if (ref.startsWith("#")) + ref = ref.substring(1); + for (Resource r : getContained()) { + if (r.getId().equals(ref)) + return r; + } + return null; + } + + /** + * Returns a list of extensions from this element which have the given URL. Note that + * this list may not be modified (you can not add or remove elements from it) + */ + public List getExtensionsByUrl(String theUrl) { + org.apache.commons.lang3.Validate.notBlank(theUrl, "theUrl must be provided with a value"); + ArrayList retVal = new ArrayList(); + for (Extension next : getExtension()) { + if (theUrl.equals(next.getUrl())) { + retVal.add(next); + } + } + return Collections.unmodifiableList(retVal); + } + + /** + * Returns a list of modifier extensions from this element which have the given URL. Note that + * this list may not be modified (you can not add or remove elements from it) + */ + public List getModifierExtensionsByUrl(String theUrl) { + org.apache.commons.lang3.Validate.notBlank(theUrl, "theUrl must be provided with a value"); + ArrayList retVal = new ArrayList(); + for (Extension next : getModifierExtension()) { + if (theUrl.equals(next.getUrl())) { + retVal.add(next); + } + } + return Collections.unmodifiableList(retVal); + } + diff --git a/org.hl7.fhir.core.generator/configuration/Element.java b/org.hl7.fhir.core.generator/configuration/Element.java new file mode 100644 index 000000000..43646d3a5 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/Element.java @@ -0,0 +1,97 @@ + @Override + public String getIdBase() { + return getId(); + } + + @Override + public void setIdBase(String value) { + setId(value); + } + + public void addExtension(String url, DataType value) { + if (disallowExtensions) + throw new Error("Extensions are not allowed in this context"); + Extension ex = new Extension(); + ex.setUrl(url); + ex.setValue(value); + getExtension().add(ex); + } + + + public Extension getExtensionByUrl(String theUrl) { + org.apache.commons.lang3.Validate.notBlank(theUrl, "theUrl must not be blank or null"); + ArrayList retVal = new ArrayList(); + for (Extension next : getExtension()) { + if (theUrl.equals(next.getUrl())) { + retVal.add(next); + } + } + if (retVal.size() == 0) + return null; + else { + org.apache.commons.lang3.Validate.isTrue(retVal.size() == 1, "Url "+theUrl+" must have only one match"); + return retVal.get(0); + } + } + + public void removeExtension(String theUrl) { + for (int i = getExtension().size()-1; i >= 0; i--) { + if (theUrl.equals(getExtension().get(i).getUrl())) + getExtension().remove(i); + } + } + + /** + * This is used in the FHIRPath engine to record that no extensions are allowed for this item in the context in which it is used. + * todo: enforce this.... + */ + private boolean disallowExtensions; + + public boolean isDisallowExtensions() { + return disallowExtensions; + } + + public Element setDisallowExtensions(boolean disallowExtensions) { + this.disallowExtensions = disallowExtensions; + return this; + } + + public Element noExtensions() { + this.disallowExtensions = true; + return this; + } + + /** + * Returns an unmodifiable list containing all extensions on this element which + * match the given URL. + * + * @param theUrl The URL. Must not be blank or null. + * @return an unmodifiable list containing all extensions on this element which + * match the given URL + */ + public List getExtensionsByUrl(String theUrl) { + org.apache.commons.lang3.Validate.notBlank(theUrl, "theUrl must not be blank or null"); + ArrayList retVal = new ArrayList(); + for (Extension next : getExtension()) { + if (theUrl.equals(next.getUrl())) { + retVal.add(next); + } + } + return java.util.Collections.unmodifiableList(retVal); + } + + public boolean hasExtension(String theUrl) { + return !getExtensionsByUrl(theUrl).isEmpty(); + } + + + public String getExtensionString(String theUrl) throws FHIRException { + List ext = getExtensionsByUrl(theUrl); + if (ext.isEmpty()) + return null; + if (ext.size() > 1) + throw new FHIRException("Multiple matching extensions found"); + if (!ext.get(0).getValue().isPrimitive()) + throw new FHIRException("Extension could not be converted to a string"); + return ext.get(0).getValue().primitiveValue(); + } \ No newline at end of file diff --git a/org.hl7.fhir.core.generator/configuration/ElementDefinition.java b/org.hl7.fhir.core.generator/configuration/ElementDefinition.java new file mode 100644 index 000000000..0ff63bd8e --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/ElementDefinition.java @@ -0,0 +1,90 @@ + + public String toString() { + if (hasId()) + return getId(); + if (hasSliceName()) + return getPath()+":"+getSliceName(); + else + return getPath(); + } + + public void makeBase(String path, int min, String max) { + ElementDefinitionBaseComponent self = getBase(); + self.setPath(path); + self.setMin(min); + self.setMax(max); + } + + public void makeBase() { + ElementDefinitionBaseComponent self = getBase(); + self.setPath(getPath()); + self.setMin(getMin()); + self.setMax(getMax()); + } + + + + public String typeSummary() { + CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(); + for (TypeRefComponent tr : type) { + if (tr.hasCode()) + b.append(tr.getCode()); + } + return b.toString(); + } + + public TypeRefComponent getType(String code) { + for (TypeRefComponent tr : getType()) + if (tr.getCode().equals(code)) + return tr; + TypeRefComponent tr = new TypeRefComponent(); + tr.setCode(code); + type.add(tr); + return tr; + } + + public static final boolean NOT_MODIFIER = false; + public static final boolean NOT_IN_SUMMARY = false; + public static final boolean IS_MODIFIER = true; + public static final boolean IS_IN_SUMMARY = true; + public ElementDefinition(boolean defaults, boolean modifier, boolean inSummary) { + super(); + if (defaults) { + setIsModifier(modifier); + setIsSummary(inSummary); + } + } + + public String present() { + return hasId() ? getId() : getPath(); + } + + public boolean hasCondition(IdType id) { + for (IdType c : getCondition()) { + if (c.primitiveValue().equals(id.primitiveValue())) + return true; + } + return false; + } + + public boolean hasConstraint(String key) { + for (ElementDefinitionConstraintComponent c : getConstraint()) { + if (c.getKey().equals(key)) + return true; + } + return false; + } + + public boolean hasCode(Coding c) { + for (Coding t : getCode()) { + if (t.getSystem().equals(c.getSystem()) && t.getCode().equals(c.getCode())) + return true; + } + return false; + } + + public boolean isChoice() { + return getPath().endsWith("[x]"); + } + + diff --git a/org.hl7.fhir.core.generator/configuration/FHIRVersion.java b/org.hl7.fhir.core.generator/configuration/FHIRVersion.java new file mode 100644 index 000000000..f3a1477e5 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/FHIRVersion.java @@ -0,0 +1,62 @@ + public String toCode(int len) { + return toCode().substring(0, len); + } + + public static boolean isR4Plus(String version) { + return version != null && (version.startsWith("4.") || version.startsWith("5.") || "current".equals(version)); + } + + public static boolean isValidCode(String codeString) { + if (codeString == null || "".equals(codeString)) + return false; + if ("0.01".equals(codeString)) + return true; + if ("0.05".equals(codeString)) + return true; + if ("0.06".equals(codeString)) + return true; + if ("0.11".equals(codeString)) + return true; + if ("0.0.80".equals(codeString)) + return true; + if ("0.0.81".equals(codeString)) + return true; + if ("0.0.82".equals(codeString)) + return true; + if ("0.4.0".equals(codeString)) + return true; + if ("0.5.0".equals(codeString)) + return true; + if ("1.0.0".equals(codeString)) + return true; + if ("1.0.1".equals(codeString)) + return true; + if ("1.0.2".equals(codeString)) + return true; + if ("1.1.0".equals(codeString)) + return true; + if ("1.4.0".equals(codeString)) + return true; + if ("1.6.0".equals(codeString)) + return true; + if ("1.8.0".equals(codeString)) + return true; + if ("3.0.0".equals(codeString)) + return true; + if ("3.0.1".equals(codeString)) + return true; + if ("3.3.0".equals(codeString)) + return true; + if ("3.5.0".equals(codeString)) + return true; + if ("4.0.0".equals(codeString)) + return true; + if ("4.1.0".equals(codeString)) + return true; + return false; + } + + @Override + public String toString() { + return toCode(); + } diff --git a/org.hl7.fhir.core.generator/configuration/HumanName.java b/org.hl7.fhir.core.generator/configuration/HumanName.java new file mode 100644 index 000000000..3c7234976 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/HumanName.java @@ -0,0 +1,67 @@ + /** + /** + * Returns all repetitions of {@link #getGiven() given name} as a space separated string + * + * @see DatatypeUtil#joinStringsSpaceSeparated(List) + */ + public String getGivenAsSingleString() { + return joinStringsSpaceSeparated(getGiven()); + } + + /** + * Returns all repetitions of {@link #getPrefix() prefix name} as a space separated string + * + * @see DatatypeUtil#joinStringsSpaceSeparated(List) + */ + public String getPrefixAsSingleString() { + return joinStringsSpaceSeparated(getPrefix()); + } + + /** + * Returns all repetitions of {@link #getSuffix() suffix} as a space separated string + * + * @see DatatypeUtil#joinStringsSpaceSeparated(List) + */ + public String getSuffixAsSingleString() { + return joinStringsSpaceSeparated(getSuffix()); + } + + /** + * Returns all of the components of the name (prefix, given, family, suffix) as a single string with a single spaced + * string separating each part. + *

+ * If none of the parts are populated, returns the {@link #getTextElement() text} element value instead. + *

+ */ + public String getNameAsSingleString() { + List nameParts = new ArrayList(); + nameParts.addAll(getPrefix()); + nameParts.addAll(getGiven()); + nameParts.add(getFamilyElement()); + nameParts.addAll(getSuffix()); + if (nameParts.size() > 0) { + return joinStringsSpaceSeparated(nameParts); + } else { + return getTextElement().getValue(); + } + } + + /** + * Joins a list of strings with a single space (' ') between each string + * + * TODO: replace with call to ca.uhn.fhir.util.DatatypeUtil.joinStringsSpaceSeparated when HAPI upgrades to 1.4 + */ + private static String joinStringsSpaceSeparated(List> theStrings) { + StringBuilder b = new StringBuilder(); + for (IPrimitiveType next : theStrings) { + if (next.isEmpty()) { + continue; + } + if (b.length() > 0) { + b.append(' '); + } + b.append(next.getValue()); + } + return b.toString(); + } + diff --git a/org.hl7.fhir.core.generator/configuration/ImplementationGuideDefinitionResourceComponent.java b/org.hl7.fhir.core.generator/configuration/ImplementationGuideDefinitionResourceComponent.java new file mode 100644 index 000000000..0fd4dd411 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/ImplementationGuideDefinitionResourceComponent.java @@ -0,0 +1,2 @@ + + diff --git a/org.hl7.fhir.core.generator/configuration/JsonParser.java b/org.hl7.fhir.core.generator/configuration/JsonParser.java new file mode 100644 index 000000000..cd5abc9a4 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/JsonParser.java @@ -0,0 +1,844 @@ +package org.hl7.fhir.r5.formats; + +// generated + +{{license}} + +{{startMark}} + +import org.hl7.fhir.r5.model.*; +import org.hl7.fhir.utilities.Utilities; +import org.hl7.fhir.utilities.xhtml.XhtmlNode; +import org.hl7.fhir.exceptions.FHIRFormatError; +import org.hl7.fhir.exceptions.FHIRException; +import org.hl7.fhir.utilities.json.JsonTrackingParser.PresentedBigDecimal; +import com.google.gson.JsonObject; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import java.io.IOException; + +public class JsonParser extends JsonParserBase { + + public JsonParser() { + super(); + } + + public JsonParser(boolean allowUnknownContent) { + super(); + setAllowUnknownContent(allowUnknownContent); + } + + protected void parseBaseProperties(JsonObject json, Base res) throws IOException, FHIRFormatError { + // nothing + } + + @SuppressWarnings("unchecked") + protected > Enumeration parseEnumeration(String s, E item, EnumFactory e) throws IOException, FHIRFormatError { + Enumeration res = new Enumeration(e); + if (s != null) + res.setValue((E) e.fromCode(s)); + return res; + } + + protected DateType parseDate(String v) throws IOException, FHIRFormatError { + DateType res = new DateType(v); + return res; + } + + protected DateTimeType parseDateTime(String v) throws IOException, FHIRFormatError { + DateTimeType res = new DateTimeType(v); + return res; + } + + protected CodeType parseCode(String v) throws IOException, FHIRFormatError { + CodeType res = new CodeType(v); + return res; + } + + protected StringType parseString(String v) throws IOException, FHIRFormatError { + StringType res = new StringType(v); + return res; + } + + protected IntegerType parseInteger(java.lang.Long v) throws IOException, FHIRFormatError { + IntegerType res = new IntegerType(v); + return res; + } + + protected Integer64Type parseInteger64(java.lang.Long v) throws IOException, FHIRFormatError { + Integer64Type res = new Integer64Type(v); + return res; + } + + protected OidType parseOid(String v) throws IOException, FHIRFormatError { + OidType res = new OidType(v); + return res; + } + + protected CanonicalType parseCanonical(String v) throws IOException, FHIRFormatError { + CanonicalType res = new CanonicalType(v); + return res; + } + + protected UriType parseUri(String v) throws IOException, FHIRFormatError { + UriType res = new UriType(v); + return res; + } + + protected UuidType parseUuid(String v) throws IOException, FHIRFormatError { + UuidType res = new UuidType(v); + return res; + } + + protected UrlType parseUrl(String v) throws IOException, FHIRFormatError { + UrlType res = new UrlType(v); + return res; + } + + protected InstantType parseInstant(String v) throws IOException, FHIRFormatError { + InstantType res = new InstantType(v); + return res; + } + + protected BooleanType parseBoolean(java.lang.Boolean v) throws IOException, FHIRFormatError { + BooleanType res = new BooleanType(v); + return res; + } + + protected Base64BinaryType parseBase64Binary(String v) throws IOException, FHIRFormatError { + Base64BinaryType res = new Base64BinaryType(v); + return res; + } + + protected UnsignedIntType parseUnsignedInt(String v) throws IOException, FHIRFormatError { + UnsignedIntType res = new UnsignedIntType(v); + return res; + } + + protected MarkdownType parseMarkdown(String v) throws IOException, FHIRFormatError { + MarkdownType res = new MarkdownType(v); + return res; + } + + protected TimeType parseTime(String v) throws IOException, FHIRFormatError { + TimeType res = new TimeType(v); + return res; + } + + protected IdType parseId(String v) throws IOException, FHIRFormatError { + IdType res = new IdType(v); + return res; + } + + protected PositiveIntType parsePositiveInt(String v) throws IOException, FHIRFormatError { + PositiveIntType res = new PositiveIntType(v); + return res; + } + + protected DecimalType parseDecimal(java.math.BigDecimal v) throws IOException, FHIRFormatError { + DecimalType res = new DecimalType(v); + if (v instanceof PresentedBigDecimal) + res.setRepresentation(((PresentedBigDecimal) v).getPresentation()); + return res; + } + + + +{{parser}} + + @Override + protected Resource parseResource(JsonObject json) throws IOException, FHIRFormatError { + if (!json.has("resourceType")) { + throw new FHIRFormatError("Unable to find resource type - maybe not a FHIR resource?"); + } + String t = json.get("resourceType").getAsString(); + if (Utilities.noString(t)) { + throw new FHIRFormatError("Unable to find resource type - maybe not a FHIR resource?"); +{{parse-resource}} + } else { + throw new FHIRFormatError("Unknown.Unrecognised resource type '"+t+"' (in property 'resourceType')"); + } + } + + protected DataType parseType(String prefix, JsonObject json) throws IOException, FHIRFormatError { + if (json.has(prefix+"Date") || json.has("_"+prefix+"Date")) { + DataType t = json.has(prefix+"Date") ? parseDate(json.get(prefix+"Date").getAsString()) : new DateType(); + if (json.has("_"+prefix+"Date")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"Date"), t); + return t; + } + else if (json.has(prefix+"DateTime") || json.has("_"+prefix+"DateTime")) { + DataType t = json.has(prefix+"DateTime") ? parseDateTime(json.get(prefix+"DateTime").getAsString()) : new DateTimeType(); + if (json.has("_"+prefix+"DateTime")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"DateTime"), t); + return t; + } + else if (json.has(prefix+"Code") || json.has("_"+prefix+"Code")) { + DataType t = json.has(prefix+"Code") ? parseCode(json.get(prefix+"Code").getAsString()) : new CodeType(); + if (json.has("_"+prefix+"Code")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"Code"), t); + return t; + } + else if (json.has(prefix+"String") || json.has("_"+prefix+"String")) { + DataType t = json.has(prefix+"String") ? parseString(json.get(prefix+"String").getAsString()) : new StringType(); + if (json.has("_"+prefix+"String")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"String"), t); + return t; + } + else if (json.has(prefix+"Integer") || json.has("_"+prefix+"Integer")) { + DataType t = json.has(prefix+"Integer") ? parseInteger(json.get(prefix+"Integer").getAsLong()) : new IntegerType(); + if (json.has("_"+prefix+"Integer")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"Integer"), t); + return t; + } + else if (json.has(prefix+"Integer64") || json.has("_"+prefix+"Integer64")) { + DataType t = json.has(prefix+"Integer64") ? parseInteger64(json.get(prefix+"Integer64").getAsLong()) : new Integer64Type(); + if (json.has("_"+prefix+"Integer64")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"Integer64"), t); + return t; + } + else if (json.has(prefix+"Oid") || json.has("_"+prefix+"Oid")) { + DataType t = json.has(prefix+"Oid") ? parseOid(json.get(prefix+"Oid").getAsString()) : new OidType(); + if (json.has("_"+prefix+"Oid")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"Oid"), t); + return t; + } + else if (json.has(prefix+"Canonical") || json.has("_"+prefix+"Canonical")) { + DataType t = json.has(prefix+"Canonical") ? parseCanonical(json.get(prefix+"Canonical").getAsString()) : new CanonicalType(); + if (json.has("_"+prefix+"Canonical")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"Canonical"), t); + return t; + } + else if (json.has(prefix+"Uri") || json.has("_"+prefix+"Uri")) { + DataType t = json.has(prefix+"Uri") ? parseUri(json.get(prefix+"Uri").getAsString()) : new UriType(); + if (json.has("_"+prefix+"Uri")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"Uri"), t); + return t; + } + else if (json.has(prefix+"Uuid") || json.has("_"+prefix+"Uuid")) { + DataType t = json.has(prefix+"Uuid") ? parseUuid(json.get(prefix+"Uuid").getAsString()) : new UuidType(); + if (json.has("_"+prefix+"Uuid")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"Uuid"), t); + return t; + } + else if (json.has(prefix+"Url") || json.has("_"+prefix+"Url")) { + DataType t = json.has(prefix+"Url") ? parseUrl(json.get(prefix+"Url").getAsString()) : new UrlType(); + if (json.has("_"+prefix+"Url")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"Url"), t); + return t; + } + else if (json.has(prefix+"Instant") || json.has("_"+prefix+"Instant")) { + DataType t = json.has(prefix+"Instant") ? parseInstant(json.get(prefix+"Instant").getAsString()) : new InstantType(); + if (json.has("_"+prefix+"Instant")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"Instant"), t); + return t; + } + else if (json.has(prefix+"Boolean") || json.has("_"+prefix+"Boolean")) { + DataType t = json.has(prefix+"Boolean") ? parseBoolean(json.get(prefix+"Boolean").getAsBoolean()) : new BooleanType(); + if (json.has("_"+prefix+"Boolean")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"Boolean"), t); + return t; + } + else if (json.has(prefix+"Base64Binary") || json.has("_"+prefix+"Base64Binary")) { + DataType t = json.has(prefix+"Base64Binary") ? parseBase64Binary(json.get(prefix+"Base64Binary").getAsString()) : new Base64BinaryType(); + if (json.has("_"+prefix+"Base64Binary")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"Base64Binary"), t); + return t; + } + else if (json.has(prefix+"UnsignedInt") || json.has("_"+prefix+"UnsignedInt")) { + DataType t = json.has(prefix+"UnsignedInt") ? parseUnsignedInt(json.get(prefix+"UnsignedInt").getAsString()) : new UnsignedIntType(); + if (json.has("_"+prefix+"UnsignedInt")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"UnsignedInt"), t); + return t; + } + else if (json.has(prefix+"Markdown") || json.has("_"+prefix+"Markdown")) { + DataType t = json.has(prefix+"Markdown") ? parseMarkdown(json.get(prefix+"Markdown").getAsString()) : new MarkdownType(); + if (json.has("_"+prefix+"Markdown")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"Markdown"), t); + return t; + } + else if (json.has(prefix+"Time") || json.has("_"+prefix+"Time")) { + DataType t = json.has(prefix+"Time") ? parseTime(json.get(prefix+"Time").getAsString()) : new TimeType(); + if (json.has("_"+prefix+"Time")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"Time"), t); + return t; + } + else if (json.has(prefix+"Id") || json.has("_"+prefix+"Id")) { + DataType t = json.has(prefix+"Id") ? parseId(json.get(prefix+"Id").getAsString()) : new IdType(); + if (json.has("_"+prefix+"Id")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"Id"), t); + return t; + } + else if (json.has(prefix+"PositiveInt") || json.has("_"+prefix+"PositiveInt")) { + DataType t = json.has(prefix+"PositiveInt") ? parsePositiveInt(json.get(prefix+"PositiveInt").getAsString()) : new PositiveIntType(); + if (json.has("_"+prefix+"PositiveInt")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"PositiveInt"), t); + return t; + } + else if (json.has(prefix+"Decimal") || json.has("_"+prefix+"Decimal")) { + DataType t = json.has(prefix+"Decimal") ? parseDecimal(json.get(prefix+"Decimal").getAsBigDecimal()) : new DecimalType(); + if (json.has("_"+prefix+"Decimal")) + parseElementProperties(json.getAsJsonObject("_"+prefix+"Decimal"), t); + return t; +{{parse-type-pfx}} + } else { + return null; + } + } + + protected DataType parseAnyType(JsonObject json, String type) throws IOException, FHIRFormatError { + return parseType(json, type); + } + + protected DataType parseType(JsonObject json, String type) throws IOException, FHIRFormatError { + if (Utilities.noString(type)) { + throw new FHIRFormatError("Unable to parse type - type not specified"); +{{parse-type}} + } else { + throw new FHIRFormatError("Unknown Type "+type); + } + } + + protected boolean hasTypeName(JsonObject json, String prefix) { +{{parse-has-type}} + if (json.has(prefix+"Date") || json.has("_"+prefix+"Date")) + return true; + if (json.has(prefix+"DateTime") || json.has("_"+prefix+"DateTime")) + return true; + if (json.has(prefix+"Code") || json.has("_"+prefix+"Code")) + return true; + if (json.has(prefix+"String") || json.has("_"+prefix+"String")) + return true; + if (json.has(prefix+"Integer") || json.has("_"+prefix+"Integer")) + return true; + if (json.has(prefix+"Integer64") || json.has("_"+prefix+"Integer64")) + return true; + if (json.has(prefix+"Oid") || json.has("_"+prefix+"Oid")) + return true; + if (json.has(prefix+"Canonical") || json.has("_"+prefix+"Canonical")) + return true; + if (json.has(prefix+"Uri") || json.has("_"+prefix+"Uri")) + return true; + if (json.has(prefix+"Uuid") || json.has("_"+prefix+"Uuid")) + return true; + if (json.has(prefix+"Url") || json.has("_"+prefix+"Url")) + return true; + if (json.has(prefix+"Instant") || json.has("_"+prefix+"Instant")) + return true; + if (json.has(prefix+"Boolean") || json.has("_"+prefix+"Boolean")) + return true; + if (json.has(prefix+"Base64Binary") || json.has("_"+prefix+"Base64Binary")) + return true; + if (json.has(prefix+"UnsignedInt") || json.has("_"+prefix+"UnsignedInt")) + return true; + if (json.has(prefix+"Markdown") || json.has("_"+prefix+"Markdown")) + return true; + if (json.has(prefix+"Time") || json.has("_"+prefix+"Time")) + return true; + if (json.has(prefix+"Id") || json.has("_"+prefix+"Id")) + return true; + if (json.has(prefix+"PositiveInt") || json.has("_"+prefix+"PositiveInt")) + return true; + if (json.has(prefix+"Decimal") || json.has("_"+prefix+"Decimal")) + return true; + return false; + } + +// -- compose --------------------------------------------------------------------------------------------------------------------- + + protected void composeBaseProperties(Base element) throws IOException { + } + + + protected > void composeEnumerationCore(String name, Enumeration value, EnumFactory e, boolean inArray) throws IOException { + if (value != null && value.getValue() != null) { + prop(name, e.toCode(value.getValue())); + } else if (inArray) + writeNull(name); + } + + protected > void composeEnumerationExtras(String name, Enumeration value, EnumFactory e, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } else if (inArray) + writeNull(name); + } + + protected void composeDateCore(String name, DateType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, value.asStringValue()); + } + else if (inArray) + writeNull(name); + } + + protected void composeDateExtras(String name, DateType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeDateTimeCore(String name, DateTimeType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, value.asStringValue()); + } + else if (inArray) + writeNull(name); + } + + protected void composeDateTimeExtras(String name, DateTimeType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeCodeCore(String name, CodeType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, toString(value.getValue())); + } + else if (inArray) + writeNull(name); + } + + protected void composeCodeExtras(String name, CodeType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeStringCore(String name, StringType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, toString(value.getValue())); + } + else if (inArray) + writeNull(name); + } + + protected void composeStringExtras(String name, StringType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeIntegerCore(String name, IntegerType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, Integer.valueOf(value.getValue())); + } + else if (inArray) + writeNull(name); + } + + protected void composeIntegerExtras(String name, IntegerType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeInteger64Core(String name, Integer64Type value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, value.getValue().toString()); + } + else if (inArray) + writeNull(name); + } + + protected void composeInteger64Extras(String name, Integer64Type value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeOidCore(String name, OidType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, toString(value.getValue())); + } + else if (inArray) + writeNull(name); + } + + protected void composeOidExtras(String name, OidType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeCanonicalCore(String name, CanonicalType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, toString(value.getValue())); + } + else if (inArray) + writeNull(name); + } + + protected void composeCanonicalExtras(String name, CanonicalType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeUriCore(String name, UriType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, toString(value.getValue())); + } + else if (inArray) + writeNull(name); + } + + protected void composeUriExtras(String name, UriType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeUuidCore(String name, UuidType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, toString(value.getValue())); + } + else if (inArray) + writeNull(name); + } + + protected void composeUuidExtras(String name, UuidType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeUrlCore(String name, UrlType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, toString(value.getValue())); + } + else if (inArray) + writeNull(name); + } + + protected void composeUrlExtras(String name, UrlType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeInstantCore(String name, InstantType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, value.asStringValue()); + } + else if (inArray) + writeNull(name); + } + + protected void composeInstantExtras(String name, InstantType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeBooleanCore(String name, BooleanType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, value.getValue()); + } + else if (inArray) + writeNull(name); + } + + protected void composeBooleanExtras(String name, BooleanType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeBase64BinaryCore(String name, Base64BinaryType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, toString(value.getValue())); + } + else if (inArray) + writeNull(name); + } + + protected void composeBase64BinaryExtras(String name, Base64BinaryType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeUnsignedIntCore(String name, UnsignedIntType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, Integer.valueOf(value.getValue())); + } + else if (inArray) + writeNull(name); + } + + protected void composeUnsignedIntExtras(String name, UnsignedIntType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeMarkdownCore(String name, MarkdownType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, toString(value.getValue())); + } + else if (inArray) + writeNull(name); + } + + protected void composeMarkdownExtras(String name, MarkdownType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeTimeCore(String name, TimeType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, value.asStringValue()); + } + else if (inArray) + writeNull(name); + } + + protected void composeTimeExtras(String name, TimeType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeIdCore(String name, IdType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, toString(value.getValue())); + } + else if (inArray) + writeNull(name); + } + + protected void composeIdExtras(String name, IdType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composePositiveIntCore(String name, PositiveIntType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, Integer.valueOf(value.getValue())); + } + else if (inArray) + writeNull(name); + } + + protected void composePositiveIntExtras(String name, PositiveIntType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + + protected void composeDecimalCore(String name, DecimalType value, boolean inArray) throws IOException { + if (value != null && value.hasValue()) { + prop(name, value.getValue()); + } + else if (inArray) + writeNull(name); + } + + protected void composeDecimalExtras(String name, DecimalType value, boolean inArray) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || makeComments(value))) { + open(inArray ? null : "_"+name); + composeElementProperties(value); + close(); + } + else if (inArray) + writeNull(name); + } + +{{composer}} + + @Override + protected void composeResource(Resource resource) throws IOException { + if (resource == null) { + throw new Error("Unhandled resource type "+resource.getClass().getName()); +{{compose-resource}} + } else + throw new Error("Unhandled resource type "+resource.getClass().getName()); + } + + protected void composeNamedReference(String name, Resource resource) throws IOException { + if (resource == null) { + throw new Error("Unhandled resource type "+resource.getClass().getName()); +{{compose-resource-named}} + } else + throw new Error("Unhandled resource type "+resource.getClass().getName()); + } + + protected void composeType(String prefix, DataType type) throws IOException { + if (type == null) { + ; +{{compose-type}} + } else if (type instanceof CodeType) { + composeCodeCore(prefix+"Code", (CodeType) type, false); + composeCodeExtras(prefix+"Code", (CodeType) type, false); + } + else if (type instanceof OidType) { + composeOidCore(prefix+"Oid", (OidType) type, false); + composeOidExtras(prefix+"Oid", (OidType) type, false); + } + else if (type instanceof CanonicalType) { + composeCanonicalCore(prefix+"Canonical", (CanonicalType) type, false); + composeCanonicalExtras(prefix+"Canonical", (CanonicalType) type, false); + } + else if (type instanceof UuidType) { + composeUuidCore(prefix+"Uuid", (UuidType) type, false); + composeUuidExtras(prefix+"Uuid", (UuidType) type, false); + } + else if (type instanceof UrlType) { + composeUrlCore(prefix+"Url", (UrlType) type, false); + composeUrlExtras(prefix+"Url", (UrlType) type, false); + } + else if (type instanceof UnsignedIntType) { + composeUnsignedIntCore(prefix+"UnsignedInt", (UnsignedIntType) type, false); + composeUnsignedIntExtras(prefix+"UnsignedInt", (UnsignedIntType) type, false); + } + else if (type instanceof MarkdownType) { + composeMarkdownCore(prefix+"Markdown", (MarkdownType) type, false); + composeMarkdownExtras(prefix+"Markdown", (MarkdownType) type, false); + } + else if (type instanceof IdType) { + composeIdCore(prefix+"Id", (IdType) type, false); + composeIdExtras(prefix+"Id", (IdType) type, false); + } + else if (type instanceof PositiveIntType) { + composePositiveIntCore(prefix+"PositiveInt", (PositiveIntType) type, false); + composePositiveIntExtras(prefix+"PositiveInt", (PositiveIntType) type, false); + } + else if (type instanceof DateType) { + composeDateCore(prefix+"Date", (DateType) type, false); + composeDateExtras(prefix+"Date", (DateType) type, false); + } + else if (type instanceof DateTimeType) { + composeDateTimeCore(prefix+"DateTime", (DateTimeType) type, false); + composeDateTimeExtras(prefix+"DateTime", (DateTimeType) type, false); + } + else if (type instanceof StringType) { + composeStringCore(prefix+"String", (StringType) type, false); + composeStringExtras(prefix+"String", (StringType) type, false); + } + else if (type instanceof IntegerType) { + composeIntegerCore(prefix+"Integer", (IntegerType) type, false); + composeIntegerExtras(prefix+"Integer", (IntegerType) type, false); + } + else if (type instanceof Integer64Type) { + composeInteger64Core(prefix+"Integer64", (Integer64Type) type, false); + composeInteger64Extras(prefix+"Integer64", (Integer64Type) type, false); + } + else if (type instanceof UriType) { + composeUriCore(prefix+"Uri", (UriType) type, false); + composeUriExtras(prefix+"Uri", (UriType) type, false); + } + else if (type instanceof InstantType) { + composeInstantCore(prefix+"Instant", (InstantType) type, false); + composeInstantExtras(prefix+"Instant", (InstantType) type, false); + } + else if (type instanceof BooleanType) { + composeBooleanCore(prefix+"Boolean", (BooleanType) type, false); + composeBooleanExtras(prefix+"Boolean", (BooleanType) type, false); + } + else if (type instanceof Base64BinaryType) { + composeBase64BinaryCore(prefix+"Base64Binary", (Base64BinaryType) type, false); + composeBase64BinaryExtras(prefix+"Base64Binary", (Base64BinaryType) type, false); + } + else if (type instanceof TimeType) { + composeTimeCore(prefix+"Time", (TimeType) type, false); + composeTimeExtras(prefix+"Time", (TimeType) type, false); + } + else if (type instanceof DecimalType) { + composeDecimalCore(prefix+"Decimal", (DecimalType) type, false); + composeDecimalExtras(prefix+"Decimal", (DecimalType) type, false); + } else + throw new Error("Unhandled type"); + } + + protected void composeTypeInner(DataType type) throws IOException { + if (type == null) { + ; +{{compose-type-inner}} + } else + throw new Error("Unhandled type: "+type.fhirType()); + } + +} + diff --git a/org.hl7.fhir.core.generator/configuration/ManifestResourceComponent.java b/org.hl7.fhir.core.generator/configuration/ManifestResourceComponent.java new file mode 100644 index 000000000..b13fc97cc --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/ManifestResourceComponent.java @@ -0,0 +1 @@ + diff --git a/org.hl7.fhir.core.generator/configuration/Meta.java b/org.hl7.fhir.core.generator/configuration/Meta.java new file mode 100644 index 000000000..7137bf15b --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/Meta.java @@ -0,0 +1,38 @@ + /** + * Convenience method which adds a tag + * + * @param theSystem The code system + * @param theCode The code + * @param theDisplay The display name + * @return Returns a reference to this for easy chaining + */ + public Meta addTag(String theSystem, String theCode, String theDisplay) { + addTag().setSystem(theSystem).setCode(theCode).setDisplay(theDisplay); + return this; + } + + /** + * Returns the first tag (if any) that has the given system and code, or returns + * null if none + */ + public Coding getTag(String theSystem, String theCode) { + for (Coding next : getTag()) { + if (ca.uhn.fhir.util.ObjectUtil.equals(next.getSystem(), theSystem) && ca.uhn.fhir.util.ObjectUtil.equals(next.getCode(), theCode)) { + return next; + } + } + return null; + } + + /** + * Returns the first security label (if any) that has the given system and code, or returns + * null if none + */ + public Coding getSecurity(String theSystem, String theCode) { + for (Coding next : getTag()) { + if (ca.uhn.fhir.util.ObjectUtil.equals(next.getSystem(), theSystem) && ca.uhn.fhir.util.ObjectUtil.equals(next.getCode(), theCode)) { + return next; + } + } + return null; + } diff --git a/org.hl7.fhir.core.generator/configuration/Parameters.java b/org.hl7.fhir.core.generator/configuration/Parameters.java new file mode 100644 index 000000000..8b3c796a8 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/Parameters.java @@ -0,0 +1,93 @@ + + public Parameters addParameter(String name, boolean b) { + addParameter().setName(name).setValue(new BooleanType(b)); + return this; + } + + public Parameters addParameter(String name, String s) { + if (s != null) + addParameter().setName(name).setValue(new StringType(s)); + return this; + } + + public Parameters addParameter(String name, DataType v) { + if (v != null) + addParameter().setName(name).setValue(v); + return this; + } + + public Parameters setParameter(String name, boolean b) { + for (ParametersParameterComponent p : getParameter()) { + if (p.getName().equals(name)) { + p.setValue(new BooleanType(b)); + return this; + } + } + addParameter().setName(name).setValue(new BooleanType(b)); + return this; + } + + public Parameters setParameter(String name, String s) { + if (s != null) { + for (ParametersParameterComponent p : getParameter()) { + if (p.getName().equals(name)) { + p.setValue(new StringType(s)); + return this; + } + } + addParameter().setName(name).setValue(new StringType(s)); + } + return this; + } + + public Parameters setParameter(String name, DataType v) { + if (v != null) { + for (ParametersParameterComponent p : getParameter() ) { + if (p.getName().equals(name)) { + p.setValue(v); + return this; + } + } + addParameter().setName(name).setValue(v); + } + return this; + } + + public boolean hasParameter(String name) { + for (ParametersParameterComponent p : getParameter()) { + if (p.getName().equals(name)) + return true; + } + return false; + } + + public DataType getParameter(String name) { + for (ParametersParameterComponent p : getParameter()) { + if (p.getName().equals(name)) + return p.getValue(); + } + return null; + } + + public List getParameters(String name) { + List res = new ArrayList<>(); + for (ParametersParameterComponent p : getParameter()) { + if (p.getName().equals(name)) + res.add(p.getValue()); + } + return res; + } + + + public boolean getParameterBool(String name) { + for (ParametersParameterComponent p : getParameter()) { + if (p.getName().equals(name)) { + if (p.getValue() instanceof BooleanType) + return ((BooleanType) p.getValue()).booleanValue(); + boolean ok = Boolean.getBoolean(p.getValue().primitiveValue()); + return ok; + } + } + return false; + } + diff --git a/org.hl7.fhir.core.generator/configuration/Period.java b/org.hl7.fhir.core.generator/configuration/Period.java new file mode 100644 index 000000000..6960e6279 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/Period.java @@ -0,0 +1,26 @@ + /** + * Sets the value for start () + * + *

+ * Definition: + * The start of the period. The boundary is inclusive. + *

+ */ + public Period setStart( Date theDate, TemporalPrecisionEnum thePrecision) { + start = new DateTimeType(theDate, thePrecision); + return this; + } + + /** + * Sets the value for end () + * + *

+ * Definition: + * The end of the period. The boundary is inclusive. + *

+ */ + public Period setEnd( Date theDate, TemporalPrecisionEnum thePrecision) { + end = new DateTimeType(theDate, thePrecision); + return this; + } + diff --git a/org.hl7.fhir.core.generator/configuration/Quantity.java b/org.hl7.fhir.core.generator/configuration/Quantity.java new file mode 100644 index 000000000..c8a29e6bf --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/Quantity.java @@ -0,0 +1,40 @@ + + @Override + public String getVersion() { + return null; + } + + @Override + public boolean hasVersion() { + return false; + } + + @Override + public boolean supportsVersion() { + return false; + } + + @Override + public String getDisplay() { + return null; + } + + @Override + public boolean hasDisplay() { + return false; + } + + @Override + public boolean supportsDisplay() { + return false; + } + + public static Quantity fromUcum(String v, String code) { + Quantity res = new Quantity(); + res.setValue(new BigDecimal(v)); + res.setSystem("http://unitsofmeasure.org"); + res.setCode(code); + return res; + } + + diff --git a/org.hl7.fhir.core.generator/configuration/Questionnaire.java b/org.hl7.fhir.core.generator/configuration/Questionnaire.java new file mode 100644 index 000000000..430eaf1b0 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/Questionnaire.java @@ -0,0 +1,23 @@ + + public QuestionnaireItemComponent getQuestion(String linkId) { + if (linkId == null) + return null; + for (QuestionnaireItemComponent i : getItem()) { + if (i.getLinkId().equals(linkId)) + return i; + QuestionnaireItemComponent t = i.getQuestion(linkId); + if (t != null) + return t; + } + return null; + } + + public QuestionnaireItemComponent getCommonGroup(QuestionnaireItemComponent q1, QuestionnaireItemComponent q2) { + for (QuestionnaireItemComponent i : getItem()) { + QuestionnaireItemComponent t = i.getCommonGroup(q1, q2); + if (t != null) + return t; + } + return null; + } + diff --git a/org.hl7.fhir.core.generator/configuration/QuestionnaireItemComponent.java b/org.hl7.fhir.core.generator/configuration/QuestionnaireItemComponent.java new file mode 100644 index 000000000..0bdd42014 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/QuestionnaireItemComponent.java @@ -0,0 +1,37 @@ + + public QuestionnaireItemComponent getQuestion(String linkId) { + if (linkId == null) + return null; + for (QuestionnaireItemComponent i : getItem()) { + if (i.getLinkId().equals(linkId)) + return i; + QuestionnaireItemComponent t = i.getQuestion(linkId); + if (t != null) + return t; + } + return null; + } + + public QuestionnaireItemComponent getCommonGroup(QuestionnaireItemComponent q1, QuestionnaireItemComponent q2) { + if (q1 == null || q2 == null) + return null; + for (QuestionnaireItemComponent i : getItem()) { + QuestionnaireItemComponent t = i.getCommonGroup(q1, q2); + if (t != null) + return t; + } + if (containsQuestion(q1) && containsQuestion(q2)) + return this; + return null; + } + + public boolean containsQuestion(QuestionnaireItemComponent q) { + if (q == this) + return true; + for (QuestionnaireItemComponent i : getItem()) { + if (i.containsQuestion(q)) + return true; + } + return false; + } + diff --git a/org.hl7.fhir.core.generator/configuration/RdfParser.java b/org.hl7.fhir.core.generator/configuration/RdfParser.java new file mode 100644 index 000000000..85549b02d --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/RdfParser.java @@ -0,0 +1,270 @@ +package org.hl7.fhir.r5.formats; + + +// generated + +{{license}} + +{{startMark}} + +import org.hl7.fhir.r5.model.*; +import org.hl7.fhir.utilities.Utilities; +import org.hl7.fhir.exceptions.FHIRFormatError; +import org.hl7.fhir.exceptions.FHIRException; +import org.hl7.fhir.r5.utils.formats.Turtle.Complex; +import java.io.IOException; + +public class RdfParser extends RdfParserBase { + + public RdfParser() { + super(); + } + + public RdfParser(boolean allowUnknownContent) { + super(); + setAllowUnknownContent(allowUnknownContent); + } + + private void composeEnum(Complex parent, String parentType, String name, Enumeration value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + decorateCode(t, value); + } + + + protected void composeDate(Complex parent, String parentType, String name, DateType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composeDateTime(Complex parent, String parentType, String name, DateTimeType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composeCode(Complex parent, String parentType, String name, CodeType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + decorateCode(t, value); + } + + protected void composeString(Complex parent, String parentType, String name, StringType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composeInteger(Complex parent, String parentType, String name, IntegerType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composeInteger64(Complex parent, String parentType, String name, Integer64Type value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composeOid(Complex parent, String parentType, String name, OidType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composeCanonical(Complex parent, String parentType, String name, CanonicalType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composeUri(Complex parent, String parentType, String name, UriType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composeUuid(Complex parent, String parentType, String name, UuidType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composeUrl(Complex parent, String parentType, String name, UrlType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composeInstant(Complex parent, String parentType, String name, InstantType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composeBoolean(Complex parent, String parentType, String name, BooleanType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composeBase64Binary(Complex parent, String parentType, String name, Base64BinaryType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composeUnsignedInt(Complex parent, String parentType, String name, UnsignedIntType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composeMarkdown(Complex parent, String parentType, String name, MarkdownType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composeTime(Complex parent, String parentType, String name, TimeType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composeId(Complex parent, String parentType, String name, IdType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composePositiveInt(Complex parent, String parentType, String name, PositiveIntType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + + protected void composeDecimal(Complex parent, String parentType, String name, DecimalType value, int index) { + if (value == null) + return; + Complex t = parent.predicate("fhir:"+parentType+"."+name); + t.predicate("fhir:value", ttlLiteral(value.asStringValue())); + composeElement(t, parentType, name, value, index); + } + +{{composer}} + + + @Override + protected void composeResource(Complex parent, Resource resource) { + if (parent == null) { + throw new Error("parent == null"); + } else if (resource == null) { + throw new Error("resource == null"); +{{compose-resource}} + } else { + throw new Error("Unhandled resource type "+resource.getClass().getName()); + } + } + + protected void composeType(Complex parent, String parentType, String name, DataType value, int index) { + if (parent == null) { + throw new Error("parent == null"); + } else if (parentType == null) { + throw new Error("parentType == null"); + } else if (name == null) { + throw new Error("name == null"); + } else if (value == null) { + throw new Error("value == null"); + } else if (value instanceof DateType) { + composeDate(parent, parentType, name, (DateType)value, index); + } else if (value instanceof DateTimeType) { + composeDateTime(parent, parentType, name, (DateTimeType)value, index); + } else if (value instanceof CodeType) { + composeCode(parent, parentType, name, (CodeType)value, index); + } else if (value instanceof StringType) { + composeString(parent, parentType, name, (StringType)value, index); + } else if (value instanceof IntegerType) { + composeInteger(parent, parentType, name, (IntegerType)value, index); + } else if (value instanceof Integer64Type) { + composeInteger64(parent, parentType, name, (Integer64Type)value, index); + } else if (value instanceof OidType) { + composeOid(parent, parentType, name, (OidType)value, index); + } else if (value instanceof CanonicalType) { + composeCanonical(parent, parentType, name, (CanonicalType)value, index); + } else if (value instanceof UriType) { + composeUri(parent, parentType, name, (UriType)value, index); + } else if (value instanceof UuidType) { + composeUuid(parent, parentType, name, (UuidType)value, index); + } else if (value instanceof UrlType) { + composeUrl(parent, parentType, name, (UrlType)value, index); + } else if (value instanceof InstantType) { + composeInstant(parent, parentType, name, (InstantType)value, index); + } else if (value instanceof BooleanType) { + composeBoolean(parent, parentType, name, (BooleanType)value, index); + } else if (value instanceof Base64BinaryType) { + composeBase64Binary(parent, parentType, name, (Base64BinaryType)value, index); + } else if (value instanceof UnsignedIntType) { + composeUnsignedInt(parent, parentType, name, (UnsignedIntType)value, index); + } else if (value instanceof MarkdownType) { + composeMarkdown(parent, parentType, name, (MarkdownType)value, index); + } else if (value instanceof TimeType) { + composeTime(parent, parentType, name, (TimeType)value, index); + } else if (value instanceof IdType) { + composeId(parent, parentType, name, (IdType)value, index); + } else if (value instanceof PositiveIntType) { + composePositiveInt(parent, parentType, name, (PositiveIntType)value, index); + } else if (value instanceof DecimalType) { + composeDecimal(parent, parentType, name, (DecimalType)value, index); +{{compose-type}} + } else { + throw new Error("Unhandled type"); + } + } + +} + diff --git a/org.hl7.fhir.core.generator/configuration/Reference.java b/org.hl7.fhir.core.generator/configuration/Reference.java new file mode 100644 index 000000000..9fc8b8c0c --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/Reference.java @@ -0,0 +1,28 @@ + + @Override + public String toString() { + if (hasReference()) + return "Reference["+getReference()+"]"; + if (hasIdentifier()) + return "Reference[id:"+getIdentifier()+"]"; + if (hasDisplay()) + return "Reference['"+getDisplay()+"']"; + return "Reference[??]"; + } + + /** + * Convenience setter which sets the reference to the complete {@link IIdType#getValue() value} of the given + * reference. + * + * @param theReference The reference, or null + * @return + * @return Returns a reference to this + */ + public Reference setReferenceElement(IIdType theReference) { + if (theReference != null) { + setReference(theReference.getValue()); + } else { + setReference(null); + } + return this; + } diff --git a/org.hl7.fhir.core.generator/configuration/Resource.java b/org.hl7.fhir.core.generator/configuration/Resource.java new file mode 100644 index 000000000..d10c46a52 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/Resource.java @@ -0,0 +1,16 @@ + + @Override + public String getIdBase() { + return getId(); + } + + @Override + public void setIdBase(String value) { + setId(value); + } + public abstract ResourceType getResourceType(); + + public String getLanguage(String defValue) { + return hasLanguage() ? getLanguage() : defValue; + } + diff --git a/org.hl7.fhir.core.generator/configuration/ResourceFactory.java b/org.hl7.fhir.core.generator/configuration/ResourceFactory.java new file mode 100644 index 000000000..e35598735 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/ResourceFactory.java @@ -0,0 +1,91 @@ +package org.hl7.fhir.r5.model; + +{{license}} + +{{startMark}} + +import org.hl7.fhir.exceptions.FHIRException; + +public class ResourceFactory extends Factory { + + public static Resource createResource(String name) throws FHIRException { +{{resource-factory}} + else + throw new FHIRException("Unknown Resource Name '"+name+"'"); + } + + public static Element createType(String name) throws FHIRException { + if ("base64Binary".equals(name)) + return new Base64BinaryType(); + if ("boolean".equals(name)) + return new BooleanType(); + if ("canonical".equals(name)) + return new CanonicalType(); + if ("code".equals(name)) + return new CodeType(); + if ("date".equals(name)) + return new DateType(); + if ("dateTime".equals(name)) + return new DateTimeType(); + if ("decimal".equals(name)) + return new DecimalType(); + if ("id".equals(name)) + return new IdType(); + if ("instant".equals(name)) + return new InstantType(); + if ("integer".equals(name)) + return new IntegerType(); + if ("integer64".equals(name)) + return new Integer64Type(); + if ("markdown".equals(name)) + return new MarkdownType(); + if ("oid".equals(name)) + return new OidType(); + if ("positiveInt".equals(name)) + return new PositiveIntType(); + if ("string".equals(name)) + return new StringType(); + if ("time".equals(name)) + return new TimeType(); + if ("unsignedInt".equals(name)) + return new UnsignedIntType(); + if ("uri".equals(name)) + return new UriType(); + if ("url".equals(name)) + return new UrlType(); + if ("uuid".equals(name)) + return new UuidType(); +{{type-factory}} + else + throw new FHIRException("Unknown Type Name '"+name+"'"); } + + public static Base createResourceOrType(String name) throws FHIRException { + switch (name.hashCode()) { + case -1216012752: return new Base64BinaryType(); + case 64711720: return new BooleanType(); + case 828351732: return new CanonicalType(); + case 3059181: return new CodeType(); + case 3076014: return new DateType(); + case 1792749467: return new DateTimeType(); + case 1542263633: return new DecimalType(); + case 3355: return new IdType(); + case 1957570017: return new InstantType(); + case 1958052158: return new IntegerType(); + case 246938863: return new MarkdownType(); + case 110026: return new OidType(); + case -131262666: return new PositiveIntType(); + case -891985903: return new StringType(); + case 3560141: return new TimeType(); + case 1145198778: return new UnsignedIntType(); + case 116076: return new UriType(); + case 116079: return new UrlType(); + case 3601339: return new UuidType(); +{{case-factory}} + default: + throw new FHIRException("Unknown Resource or Type Name '"+name+"'"); + } + } + + +} + diff --git a/org.hl7.fhir.core.generator/configuration/StructureDefinition.java b/org.hl7.fhir.core.generator/configuration/StructureDefinition.java new file mode 100644 index 000000000..3b2f08ee2 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/StructureDefinition.java @@ -0,0 +1,14 @@ + + public String describeType() { + if ("Extension".equals(getType())) + return "Extension" ; + switch (getKind()) { + case COMPLEXTYPE: return getDerivation() == TypeDerivationRule.CONSTRAINT ? "DataType Constraint" : "DataType" ; + case LOGICAL: return getDerivation() == TypeDerivationRule.CONSTRAINT ? "Logical Model" : "Logical Model Profile"; + case PRIMITIVETYPE: return getDerivation() == TypeDerivationRule.CONSTRAINT ? "PrimitiveType Constraint" : "PrimitiveType"; + case RESOURCE: return getDerivation() == TypeDerivationRule.CONSTRAINT ? "Resource Profile" : "Resource"; + default: + return "Definition"; + } + } + diff --git a/org.hl7.fhir.core.generator/configuration/StructureMap.java b/org.hl7.fhir.core.generator/configuration/StructureMap.java new file mode 100644 index 000000000..9fcaf95c2 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/StructureMap.java @@ -0,0 +1,5 @@ + + public String toString() { + return StructureMapUtilities.render(this); + } + diff --git a/org.hl7.fhir.core.generator/configuration/StructureMapGroupComponent.java b/org.hl7.fhir.core.generator/configuration/StructureMapGroupComponent.java new file mode 100644 index 000000000..546498440 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/StructureMapGroupComponent.java @@ -0,0 +1,5 @@ + + public String toString() { + return StructureMapUtilities.groupToString(this); + } + diff --git a/org.hl7.fhir.core.generator/configuration/StructureMapGroupRuleComponent.java b/org.hl7.fhir.core.generator/configuration/StructureMapGroupRuleComponent.java new file mode 100644 index 000000000..cb894cce8 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/StructureMapGroupRuleComponent.java @@ -0,0 +1,5 @@ + + public String toString() { + return StructureMapUtilities.ruleToString(this); + } + diff --git a/org.hl7.fhir.core.generator/configuration/StructureMapGroupRuleSourceComponent.java b/org.hl7.fhir.core.generator/configuration/StructureMapGroupRuleSourceComponent.java new file mode 100644 index 000000000..e730d7a9e --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/StructureMapGroupRuleSourceComponent.java @@ -0,0 +1,5 @@ + + public String toString() { + return StructureMapUtilities.sourceToString(this); + } + diff --git a/org.hl7.fhir.core.generator/configuration/StructureMapGroupRuleTargetComponent.java b/org.hl7.fhir.core.generator/configuration/StructureMapGroupRuleTargetComponent.java new file mode 100644 index 000000000..6c8599afe --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/StructureMapGroupRuleTargetComponent.java @@ -0,0 +1,5 @@ + + public String toString() { + return StructureMapUtilities.targetToString(this); + } + diff --git a/org.hl7.fhir.core.generator/configuration/StructureMapGroupRuleTargetParameterComponent.java b/org.hl7.fhir.core.generator/configuration/StructureMapGroupRuleTargetParameterComponent.java new file mode 100644 index 000000000..a9ff001b3 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/StructureMapGroupRuleTargetParameterComponent.java @@ -0,0 +1,6 @@ + + public String toString() { + return value == null ? "null!" : value.toString(); + } + + diff --git a/org.hl7.fhir.core.generator/configuration/TypeRefComponent.java b/org.hl7.fhir.core.generator/configuration/TypeRefComponent.java new file mode 100644 index 000000000..136ba900d --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/TypeRefComponent.java @@ -0,0 +1,74 @@ + + public boolean hasTarget() { + return Utilities.existsInList(getCode(), "Reference", "canonical", "CodeableReference"); + } + + /** + * This code checks for the system prefix and returns the FHIR type + * + * @return + */ + public String getWorkingCode() { + if (hasExtension(ToolingExtensions.EXT_FHIR_TYPE)) + return getExtensionString(ToolingExtensions.EXT_FHIR_TYPE); + if (!hasCodeElement()) + return null; + if (getCodeElement().hasExtension(ToolingExtensions.EXT_XML_TYPE)) { + String s = getCodeElement().getExtensionString(ToolingExtensions.EXT_XML_TYPE); + if ("xsd:gYear OR xsd:gYearMonth OR xsd:date OR xsd:dateTime".equalsIgnoreCase(s)) + return "dateTime"; + if ("xsd:gYear OR xsd:gYearMonth OR xsd:date".equalsIgnoreCase(s)) + return "date"; + if ("xsd:dateTime".equalsIgnoreCase(s)) + return "instant"; + if ("xsd:token".equals(s)) + return "code"; + if ("xsd:boolean".equals(s)) + return "boolean"; + if ("xsd:string".equals(s)) + return "string"; + if ("xsd:time".equals(s)) + return "time"; + if ("xsd:int".equals(s)) + return "integer"; + if ("xsd:decimal OR xsd:double".equals(s)) + return "decimal"; + if ("xsd:decimal".equalsIgnoreCase(s)) + return "decimal"; + if ("xsd:base64Binary".equalsIgnoreCase(s)) + return "base64Binary"; + if ("xsd:positiveInteger".equalsIgnoreCase(s)) + return "positiveInt"; + if ("xsd:nonNegativeInteger".equalsIgnoreCase(s)) + return "unsignedInt"; + if ("xsd:anyURI".equalsIgnoreCase(s)) + return "uri"; + + throw new Error("Unknown xml type '"+s+"'"); + } + return getCode(); + } + + @Override + public String toString() { + String res = getCode(); + if (hasProfile()) { + res = res + "{"; + boolean first = true; + for (CanonicalType s : getProfile()) { + if (first) first = false; else res = res + "|"; + res = res + s.getValue(); + } + res = res + "}"; + } + if (hasTargetProfile()) { + res = res + "->("; + boolean first = true; + for (CanonicalType s : getProfile()) { + if (first) first = false; else res = res + "|"; + res = res + s.getValue(); + } + res = res + ")"; + } + return res; + } diff --git a/org.hl7.fhir.core.generator/configuration/XmlParser.java b/org.hl7.fhir.core.generator/configuration/XmlParser.java new file mode 100644 index 000000000..f9dacdc96 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/XmlParser.java @@ -0,0 +1,922 @@ +package org.hl7.fhir.r5.formats; + + +// generated + +{{license}} + +{{startMark}} + +import org.hl7.fhir.r5.model.*; +import org.hl7.fhir.r5.model.Enumerations.FHIRVersion; +import org.xmlpull.v1.*; +import org.hl7.fhir.utilities.Utilities; +import org.hl7.fhir.exceptions.FHIRFormatError; +import org.hl7.fhir.exceptions.FHIRException; +import java.io.IOException; + +public class XmlParser extends XmlParserBase { + + public XmlParser() { + super(); + } + + public XmlParser(boolean allowUnknownContent) { + super(); + setAllowUnknownContent(allowUnknownContent); + } + + protected boolean parseBaseContent(int eventType, XmlPullParser xpp, Base res) throws XmlPullParserException, IOException, FHIRFormatError { + return false; + } + + @SuppressWarnings("unchecked") + protected > Enumeration parseEnumeration(XmlPullParser xpp, E item, EnumFactory e) throws XmlPullParserException, IOException, FHIRFormatError { + Enumeration res = new Enumeration(e); + parseElementAttributes(xpp, res); + res.setValue((E) e.fromCode(xpp.getAttributeValue(null, "value"))); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected DateType parseDate(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + DateType res = new DateType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected DateTimeType parseDateTime(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + DateTimeType res = new DateTimeType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected CodeType parseCode(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + CodeType res = new CodeType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected StringType parseString(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + StringType res = new StringType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected IntegerType parseInteger(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + IntegerType res = new IntegerType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected Integer64Type parseInteger64(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + Integer64Type res = new Integer64Type(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected OidType parseOid(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + OidType res = new OidType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected CanonicalType parseCanonical(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + CanonicalType res = new CanonicalType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected UriType parseUri(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + UriType res = new UriType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected UuidType parseUuid(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + UuidType res = new UuidType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected UrlType parseUrl(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + UrlType res = new UrlType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected InstantType parseInstant(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + InstantType res = new InstantType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected BooleanType parseBoolean(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + BooleanType res = new BooleanType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected Base64BinaryType parseBase64Binary(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + Base64BinaryType res = new Base64BinaryType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected UnsignedIntType parseUnsignedInt(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + UnsignedIntType res = new UnsignedIntType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected MarkdownType parseMarkdown(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + MarkdownType res = new MarkdownType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected TimeType parseTime(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + TimeType res = new TimeType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected IdType parseId(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + IdType res = new IdType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected PositiveIntType parsePositiveInt(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + PositiveIntType res = new PositiveIntType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + + protected DecimalType parseDecimal(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + DecimalType res = new DecimalType(xpp.getAttributeValue(null, "value")); + parseElementAttributes(xpp, res); + next(xpp); + int eventType = nextNoWhitespace(xpp); + while (eventType != XmlPullParser.END_TAG) { + if (!parseElementContent(eventType, xpp, res)) + unknownContent(xpp); + eventType = nextNoWhitespace(xpp); + } + next(xpp); + parseElementClose(res); + return res; + } + +{{parser}} + + @Override + protected Resource parseResource(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + if (xpp == null) { + throw new IOException("xpp == null!"); +{{parse-resource}} + } else { + throw new FHIRFormatError("Unknown resource type "+xpp.getName()+""); + } + } + + protected DataType parseType(String prefix, XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError { + if (prefix == null) { + throw new IOException("prefix == null!"); + } else if (xpp == null) { + throw new IOException("xpp == null!"); + } else if (xpp.getName().equals(prefix+"date")) { + return parseDate(xpp); + } else if (xpp.getName().equals(prefix+"dateTime")) { + return parseDateTime(xpp); + } else if (xpp.getName().equals(prefix+"code")) { + return parseCode(xpp); + } else if (xpp.getName().equals(prefix+"string")) { + return parseString(xpp); + } else if (xpp.getName().equals(prefix+"integer")) { + return parseInteger(xpp); + } else if (xpp.getName().equals(prefix+"integer64")) { + return parseInteger64(xpp); + } else if (xpp.getName().equals(prefix+"oid")) { + return parseOid(xpp); + } else if (xpp.getName().equals(prefix+"canonical")) { + return parseCanonical(xpp); + } else if (xpp.getName().equals(prefix+"uri")) { + return parseUri(xpp); + } else if (xpp.getName().equals(prefix+"uuid")) { + return parseUuid(xpp); + } else if (xpp.getName().equals(prefix+"url")) { + return parseUrl(xpp); + } else if (xpp.getName().equals(prefix+"instant")) { + return parseInstant(xpp); + } else if (xpp.getName().equals(prefix+"boolean")) { + return parseBoolean(xpp); + } else if (xpp.getName().equals(prefix+"base64Binary")) { + return parseBase64Binary(xpp); + } else if (xpp.getName().equals(prefix+"unsignedInt")) { + return parseUnsignedInt(xpp); + } else if (xpp.getName().equals(prefix+"markdown")) { + return parseMarkdown(xpp); + } else if (xpp.getName().equals(prefix+"time")) { + return parseTime(xpp); + } else if (xpp.getName().equals(prefix+"id")) { + return parseId(xpp); + } else if (xpp.getName().equals(prefix+"positiveInt")) { + return parsePositiveInt(xpp); + } else if (xpp.getName().equals(prefix+"decimal")) { + return parseDecimal(xpp); +{{parse-type-prefix}} + } else { + throw new FHIRFormatError("Unknown type "+xpp.getName()); + } + } + + protected DataType parseType(XmlPullParser xpp, String type) throws XmlPullParserException, IOException, FHIRFormatError { + if (type == null) { + throw new IOException("type == null!"); + } else if (xpp == null) { + throw new IOException("xpp == null!"); + } else if (type.equals("date")) { + return parseDate(xpp); + } else if (type.equals("dateTime")) { + return parseDateTime(xpp); + } else if (type.equals("code")) { + return parseCode(xpp); + } else if (type.equals("string")) { + return parseString(xpp); + } else if (type.equals("integer")) { + return parseInteger(xpp); + } else if (type.equals("integer64")) { + return parseInteger64(xpp); + } else if (type.equals("oid")) { + return parseOid(xpp); + } else if (type.equals("canonical")) { + return parseCanonical(xpp); + } else if (type.equals("uri")) { + return parseUri(xpp); + } else if (type.equals("uuid")) { + return parseUuid(xpp); + } else if (type.equals("url")) { + return parseUrl(xpp); + } else if (type.equals("instant")) { + return parseInstant(xpp); + } else if (type.equals("boolean")) { + return parseBoolean(xpp); + } else if (type.equals("base64Binary")) { + return parseBase64Binary(xpp); + } else if (type.equals("unsignedInt")) { + return parseUnsignedInt(xpp); + } else if (type.equals("markdown")) { + return parseMarkdown(xpp); + } else if (type.equals("time")) { + return parseTime(xpp); + } else if (type.equals("id")) { + return parseId(xpp); + } else if (type.equals("positiveInt")) { + return parsePositiveInt(xpp); + } else if (type.equals("decimal")) { + return parseDecimal(xpp); +{{parse-type}} + } else { + throw new FHIRFormatError("Unknown type "+type); + } + } + + public Base parseFragment(XmlPullParser xpp, String type) throws XmlPullParserException, IOException, FHIRFormatError { + if (type == null) { + throw new IOException("type == null!"); + } else if (xpp == null) { + throw new IOException("xpp == null!"); +{{parse-fragment}} + } else if (type.equals("date")) { + return parseDate(xpp); + } else if (type.equals("dateTime")) { + return parseDateTime(xpp); + } else if (type.equals("code")) { + return parseCode(xpp); + } else if (type.equals("string")) { + return parseString(xpp); + } else if (type.equals("integer")) { + return parseInteger(xpp); + } else if (type.equals("integer64")) { + return parseInteger64(xpp); + } else if (type.equals("oid")) { + return parseOid(xpp); + } else if (type.equals("canonical")) { + return parseCanonical(xpp); + } else if (type.equals("uri")) { + return parseUri(xpp); + } else if (type.equals("uuid")) { + return parseUuid(xpp); + } else if (type.equals("url")) { + return parseUrl(xpp); + } else if (type.equals("instant")) { + return parseInstant(xpp); + } else if (type.equals("boolean")) { + return parseBoolean(xpp); + } else if (type.equals("base64Binary")) { + return parseBase64Binary(xpp); + } else if (type.equals("unsignedInt")) { + return parseUnsignedInt(xpp); + } else if (type.equals("markdown")) { + return parseMarkdown(xpp); + } else if (type.equals("time")) { + return parseTime(xpp); + } else if (type.equals("id")) { + return parseId(xpp); + } else if (type.equals("positiveInt")) { + return parsePositiveInt(xpp); + } else if (type.equals("decimal")) { + return parseDecimal(xpp); + } else { + throw new FHIRFormatError("Unknown type "+type); + } + } + + private boolean nameIsTypeName(XmlPullParser xpp, String prefix) throws IOException { + if (prefix == null) { + throw new IOException("prefix == null!"); + } else if (xpp == null) { + throw new IOException("xpp == null!"); +{{check-type}} + } else if (xpp.getName().equals(prefix+"Date")) { + return true; + } else if (xpp.getName().equals(prefix+"DateTime")) { + return true; + } else if (xpp.getName().equals(prefix+"Code")) { + return true; + } else if (xpp.getName().equals(prefix+"String")) { + return true; + } else if (xpp.getName().equals(prefix+"Integer")) { + return true; + } else if (xpp.getName().equals(prefix+"Integer64")) { + return true; + } else if (xpp.getName().equals(prefix+"Oid")) { + return true; + } else if (xpp.getName().equals(prefix+"Canonical")) { + return true; + } else if (xpp.getName().equals(prefix+"Uri")) { + return true; + } else if (xpp.getName().equals(prefix+"Uuid")) { + return true; + } else if (xpp.getName().equals(prefix+"Url")) { + return true; + } else if (xpp.getName().equals(prefix+"Instant")) { + return true; + } else if (xpp.getName().equals(prefix+"Boolean")) { + return true; + } else if (xpp.getName().equals(prefix+"Base64Binary")) { + return true; + } else if (xpp.getName().equals(prefix+"UnsignedInt")) { + return true; + } else if (xpp.getName().equals(prefix+"Markdown")) { + return true; + } else if (xpp.getName().equals(prefix+"Time")) { + return true; + } else if (xpp.getName().equals(prefix+"Id")) { + return true; + } else if (xpp.getName().equals(prefix+"PositiveInt")) { + return true; + } else if (xpp.getName().equals(prefix+"Decimal")) { + return true; + } else { + return false; + } + } + + @Override + protected DataType parseAnyType(XmlPullParser xpp, String type) throws XmlPullParserException, IOException, FHIRFormatError { + return parseType(xpp, type); + } + + +//----------------- Composer ------------------------------------------------------------------------------------------- + + protected > void composeEnumeration(String name, Enumeration value, EnumFactory e) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || value.getValue() != null)) { + composeElementAttributes(value); + if (value.getValue() != null) + xml.attribute("value", e.toCode(value.getValue())); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeDate(String name, DateType value) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || value.getValue() != null)) {// date + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeDateTime(String name, DateTimeType value) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || value.getValue() != null)) {// dateTime + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeCode(String name, CodeType value) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || !Utilities.noString(value.getValue()))) {// code + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeString(String name, StringType value) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || !Utilities.noString(value.getValue()))) {// string + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeInteger(String name, IntegerType value) throws IOException { + if (value != null) { // integer + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeInteger64(String name, Integer64Type value) throws IOException { + if (value != null) { // integer + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeOid(String name, OidType value) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || !Utilities.noString(value.getValue()))) {// oid + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeCanonical(String name, CanonicalType value) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || !Utilities.noString(value.getValue()))) {// canonical + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeUri(String name, UriType value) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || value.getValue() != null)) {// uri + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeUuid(String name, UuidType value) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || !Utilities.noString(value.getValue()))) {// uuid + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeUrl(String name, UrlType value) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || !Utilities.noString(value.getValue()))) {// url + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeInstant(String name, InstantType value) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || value.getValue() != null)) {// instant + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeBoolean(String name, BooleanType value) throws IOException { + if (value != null) { // boolean + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeBase64Binary(String name, Base64BinaryType value) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || value.getValue() != null)) {// base64Binary + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeUnsignedInt(String name, UnsignedIntType value) throws IOException { + if (value != null) { // unsignedInt + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeMarkdown(String name, MarkdownType value) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || !Utilities.noString(value.getValue()))) {// markdown + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeTime(String name, TimeType value) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || !Utilities.noString(value.getValue()))) {// time + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeId(String name, IdType value) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || !Utilities.noString(value.getValue()))) {// id + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composePositiveInt(String name, PositiveIntType value) throws IOException { + if (value != null) { // positiveInt + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + + protected void composeDecimal(String name, DecimalType value) throws IOException { + if (value != null && (!Utilities.noString(value.getId()) || ExtensionHelper.hasExtensions(value) || value.getValue() != null)) {// decimal + composeElementAttributes(value); + if (value.asStringValue() != null) + xml.attribute("value", value.asStringValue()); + + xml.enter(FHIR_NS, name); + composeElementElements(value); + composeElementClose(value); + xml.exit(FHIR_NS, name); + } + } + +{{composer}} + + @Override + protected void composeResource(Resource resource) throws IOException { + if (resource == null) { + throw new IOException("resource == null"); +{{compose-resource}} + } else { + throw new Error("Unhandled resource type "+resource.getClass().getName()); + } + } + + protected void composeResource(String name, Resource resource) throws IOException { + if (name == null) { + throw new IOException("name == null"); + } else if (resource == null) { + throw new IOException("resource == null"); +{{compose-resource-name}} + } else { + throw new Error("Unhandled resource type "+resource.getClass().getName()); + } + } + + protected void composeType(String prefix, DataType type) throws IOException { + if (prefix == null) { + throw new IOException("prefix == null"); + } else if (type == null) { + throw new IOException("type == null"); +{{compose-type}} + } else if (type instanceof CodeType) { + composeCode(prefix+"Code", (CodeType) type); + } else if (type instanceof OidType) { + composeOid(prefix+"Oid", (OidType) type); + } else if (type instanceof CanonicalType) { + composeCanonical(prefix+"Canonical", (CanonicalType) type); + } else if (type instanceof UuidType) { + composeUuid(prefix+"Uuid", (UuidType) type); + } else if (type instanceof UrlType) { + composeUrl(prefix+"Url", (UrlType) type); + } else if (type instanceof UnsignedIntType) { + composeUnsignedInt(prefix+"UnsignedInt", (UnsignedIntType) type); + } else if (type instanceof MarkdownType) { + composeMarkdown(prefix+"Markdown", (MarkdownType) type); + } else if (type instanceof IdType) { + composeId(prefix+"Id", (IdType) type); + } else if (type instanceof PositiveIntType) { + composePositiveInt(prefix+"PositiveInt", (PositiveIntType) type); + } else if (type instanceof DateType) { + composeDate(prefix+"Date", (DateType) type); + } else if (type instanceof DateTimeType) { + composeDateTime(prefix+"DateTime", (DateTimeType) type); + } else if (type instanceof StringType) { + composeString(prefix+"String", (StringType) type); + } else if (type instanceof IntegerType) { + composeInteger(prefix+"Integer", (IntegerType) type); + } else if (type instanceof Integer64Type) { + composeInteger64(prefix+"Integer64", (Integer64Type) type); + } else if (type instanceof UriType) { + composeUri(prefix+"Uri", (UriType) type); + } else if (type instanceof InstantType) { + composeInstant(prefix+"Instant", (InstantType) type); + } else if (type instanceof BooleanType) { + composeBoolean(prefix+"Boolean", (BooleanType) type); + } else if (type instanceof Base64BinaryType) { + composeBase64Binary(prefix+"Base64Binary", (Base64BinaryType) type); + } else if (type instanceof TimeType) { + composeTime(prefix+"Time", (TimeType) type); + } else if (type instanceof DecimalType) { + composeDecimal(prefix+"Decimal", (DecimalType) type); + } else { + throw new Error("Unhandled type "+type.fhirType()); + } + } + +} + diff --git a/org.hl7.fhir.core.generator/configuration/configuration.ini b/org.hl7.fhir.core.generator/configuration/configuration.ini new file mode 100644 index 000000000..1adf38b98 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/configuration.ini @@ -0,0 +1,50 @@ +[hierarchy] +Meta = extends DataType implements IBaseMetaType +Parameters = extends {{super}} implements IBaseParameters +DomainResource = extends {{super}} implements IBaseHasExtensions, IBaseHasModifierExtensions, IDomainResource +Bundle = extends {{super}} implements IBaseBundle +Reference = extends BaseReference implements IBaseReference, ICompositeType +Element = extends Base implements IBaseHasExtensions, IBaseElement +Resource = extends BaseResource implements IAnyResource +Quantity = extends {{super}} implements ICompositeType, ICoding +BackboneType = extends {{super}} implements IBaseBackboneElement +Extension = extends BaseExtension implements IBaseExtension, IBaseHasExtensions +BackboneElement = extends {{super}} implements IBaseBackboneElement +Coding = extends {{super}} implements IBaseCoding, ICompositeType, ICoding +Narrative = extends BaseNarrative implements INarrative +Expression = extends DataType implements ICompositeType +OperationOutcome = extends {{super}} implements IBaseOperationOutcome +CapabilityStatement = extends {{super}} implements IBaseConformance +CodeType = extends {{super}} implements ICoding +DataType = extends Element implements IBaseDatatype, IElement +Binary = extends BaseBinary implements IBaseBinary + +[imports] +Meta = org.hl7.fhir.instance.model.api.IBaseMetaType +DomainResource = java.util.Collections, org.hl7.fhir.instance.model.api.IDomainResource, org.hl7.fhir.instance.model.api.IBaseDatatypeElement, org.hl7.fhir.instance.model.api.IBaseHasExtensions, org.hl7.fhir.instance.model.api.IBaseHasModifierExtensions, org.hl7.fhir.instance.model.api.IBaseBackboneElement +Parameters = org.hl7.fhir.instance.model.api.IBaseParameters +Bundle = org.hl7.fhir.instance.model.api.IBaseBundle +Reference = org.hl7.fhir.instance.model.api.IAnyResource, org.hl7.fhir.instance.model.api.IBaseReference, org.hl7.fhir.instance.model.api.ICompositeType, org.hl7.fhir.instance.model.api.IIdType +Element = org.hl7.fhir.instance.model.api.IBaseElement, org.hl7.fhir.instance.model.api.IBaseHasExtensions +Resource = org.hl7.fhir.instance.model.api.IAnyResource +Period = ca.uhn.fhir.model.api.TemporalPrecisionEnum +Extension = org.hl7.fhir.instance.model.api.IBaseExtension, org.hl7.fhir.instance.model.api.IBaseDatatype, org.hl7.fhir.instance.model.api.IBaseHasExtensions +HumanName = ca.uhn.fhir.util.DatatypeUtil, org.hl7.fhir.instance.model.api.IPrimitiveType +StructureMap = org.hl7.fhir.r5.utils.StructureMapUtilities +Narrative = org.hl7.fhir.instance.model.api.INarrative +Coding = org.hl7.fhir.instance.model.api.IBaseCoding +OperationOutcome = org.hl7.fhir.instance.model.api.IBaseOperationOutcome +CapabilityStatement = org.hl7.fhir.instance.model.api.IBaseConformance +DataType = org.hl7.fhir.instance.model.api.IBaseDatatype, ca.uhn.fhir.model.api.IElement +ElementDefinition = org.hl7.fhir.instance.model.api.ICompositeType, org.hl7.fhir.r5.model.Enumerations.BindingStrength, org.hl7.fhir.r5.model.Enumerations.BindingStrengthEnumFactory, org.hl7.fhir.r5.utils.ToolingExtensions, org.hl7.fhir.instance.model.api.IBaseDatatypeElement, org.hl7.fhir.utilities.CommaSeparatedStringBuilder +Binary = org.hl7.fhir.instance.model.api.IBaseBinary + +[shared] +http://hl7.org/fhir/ValueSet/concept-map-relationship = true +http://hl7.org/fhir/ValueSet/type-restful-interaction = false +http://hl7.org/fhir/ValueSet/system-restful-interaction = false + +[typenames] +ValueSet.compose.include.filter = ConceptSetFilter +ValueSet.compose.include.concept.designation = ConceptReferenceDesignation +CodeSystem.concept.designation = ConceptDefinitionDesignation \ No newline at end of file diff --git a/org.hl7.fhir.core.generator/configuration/license.txt b/org.hl7.fhir.core.generator/configuration/license.txt new file mode 100644 index 000000000..110f0b2e5 --- /dev/null +++ b/org.hl7.fhir.core.generator/configuration/license.txt @@ -0,0 +1,47 @@ +/* + * #%L + * org.hl7.fhir.r5 + * %% + * Copyright (C) 2014 - 2019 Health Level 7 + * %% + * Licensed under the Apache License, Version 2.0 (the \"License\"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an \"AS IS\" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +/* + Copyright (c) 2011+, HL7, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, \ + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this \ + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, \ + this list of conditions and the following disclaimer in the documentation \ + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \ + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \ + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \ + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \ + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT \ + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR \ + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, \ + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \ + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \ + POSSIBILITY OF SUCH DAMAGE. + */ \ No newline at end of file diff --git a/org.hl7.fhir.core.generator/readme.md b/org.hl7.fhir.core.generator/readme.md new file mode 100644 index 000000000..0125e4bcb --- /dev/null +++ b/org.hl7.fhir.core.generator/readme.md @@ -0,0 +1,24 @@ +The Java Core Code Generator + +Note: This code only generates tje R5 java code. Older generated models are now maintained by hand. + +To run this code, run the class JavaCoreGenerator with 3 parameters: +* 1: fhir version to generate from (e.g. 4.1.0 or 'current' +* 2: project directory to read configuration and templates from - e.g. C:\work\org.hl7.fhir\org.hl7.fhir.core\org.hl7.fhir.core.generator\configuration +* 3: project directory to generate code into - e.g. C:\\work\\org.hl7.fhir\\org.hl7.fhir.core\\org.hl7.fhir.r5.new + +The generation process depends on the code it generates - do not regenerate the master R5 code until you have tested that it generates correctly. + +To test the generation: +* create a new project, copy the existing R5 code into it, and get it compiling +* make sure that project is not in the build path for the generator itself, which depends on the production R5 code +* run the generation +* refresh etc and make sure that the compiler is happy +* copy the JUnit tests ... + +Configuring the Generation + +The most common reason to alter the generation is to add additional utility routines/enhanceements to the generated classes. +To do this, edit on the one of the templates in the configuration directory - xx.java, where xx is the class name (may include +containing class). You may also need to add to the imports in the configuration.ini file. + diff --git a/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/JavaParserJsonGenerator.java b/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/JavaParserJsonGenerator.java index 5e54ce47f..4b10805ae 100644 --- a/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/JavaParserJsonGenerator.java +++ b/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/JavaParserJsonGenerator.java @@ -24,7 +24,7 @@ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGed. +POSSIBILITY OF SUCH DAMAGE. */ @@ -49,10 +49,9 @@ import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionKind; import org.hl7.fhir.r5.model.StructureDefinition.TypeDerivationRule; import org.hl7.fhir.utilities.Utilities; -import jdk.internal.org.objectweb.asm.tree.analysis.AnalyzerException; - public class JavaParserJsonGenerator extends JavaBaseGenerator { + private StringBuilder parser = new StringBuilder(); private StringBuilder pregt = new StringBuilder(); private StringBuilder pregt2 = new StringBuilder(); diff --git a/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/JavaParserRdfGenerator.java b/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/JavaParserRdfGenerator.java new file mode 100644 index 000000000..39bf9b0c5 --- /dev/null +++ b/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/JavaParserRdfGenerator.java @@ -0,0 +1,312 @@ +package org.hl7.fhir.core.generator.codegen; +/* +Copyright (c) 2011+, HL7, Inc +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + */ +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.hl7.fhir.core.generator.analysis.Analysis; +import org.hl7.fhir.core.generator.analysis.TypeInfo; +import org.hl7.fhir.core.generator.codegen.JavaBaseGenerator; +import org.hl7.fhir.core.generator.engine.Definitions; +import org.hl7.fhir.r5.model.ElementDefinition; +import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionKind; +import org.hl7.fhir.utilities.Utilities; + +public class JavaParserRdfGenerator extends JavaBaseGenerator { + +// private StringBuilder parser = new StringBuilder(); + private StringBuilder composer = new StringBuilder(); + private StringBuilder reg = new StringBuilder(); + private StringBuilder regt = new StringBuilder(); + + public JavaParserRdfGenerator(OutputStream out, Definitions definitions, Configuration configuration, Date genDate, String version) throws UnsupportedEncodingException { + super(out, definitions, configuration, version, genDate); + } + + public void seeClass(Analysis analysis) throws Exception { +// generateParser(analysis); + generateComposer(analysis); + if (!analysis.isAbstract()) { + if (analysis.getStructure().getKind() == StructureDefinitionKind.COMPLEXTYPE) { + regt.append(" } else if (value instanceof "+analysis.getClassName()+") {\r\n compose"+analysis.getClassName()+"(parent, parentType, name, ("+analysis.getClassName()+")value, index);\r\n"); + } + if (analysis.getStructure().getKind() == StructureDefinitionKind.RESOURCE) { + reg.append(" } else if (resource instanceof "+analysis.getClassName()+") {\r\n compose"+analysis.getClassName()+"(parent, null, \""+analysis.getName()+"\", ("+analysis.getClassName()+")resource, -1);\r\n"); + } + } + } + + public void generate() throws Exception { + String template = config.getAdornments().get("RdfParser"); + template = template.replace("{{license}}", config.getLicense()); + template = template.replace("{{startMark}}", startVMarkValue()); + + template = template.replace("{{composer}}", composer.toString()); + template = template.replace("{{compose-resource}}", reg.toString()); + template = template.replace("{{compose-type}}", regt.toString()); + + write(template); + flush(); + close(); + } + + + public void generateComposer(Analysis analysis) throws Exception { + if (analysis.isAbstract()) + genInnerAbstractComposer(analysis, analysis.getRootType()); + else + genInnerComposer(analysis, analysis.getRootType()); + + for (TypeInfo ti : analysis.getTypeList()) { + genInnerComposer(analysis, ti); + } + + } + + private void genInnerComposer(Analysis analysis, TypeInfo ti) throws IOException, Exception { + String tn = ti.getName(); + String stn = (ti == analysis.getRootType() ? tn : analysis.getClassName()+"."+tn); + String pfx = (ti.getDefn().isInlineType()) && !tn.startsWith(analysis.getClassName()) ? analysis.getClassName() : ""; + + composer.append(" protected void compose"+pfx+tn+"(Complex parent, String parentType, String name, "+stn+" element, int index) {\r\n"); + composer.append(" if (element == null) \r\n"); + composer.append(" return;\r\n"); + composer.append(" Complex t;\r\n"); + composer.append(" if (Utilities.noString(parentType))\r\n"); + composer.append(" t = parent;\r\n"); + composer.append(" else {\r\n"); + composer.append(" t = parent.predicate(\"fhir:\"+parentType+'.'+name);\r\n"); + composer.append(" }\r\n"); + composer.append(" compose"+ti.getAncestorName()+"(t, \""+ti.getDefn().getName()+"\", name, element, index);\r\n"); + if (tn.equals("Coding")) + composer.append(" decorateCoding(t, element);\r\n"); + else if (tn.equals("CodeableConcept")) + composer.append(" decorateCodeableConcept(t, element);\r\n"); + + for (ElementDefinition ed : ti.getChildren()) { + genElement(analysis, ti, ed, matchingInheritedElement(ti.getInheritedChildren(), ed)); + } + composer.append(" }\r\n\r\n"); + } + + private void genInnerAbstractComposer(Analysis analysis, TypeInfo ti) throws IOException, Exception { + String tn = ti.getName(); + + composer.append(" protected void compose"+tn+"(Complex t, String parentType, String name, "+tn+" element, int index) {\r\n"); + composer.append(" compose"+ti.getAncestorName()+"(t, parentType, name, element, index);\r\n"); + + for (ElementDefinition ed : ti.getChildren()) { + genElement(analysis, ti, ed, null); + } + composer.append(" }\r\n\r\n"); + } + + private void genElement(Analysis analysis, TypeInfo ti, ElementDefinition ed, ElementDefinition inh) throws Exception { + String name = ed.getName(); + String gname = "get"+upFirst(checkJavaReservedWord(name))+"()"; + String tname = ed.getUserString("java.type"); +// if (tname.startsWith("@")) { +// ElementDefn tgt = getElementForPath(root, e.typeCode().substring(1)); +// tname = typeNames.get(tgt).replace(".", ""); +// } else if (Utilities.noString(tname) && typeNames.containsKey(e)) { +// tname = typeNames.get(e).replace(".", ""); +// } else if (tname.contains("(")) +// tname = tname.substring(0, tname.indexOf("(")); +// if (name.endsWith("[x]") || e.getTypes().size() > 1 || e.typeCode().equals("*")) { +// tname = "Type"; +// if (name.endsWith("[x]")) +// name = name.substring(0, name.length()-3); +// gname = "get"+upFirst(name)+"()"; +// } else if (isJavaPrimitive(e) || e.typeCode().startsWith("canonical(")) { +// BindingSpecification cd = e.getBinding(); +// if (e.typeCode().equals("code") && cd != null && cd.getBinding() == BindingSpecification.BindingMethod.CodeList) +// tname = "Enum"; +// if (e.typeCode().equals("code") && cd != null && isEnum(cd)) +// tname = "Enum"; +// gname = "get"+upFirst(checkJavaReservedWord(name))+"Element()"; +// } +// else if (definitions.getConstraints().containsKey(tname)) +// tname = definitions.getConstraints().get(tname).getBaseType(); + + if (ed.getPath().equals("Reference.reference")) { + gname = "get"+upFirst(checkJavaReservedWord(name))+"Element_()"; // special case + tname = tname.substring(0, tname.length()-4); + } else if (name.endsWith("[x]")) { + tname = "Type"; // not DataType + name = name.substring(0, name.length()-3); + gname = "get"+upFirst(name)+"()"; + } else if (ed.hasUserData("java.enum")) { + tname = "Enum"; + if (!ed.unbounded()) { + gname = "get"+upFirst(checkJavaReservedWord(name))+"Element()"; + } + } else if (!"xhtml".equals(ed.typeSummary()) && (isPrimitive(ed) || ed.typeSummary().startsWith("canonical()"))) { + tname = tname.substring(0, tname.length()-4); + if (!ed.unbounded()) { + gname = "get"+upFirst(checkJavaReservedWord(name))+"Element()"; + } + } + String pfx = ((ed.hasContentReference() || ed.isInlineType()) && !tname.startsWith(analysis.getClassName())) ? analysis.getClassName() : ""; + + if (ed.unbounded()) { +// if (gname.endsWith("Element()") && !gname.equals("getElement()")) +// gname = gname.substring(0, gname.length()-9)+"()"; + composer.append(" for (int i = 0; i < element."+gname+".size(); i++) {\r\n"); + composer.append(" compose"+pfx+tname+"(t, \""+ti.getName()+"\", \""+name+"\", element."+gname+".get(i), i);\r\n"); + composer.append(" }\r\n"); + } else if (inh != null && inh.unbounded()) { + composer.append(" if (element.has"+gname.substring(3).replace("ReferenceElement_", "ReferenceElement")+") {\r\n"); + composer.append(" compose"+pfx+tname+"(t, \""+ti.getName()+"\", \""+name+"\", element."+gname.replace("()", "FirstRep()")+", -1);\r\n"); + composer.append(" }\r\n"); + } else { + composer.append(" if (element.has"+gname.substring(3).replace("ReferenceElement_", "ReferenceElement")+") {\r\n"); + composer.append(" compose"+pfx+tname+"(t, \""+ti.getName()+"\", \""+name+"\", element."+gname+", -1);\r\n"); + composer.append(" }\r\n"); + } + } + + private String checkJavaReservedWord(String name) { + if (Utilities.existsInList(name, "class")) + return name+"_"; + else + return name; + } + +// private boolean isPrimitive(ElementDefn e) { +// return definitions.hasPrimitiveType(e.typeCode()); +// } + +// +// private String prepEnumName(String en) { +// String[] parts = en.split("\\."); +// if (parts.length == 1) +// return upFirst(parts[0]); +// else +// return upFirst(parts[0])+'.'+upFirst(parts[1]); +// } +// +// +// private String leaf(String tn) { +// return tn.startsWith("java.lang.") ? tn.substring(10) : tn; +// } +// +// private String PrepGenericTypeName(String tn) { +// int i = tn.indexOf('('); +// return tn.substring(0, i)+"<"+upFirst(tn.substring(i+1).replace(")", ">")); +// } +// +// private String typeName(ElementDefn root, ElementDefn elem, JavaGenClass type, boolean formal) { +// String t = elem.typeCode(); +// if ((type == JavaGenClass.Type || type == JavaGenClass.Constraint) && definitions.getPrimitives().containsKey(t)) { +// // if (t.equals("boolean")) +// // return "java.lang.Boolean"; +// // else if (t.equals("integer")) +// // return "Integer"; +// // else if (t.equals("integer64")) +// // return "Integer64?"; +// // else if (t.equals("decimal")) +// // return "Decimal"; +// // else if (t.equals("base64Binary")) +// // return "Base64Binary"; +// // else if (t.equals("instant")) +// // return "Instant"; +// // else if (t.equals("uri")) +// // return "Uri"; +// // else +// // return "String"; +// // else if (t.equals("string")) +// // return "StringType"; +// // else +// return upFirst(t); +// } else if (elem.usesCompositeType()) { +// if (typeNames.containsKey(elem) && typeNames.get(elem) != null) +// return typeNames.get(elem); +// else +// return root.getName(); +// } else if (elem.getTypes().size() == 0) { +// return typeNames.get(elem); +// } else if (typeNames.containsKey(elem)) +// return typeNames.get(elem); +// else +// return upFirst(t); +// } +// +// private void finishComposer() throws Exception { +// composer.append(" @Override\r\n"); +// composer.append(" protected void composeResource(Complex parent, Resource resource) {\r\n"); +// composer.append(" "+reg.toString().substring(9)); +// composer.append(" else\r\n"); +// composer.append(" throw new Error(\"Unhandled resource type \"+resource.getClass().getName());\r\n"); +// composer.append(" }\r\n\r\n"); +// +// composer.append(" protected void composeType(Complex parent, String parentType, String name, Type value, int index) {\r\n"); +// composer.append(" if (value == null)\r\n"); +// composer.append(" return;\r\n"); +// composer.append(regtn.toString()); +// composer.append(" else\r\n"); +// composer.append(" throw new Error(\"Unhandled type\");\r\n"); +// composer.append(" }\r\n\r\n"); +// // +// // composer.append(" private boolean nameIsTypeName(XmlPullParser xpp, String prefix) {\r\n"); +// // composer.append(" "+regn.toString()); +// // composer.append(" return false;\r\n"); +// // composer.append(" }\r\n"); +// // +// } +// +// +// public void finish() throws IOException { +// composer.append("}\r\n"); +// composer.append("\r\n"); +// flush(); +// } +// private String getPrimitiveTypeModelName(String code) { +// if (code.equals("string")) +// return "StringType"; +// if (definitions.hasPrimitiveType(code)) +// return upFirst(code)+"Type"; +// return upFirst(code); +// } + + private boolean isPrimitive(ElementDefinition e) { + return definitions.hasPrimitiveType(e.typeSummary()); + } + + private String upFirst(String n) { + return n.substring(0,1).toUpperCase() + n.substring(1); + } + + +} diff --git a/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/JavaParserXmlGenerator.java b/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/JavaParserXmlGenerator.java new file mode 100644 index 000000000..f2dcdb523 --- /dev/null +++ b/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/JavaParserXmlGenerator.java @@ -0,0 +1,508 @@ +package org.hl7.fhir.core.generator.codegen; +/* +Copyright (c) 2011+, HL7, Inc +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.hl7.fhir.core.generator.analysis.Analysis; +import org.hl7.fhir.core.generator.analysis.EnumInfo; +import org.hl7.fhir.core.generator.analysis.TypeInfo; +import org.hl7.fhir.core.generator.engine.Definitions; +import org.hl7.fhir.r5.conformance.ProfileUtilities; +import org.hl7.fhir.r5.model.ElementDefinition; +import org.hl7.fhir.r5.model.ElementDefinition.PropertyRepresentation; +import org.hl7.fhir.r5.model.StructureDefinition; +import org.hl7.fhir.r5.model.ValueSet; +import org.hl7.fhir.r5.model.StructureDefinition.StructureDefinitionKind; +import org.hl7.fhir.r5.model.StructureDefinition.TypeDerivationRule; +import org.hl7.fhir.utilities.Utilities; + +public class JavaParserXmlGenerator extends JavaBaseGenerator { + + private StringBuilder parser = new StringBuilder(); + private StringBuilder pRes = new StringBuilder(); + private StringBuilder pTP = new StringBuilder(); + private StringBuilder pT = new StringBuilder(); + private StringBuilder pFrag = new StringBuilder(); + private StringBuilder pCtype = new StringBuilder(); + private StringBuilder composer = new StringBuilder(); + private StringBuilder cRes = new StringBuilder(); + private StringBuilder cRN = new StringBuilder(); + private StringBuilder cType = new StringBuilder(); + + public JavaParserXmlGenerator(OutputStream out, Definitions definitions, Configuration configuration, Date genDate, String version) throws UnsupportedEncodingException { + super(out, definitions, configuration, version, genDate); + } + + public void seeClass(Analysis analysis) throws Exception { + generateParser(analysis); + generateComposer(analysis); + if (!analysis.isAbstract()) { + pFrag.append( " } else if (type.equals(\""+analysis.getName()+"\")) {\r\n return parse"+analysis.getClassName()+"(xpp);\r\n"); + pCtype.append(" } else if (xpp.getName().equals(prefix+\""+analysis.getName()+"\")) {\r\n return true;\r\n"); + if (analysis.getStructure().getKind() == StructureDefinitionKind.COMPLEXTYPE) { + pTP.append( " } else if (xpp.getName().equals(prefix+\""+analysis.getName()+"\")) {\r\n return parse"+analysis.getClassName()+"(xpp);\r\n"); + pT.append( " } else if (type.equals(\""+analysis.getName()+"\")) {\r\n return parse"+analysis.getClassName()+"(xpp);\r\n"); + cType.append( " } else if (type instanceof "+analysis.getClassName()+") {\r\n compose"+analysis.getClassName()+"(prefix+\""+analysis.getName()+"\", ("+analysis.getClassName()+") type);\r\n"); + } + if (analysis.getStructure().getKind() == StructureDefinitionKind.RESOURCE) { + pRes.append(" } else if (xpp.getName().equals(\""+analysis.getName()+"\")) {\r\n return parse"+analysis.getClassName()+"(xpp);\r\n"); + cRes.append(" } else if (resource instanceof "+analysis.getClassName()+") {\r\n compose"+analysis.getClassName()+"(\""+analysis.getName()+"\", ("+analysis.getClassName()+")resource);\r\n"); + cRN.append( " } else if (resource instanceof "+analysis.getClassName()+") {\r\n compose"+analysis.getClassName()+"(name, ("+analysis.getClassName()+")resource);\r\n"); + } + } + } + + public void generate() throws Exception { + + String template = config.getAdornments().get("XmlParser"); + template = template.replace("{{license}}", config.getLicense()); + template = template.replace("{{startMark}}", startVMarkValue()); + + template = template.replace("{{parser}}", parser.toString()); + template = template.replace("{{parse-resource}}", pRes.toString()); + template = template.replace("{{parse-type-prefix}}", pTP.toString()); + template = template.replace("{{parse-type}}", pT.toString()); + template = template.replace("{{parse-fragment}}", pFrag.toString()); + template = template.replace("{{check-type}}", pCtype.toString()); + + template = template.replace("{{composer}}", composer.toString()); + template = template.replace("{{compose-resource}}", cRes.toString()); + template = template.replace("{{compose-resource-name}}", cRN.toString()); + template = template.replace("{{compose-type}}", cType.toString()); + + write(template); + flush(); + close(); + } + + private void generateParser(Analysis analysis) throws Exception { + if (analysis.isAbstract()) { + genInnerAbstract(analysis, analysis.getRootType()); + } else { + genInner(analysis, analysis.getRootType()); + } + + for (TypeInfo ti : analysis.getTypeList()) { + genInner(analysis, ti); + } + + } + + private void genInner(Analysis analysis, TypeInfo ti) throws IOException, Exception { + String tn = ti.getName(); + String stn = (ti == analysis.getRootType() ? tn : analysis.getClassName()+"."+tn); + String pfx = (ti.getDefn().isInlineType()) && !tn.startsWith(analysis.getClassName()) ? analysis.getClassName() : ""; + + if (!analysis.isAbstract() || ti != analysis.getRootType()) { + parser.append(" protected "+stn+" parse"+pfx+tn+"(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError {\r\n"); + parser.append(" "+stn+" res = new "+stn+"();\r\n"); + if (ti == analysis.getRootType() && analysis.getStructure().getKind() == StructureDefinitionKind.RESOURCE) { + parser.append(" parseResourceAttributes(xpp, res);\r\n"); + } else { + parser.append(" parseElementAttributes(xpp, res);\r\n"); + } + for (ElementDefinition ed : ti.getChildren()) { + if (ed.hasRepresentation(PropertyRepresentation.XMLATTR)) { + parser.append(" if (xpp.getAttributeValue(null, \""+ed.getName()+"\") != null)\r\n"); + parser.append(" res.set"+upFirst(getElementName(ed.getName(), true))+"(xpp.getAttributeValue(null, \""+ed.getName()+"\"));\r\n"); + } + } + parser.append(" next(xpp);\r\n"); + parser.append(" int eventType = nextNoWhitespace(xpp);\r\n"); + parser.append(" while (eventType != XmlPullParser.END_TAG) {\r\n"); + parser.append(" if (!parse"+pfx+tn+"Content(eventType, xpp, res))\r\n"); + parser.append(" unknownContent(xpp);\r\n"); + parser.append(" eventType = nextNoWhitespace(xpp);\r\n"); + parser.append(" }\r\n"); + parser.append(" next(xpp);\r\n"); + parser.append(" parseElementClose(res);\r\n"); + parser.append(" return res;\r\n"); + parser.append(" }\r\n\r\n"); + } + parser.append(" protected boolean parse"+pfx+tn+"Content(int eventType, XmlPullParser xpp, "+stn+" res) throws XmlPullParserException, IOException, FHIRFormatError {\r\n"); + boolean first = true; + for (ElementDefinition ed : ti.getChildren()) { + if (!ed.hasRepresentation(PropertyRepresentation.XMLATTR)) { + genElement(analysis, ti, ed, matchingInheritedElement(ti.getInheritedChildren(), ed), first); + first = false; + } + } + if (!first) + parser.append(" } else "); + else + parser.append(" "); + parser.append("if (!parse"+ti.getAncestorName()+"Content(eventType, xpp, res)){ \r\n"); + parser.append(" return false;\r\n"); + parser.append(" }\r\n"); + parser.append(" return true;\r\n"); + parser.append(" }\r\n\r\n"); + } + + private void genInnerAbstract(Analysis analysis, TypeInfo ti) throws IOException, Exception { + String tn = ti.getName(); + parser.append(" protected boolean parse"+upFirst(tn).replace(".", "")+"Content(int eventType, XmlPullParser xpp, "+tn+" res) throws XmlPullParserException, IOException, FHIRFormatError {\r\n"); + boolean first = true; + for (ElementDefinition ed : ti.getChildren()) { + if (!ed.hasRepresentation(PropertyRepresentation.XMLATTR)) { + genElement(analysis, ti, ed, null, first); + first = false; + } + } + if (!first) + parser.append(" } else "); + else + parser.append(" "); + parser.append("if (!parse"+ti.getAncestorName()+"Content(eventType, xpp, res)){ \r\n"); + parser.append(" return false;\r\n"); + parser.append(" }\r\n"); + parser.append(" return true;\r\n"); + parser.append(" }\r\n\r\n"); + } + + private void genElement(Analysis analysis, TypeInfo ti, ElementDefinition ed, ElementDefinition inh, boolean first) throws Exception { + String name = ed.getName(); + if (name.endsWith("[x]") || name.equals("[type]")) { + String en = name.endsWith("[x]") && !name.equals("[x]") ? name.replace("[x]", "") : "value"; + String pfx = name.endsWith("[x]") && !name.equals("[x]") ? name.replace("[x]", "") : ""; + parser.append(" "+(!first ? "} else " : "")+"if (eventType == XmlPullParser.START_TAG && nameIsTypeName(xpp, \""+pfx+"\")) {\r\n"); + parser.append(" res.set"+upFirst(getElementName(en, false))+"(parseType(\""+en+"\", xpp));\r\n"); + } else { + String prsr = null; + if (ed.hasUserData("java.enum")) { + EnumInfo ei = (EnumInfo) ed.getUserData("java.enum"); // getCodeListType(cd.getBinding()); + ValueSet vs = ei.getValueSet(); + boolean enShared = vs.hasUserData("shared"); + String en; + if (enShared) { + en = "Enumerations."+ei.getName(); + } else { + en = analysis.getClassName()+"."+ei.getName(); + } + prsr = "parseEnumeration(xpp, "+en+".NULL, new "+en.substring(0, en.indexOf("."))+"."+en.substring(en.indexOf(".")+1)+"EnumFactory())"; // en+".fromCode(parseString(xpp))"; + // parseEnumeration(xpp, Narrative.NarrativeStatus.additional, new Narrative.NarrativeStatusEnumFactory()) + } else { + String tn = ed.getUserString("java.type"); + if (name.equals("extension")) { + name = "extension"; + tn = "Extension"; + } + if (tn.contains("Reference(")) + prsr = "parseReference(xpp)"; + else if (tn.contains("canonical(")) + prsr = "parseCanonical(xpp)"; + else if (tn.contains("(")) + prsr = "parse"+tn+"(xpp)"; + else if (tn.startsWith(analysis.getName()) && !tn.equals(analysis.getClassName())/* && !definitions.hasType(tn)*/) { + prsr = "parse"+upFirst(tn)+"(xpp)"; + } else if (tn.equals("Resource") || tn.equals("DomainResource")) + prsr = "parse"+upFirst(tn)+"Contained(xpp)"; + else if (isPrimitive(ed)) { + prsr = "parse"+upFirst(tn.substring(0, tn.length()-4))+"(xpp)"; + } else if ((ed.hasContentReference() || ed.isInlineType()) && !tn.startsWith(analysis.getClassName()) ) { + prsr = "parse"+analysis.getClassName()+upFirst(tn)+"(xpp)"; + } else { + prsr = "parse"+upFirst(tn)+"(xpp)"; + } + } + if (ed.unbounded()) { + parser.append(" "+(!first ? "} else " : "")+"if (eventType == XmlPullParser.START_TAG && xpp.getName().equals(\""+name+"\")) {\r\n"); + parser.append(" res.get"+upFirst(getElementName(name, false))+"().add("+prsr+");\r\n"); + } else if (inh != null && inh.unbounded()) { + parser.append(" "+(!first ? "} else " : "")+"if (eventType == XmlPullParser.START_TAG && xpp.getName().equals(\""+name+"\")) {\r\n"); + parser.append(" res.add"+upFirst(getElementName(name, false))+(!ed.typeSummary().equals("xhtml") && (isPrimitive(ed) || ed.typeSummary().startsWith("canonical(")) ? "Element" : "")+"("+prsr+");\r\n"); + } else { + parser.append(" "+(!first ? "} else " : "")+"if (eventType == XmlPullParser.START_TAG && xpp.getName().equals(\""+name+"\")) {\r\n"); + parser.append(" res.set"+upFirst(getElementName(name, false))+(!ed.typeSummary().equals("xhtml") && (isPrimitive(ed) || ed.typeSummary().startsWith("canonical(")) ? "Element" : "")+"("+prsr+");\r\n"); + } + } + } + + private boolean isPrimitive(ElementDefinition e) { + return definitions.hasPrimitiveType(e.typeSummary()); + } + + private void generateComposer(Analysis analysis) throws Exception { + if (analysis.isAbstract()) { + genInnerAbstractComposer(analysis, analysis.getRootType()); + } else { + genInnerComposer(analysis, analysis.getRootType()); + } + + for (TypeInfo ti : analysis.getTypeList()) { + genInnerComposer(analysis, ti); + } + + } + + private void genInnerComposer(Analysis analysis, TypeInfo ti) throws IOException, Exception { + String tn = ti.getName(); + String stn = (ti == analysis.getRootType() ? tn : analysis.getClassName()+"."+tn); + String pfx = (ti.getDefn().isInlineType()) && !tn.startsWith(analysis.getClassName()) ? analysis.getClassName() : ""; + + composer.append(" protected void compose"+pfx+tn+"(String name, "+stn+" element) throws IOException {\r\n"); + composer.append(" if (element != null) {\r\n"); + if (ti == analysis.getRootType() && analysis.getStructure().getKind() == StructureDefinitionKind.RESOURCE) { + composer.append(" composeResourceAttributes(element);\r\n"); + } else { + composer.append(" composeElementAttributes(element);\r\n"); + } + composer.append(" xml.enter(FHIR_NS, name);\r\n"); + composer.append(" compose"+pfx+tn+"Elements(element);\r\n"); + composer.append(" composeElementClose(element);\r\n"); + composer.append(" xml.exit(FHIR_NS, name);\r\n"); + composer.append(" }\r\n"); + composer.append(" }\r\n\r\n"); + + composer.append(" protected void compose"+pfx+tn+"Elements("+stn+" element) throws IOException {\r\n"); + composer.append(" compose"+ti.getAncestorName()+"Elements(element);\r\n"); + + for (ElementDefinition ed : ti.getChildren()) { + if (!ed.hasRepresentation(PropertyRepresentation.XMLATTR)) { + genElementCompose(analysis, ti, ed, matchingInheritedElement(ti.getInheritedChildren(), ed)); + } + } + composer.append(" }\r\n\r\n"); + } + + private void genInnerAbstractComposer(Analysis analysis, TypeInfo ti) throws IOException, Exception { + String tn = ti.getName(); + + composer.append(" protected void compose"+tn+"Elements("+tn+" element) throws IOException {\r\n"); + composer.append(" compose"+ti.getAncestorName()+"Elements(element);\r\n"); + + for (ElementDefinition ed : ti.getChildren()) { + if (!ed.hasRepresentation(PropertyRepresentation.XMLATTR)) { + genElementCompose(analysis, ti, ed, null); + } + } + composer.append(" }\r\n\r\n"); + } + + private void genElementCompose(Analysis analysis, TypeInfo ti, ElementDefinition ed, ElementDefinition inh) throws Exception { + String name = ed.getName(); + if (name.endsWith("[x]") || name.equals("[type]")) { + String en = name.endsWith("[x]") && !name.equals("[x]") ? name.replace("[x]", "") : "value"; + String pfx = name.endsWith("[x]") ? name.replace("[x]", "") : ""; + composer.append(" if (element.has"+upFirst(getElementName(en, false))+"()) {\r\n"); + composer.append(" composeType(\""+pfx+"\", element.get"+upFirst(getElementName(en, false))+"());\r\n"); + composer.append(" }"); + } else { + String comp = null; + String en = null; + String tn = ed.getUserString("java.type"); + if (ed.hasUserData("java.enum")) { + EnumInfo ei = (EnumInfo) ed.getUserData("java.enum"); + ValueSet vs = ei.getValueSet(); + boolean enShared = vs.hasUserData("shared"); + if (enShared) { + en = "Enumerations."+ei.getName(); + } else { + en = analysis.getClassName()+"."+ei.getName(); + } + } else { + if (name.equals("extension")) { + name = "extension"; + tn = "Extension"; + } + if (tn.equals("XhtmlNode")) { + tn = "xhtml"; + comp = "composeXhtml"; + } else if (isPrimitive(ed)) { + comp = "compose"+tn.substring(0, tn.length()-4); + } else if (tn.contains("Reference(")) { + comp = "composeReference"; + tn = "Reference"; + } else if (tn.contains("canonical(")) { + comp = "composeCanonical"; + tn = "CanonicalType"; + } else if (tn.contains("(")) { + comp = "compose"+tn; + } else if ((ed.hasContentReference() || ed.isInlineType()) && !tn.startsWith(analysis.getClassName()) ) { + comp = "compose"+analysis.getClassName()+tn; + } else { + comp = "compose"+tn; + } + } + + if (ed.unbounded()) { + if (en != null) { + composer.append(" if (element.has"+upFirst(getElementName(name, false))+"()) \r\n"); + composer.append(" for (Enumeration<"+en+"> e : element.get"+upFirst(getElementName(name, false))+"()) \r\n"); + composer.append(" composeEnumeration(\""+name+"\", e, new "+en+"EnumFactory());\r\n"); + } else { + String stn = ed.isInlineType() || ed.hasContentReference() ? analysis.getClassName()+"."+tn : tn; +// String pfx = ed.isInlineType() || ed.hasContentReference() ? analysis.getClassName() : ""; + + composer.append(" if (element.has"+upFirst(getElementName(name, false))+"()) { \r\n"); + composer.append(" for ("+stn+" e : element.get"+upFirst(getElementName(name, false))+"()) \r\n"); + if (ed.typeSummary().equals("Resource")) { + composer.append(" {\r\n"); + composer.append(" xml.enter(FHIR_NS, \""+name+"\");\r\n"); + composer.append(" "+comp+"(e);\r\n"); + composer.append(" xml.exit(FHIR_NS, \""+name+"\");\r\n"); + composer.append(" }\r\n"); + } else { + composer.append(" "+comp+"(\""+name+"\", e);\r\n"); + } + composer.append(" }\r\n"); + } + } else if (en != null) { + composer.append(" if (element.has"+upFirst(getElementName(name, false))+"Element())\r\n"); + composer.append(" composeEnumeration(\""+name+"\", element.get"+upFirst(getElementName(name, false))+"Element(), new "+en+"EnumFactory());\r\n"); + } else if (!"xhtml".equals(ed.typeSummary()) && (isJavaPrimitive(ed) || ed.typeSummary().startsWith("canonical("))) { + composer.append(" if (element.has"+upFirst(getElementName(name, false))+"Element()) {\r\n"); + composer.append(" "+comp+"(\""+name+"\", element.get"+upFirst(getElementName(name, false))+"Element());\r\n"); + composer.append(" }\r\n"); + } else if (ed.typeSummary().equals("Resource")) { + composer.append(" if (element.has"+upFirst(getElementName(name, false))+"()) {\r\n"); + composer.append(" xml.enter(FHIR_NS, \""+name+"\");\r\n"); + composer.append(" "+comp+"(element.get"+upFirst(getElementName(name, false))+"());\r\n"); + composer.append(" xml.exit(FHIR_NS, \""+name+"\");\r\n"); + composer.append(" }\r\n"); + } else if (inh != null && inh.unbounded()) { + composer.append(" if (element.has"+upFirst(getElementName(name, false))+"()) {\r\n"); + composer.append(" "+comp+"(\""+name+"\", element.get"+upFirst(getElementName(name, false))+"FirstRep());\r\n"); + composer.append(" }\r\n"); + } else { + composer.append(" if (element.has"+upFirst(getElementName(name, false))+"()) {\r\n"); + composer.append(" "+comp+"(\""+name+"\", element.get"+upFirst(getElementName(name, false))+"());\r\n"); + composer.append(" }\r\n"); + } + } + } +// +// private boolean isPrimitive(ElementDefn e) { +// return definitions.hasPrimitiveType(e.typeCode()); +// } +// +// +// private String prepEnumName(String en) { +// String[] parts = en.split("\\."); +// if (parts.length == 1) +// return upFirst(parts[0]); +// else +// return upFirst(parts[0])+'.'+upFirst(parts[1]); +//} +// +// +// private String leaf(String tn) { +// return tn.startsWith("java.lang.") ? tn.substring(10) : tn; +// } +// +// private String PrepGenericTypeName(String tn) { +// int i = tn.indexOf('('); +// return tn.substring(0, i)+"<"+upFirst(tn.substring(i+1).replace(")", ">")); +// } +// +// private String typeName(ElementDefn root, ElementDefn elem, JavaGenClass type, boolean formal) { +// String t = elem.typeCode(); +// if ((type == JavaGenClass.Type || type == JavaGenClass.Constraint) && definitions.getPrimitives().containsKey(t)) { +//// if (t.equals("boolean")) +//// return "java.lang.Boolean"; +//// else if (t.equals("integer")) +//// return "Integer"; +//// else if (t.equals("decimal")) +//// return "Decimal"; +//// else if (t.equals("base64Binary")) +//// return "Base64Binary"; +//// else if (t.equals("instant")) +//// return "Instant"; +//// else if (t.equals("uri")) +//// return "Uri"; +//// else +//// return "String"; +//// else if (t.equals("string")) +//// return "StringType"; +//// else +// return upFirst(t); +// } else if (elem.usesCompositeType()) { +// if (typeNames.containsKey(elem) && typeNames.get(elem) != null) +// return typeNames.get(elem); +// else +// return root.getName(); +// } else if (elem.getTypes().size() == 0) { +// return typeNames.get(elem); +// } else if (typeNames.containsKey(elem)) +// return typeNames.get(elem); +// else +// return upFirst(t); +// } +// +// private void finishComposer() throws Exception { +// composer.append(" @Override\r\n"); +// composer.append(" protected void composeResource(Resource resource) throws IOException {\r\n"); +// composer.append(" "+reg.toString().substring(9)); +// composer.append(" else if (resource instanceof Binary)\r\n"); +// composer.append(" composeBinary(\"Binary\", (Binary)resource);\r\n"); +// composer.append(" else\r\n"); +// composer.append(" throw new Error(\"Unhandled resource type \"+resource.getClass().getName());\r\n"); +// composer.append(" }\r\n\r\n"); +// composer.append(" protected void composeResource(String name, Resource resource) throws IOException {\r\n"); +// composer.append(" "+regn.toString().substring(9)); +// composer.append(" else if (resource instanceof Binary)\r\n"); +// composer.append(" composeBinary(name, (Binary)resource);\r\n"); +// composer.append(" else\r\n"); +// composer.append(" throw new Error(\"Unhandled resource type \"+resource.getClass().getName());\r\n"); +// composer.append(" }\r\n\r\n"); +// composer.append(" protected void composeType(String prefix, Type type) throws IOException {\r\n"); +// composer.append(" if (type == null)\r\n"); +// composer.append(" ;\r\n"); +// composer.append(regtp.toString()); +// composer.append(regtn.toString()); +// composer.append(" else\r\n"); +// composer.append(" throw new Error(\"Unhandled type: \"+type.fhirType());\r\n"); +// composer.append(" }\r\n\r\n"); +//// +//// composer.append(" private boolean nameIsTypeName(XmlPullParser xpp, String prefix) {\r\n"); +//// composer.append(" "+regn.toString()); +//// composer.append(" return false;\r\n"); +//// composer.append(" }\r\n"); +//// +// } +// +// +// public void finish() throws IOException { +// composer.append("}\r\n"); +// composer.append("\r\n"); +// flush(); +// } + + private String upFirst(String n) { + return n.substring(0,1).toUpperCase() + n.substring(1); + } + + +} diff --git a/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/todo/JavaConverterGenerator.java b/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/todo/JavaConverterGenerator.java new file mode 100644 index 000000000..6b140d82e --- /dev/null +++ b/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/todo/JavaConverterGenerator.java @@ -0,0 +1,608 @@ +package org.hl7.fhir.core.generator.codegen.todo; +/* +Copyright (c) 2011+, HL7, Inc +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + */ +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.hl7.fhir.core.generator.codegen.Configuration; +import org.hl7.fhir.core.generator.codegen.JavaBaseGenerator; +import org.hl7.fhir.core.generator.engine.Definitions; +import org.hl7.fhir.utilities.Utilities; + +public class JavaConverterGenerator extends JavaBaseGenerator { + + public JavaConverterGenerator(OutputStream arg0, Definitions definitions, Configuration config, String version, Date genDate) + throws UnsupportedEncodingException { + super(arg0, definitions, config, version, genDate); + // TODO Auto-generated constructor stub + } +// public enum JavaGenClass { Structure, Type, Resource, AbstractResource, BackboneElement, Constraint } +// +// private Map typeNames = new HashMap(); +// private List typeNameStrings = new ArrayList(); +// private List enums = new ArrayList(); +// private List elist = new ArrayList(); +// private List enumNames = new ArrayList(); +// private List strucs = new ArrayList(); +// private boolean doneQ; +// +// private String genparam; +// +// public JavaConverterGenerator(OutputStream out) throws UnsupportedEncodingException { +// super(out); +// } +// +// public void generate(Definitions definitions, String version, Date genDate) throws Exception { +// +// this.definitions = definitions; +// start(version, genDate); +// genVersionCommon(); +// for (String s : sorted(definitions.getPrimitives().keySet())) { +// genVersionConvertor(definitions.getPrimitives().get(s)); +// } +// for (String s : sorted(definitions.getInfrastructure().keySet())) { +// generate(definitions.getInfrastructure().get(s), JavaGenClass.Type, null); +// } +// for (String s : sorted(definitions.getTypes().keySet())) { +// generate(definitions.getTypes().get(s), JavaGenClass.Type, null); +// } +// for (String s : sorted(definitions.getConstraints().keySet())) { +// generate(definitions.getConstraints().get(s)); +// } +// genTypeConvertor(); +// +// for (String s : sorted(definitions.getBaseResources().keySet())) { +// ResourceDefn n = definitions.getBaseResources().get(s); +// generate(n.getRoot(), n.isAbstract() ? JavaGenClass.AbstractResource : JavaGenClass.Resource, null); +// } +// for (String s : sorted(definitions.getResources().keySet())) { +// ResourceDefn n = definitions.getResources().get(s); +// generate(n.getRoot(), JavaGenClass.Resource, null); +// } +// genResourceConvertor(); +// +// +// write("\r\n"); +// write("}\r\n"); +// +// } +// +// private void generate(ProfiledType pt) throws Exception { +// generate(definitions.getElementDefn(pt.getBaseType()), JavaGenClass.Type, pt.getName()); +// } +// +// private void genTypeConvertor() throws IOException { +// write(" public static org.hl7.fhir.r5.model.Type convertType(org.hl7.fhir.dstu3.model.Type src) throws FHIRException {\r\n"); +// write(" if (src == null)\r\n"); +// write(" return null;\r\n"); +// for (String s : sorted(definitions.getPrimitives().keySet())) { +// write(" if (src instanceof org.hl7.fhir.dstu3.model."+upFirst(s)+"Type)\r\n"); +// write(" return convert"+upFirst(s)+"((org.hl7.fhir.dstu3.model."+upFirst(s)+"Type) src);\r\n"); +// } +// for (String s : sorted(definitions.getInfrastructure().keySet())) { +// if (!exemptTypeName(s)) { +// write(" if (src instanceof org.hl7.fhir.dstu3.model."+s+")\r\n"); +// write(" return convert"+s+"((org.hl7.fhir.dstu3.model."+s+") src);\r\n"); +// } +// } +// for (String s : sorted(definitions.getTypes().keySet())) { +// if (!exemptTypeName(s)) { +// write(" if (src instanceof org.hl7.fhir.dstu3.model."+s+")\r\n"); +// write(" return convert"+s+"((org.hl7.fhir.dstu3.model."+s+") src);\r\n"); +// } +// } +// for (String s : sorted(definitions.getConstraints().keySet())) { +// write(" if (src instanceof org.hl7.fhir.dstu3.model."+s+")\r\n"); +// write(" return convert"+s+"((org.hl7.fhir.dstu3.model."+s+") src);\r\n"); +// } +// +// write(" throw new Error(\"Unknown type \"+src.fhirType());\r\n"); +// write(" }\r\n\r\n"); +// write(" public static org.hl7.fhir.dstu3.model.Type convertType(org.hl7.fhir.r5.model.Type src) throws FHIRException {\r\n"); +// write(" if (src == null)\r\n"); +// write(" return null;\r\n"); +// for (String s : sorted(definitions.getPrimitives().keySet())) { +// write(" if (src instanceof org.hl7.fhir.r5.model."+upFirst(s)+"Type)\r\n"); +// write(" return convert"+upFirst(s)+"((org.hl7.fhir.r5.model."+upFirst(s)+"Type) src);\r\n"); +// } +// for (String s : sorted(definitions.getInfrastructure().keySet())) { +// if (!exemptTypeName(s)) { +// write(" if (src instanceof org.hl7.fhir.r5.model."+s+")\r\n"); +// write(" return convert"+s+"((org.hl7.fhir.r5.model."+s+") src);\r\n"); +// } +// } +// for (String s : sorted(definitions.getTypes().keySet())) { +// if (!exemptTypeName(s)) { +// write(" if (src instanceof org.hl7.fhir.r5.model."+s+")\r\n"); +// write(" return convert"+s+"((org.hl7.fhir.r5.model."+s+") src);\r\n"); +// } +// } +// for (String s : sorted(definitions.getConstraints().keySet())) { +// write(" if (src instanceof org.hl7.fhir.r5.model."+s+")\r\n"); +// write(" return convert"+s+"((org.hl7.fhir.r5.model."+s+") src);\r\n"); +// } +// write(" throw new Error(\"Unknown type \"+src.fhirType());\r\n"); +// write(" }\r\n\r\n"); +// } +// +// private void genResourceConvertor() throws IOException { +// write(" public static org.hl7.fhir.r5.model.Resource convertResource(org.hl7.fhir.dstu3.model.Resource src) throws FHIRException {\r\n"); +// write(" if (src == null)\r\n"); +// write(" return null;\r\n"); +// for (String s : sorted(definitions.getBaseResources().keySet())) { +// if (!definitions.getBaseResources().get(s).isAbstract()) { +// write(" if (src instanceof org.hl7.fhir.dstu3.model."+s+")\r\n"); +// write(" return convert"+s+"((org.hl7.fhir.dstu3.model."+s+") src);\r\n"); +// } +// } +// for (String s : sorted(definitions.getResources().keySet())) { +// write(" if (src instanceof org.hl7.fhir.dstu3.model."+s+")\r\n"); +// write(" return convert"+s+"((org.hl7.fhir.dstu3.model."+s+") src);\r\n"); +// } +// write(" throw new Error(\"Unknown resource \"+src.fhirType());\r\n"); +// write(" }\r\n\r\n"); +// +// write(" public static org.hl7.fhir.dstu3.model.Resource convertResource(org.hl7.fhir.r5.model.Resource src) throws FHIRException {\r\n"); +// write(" if (src == null)\r\n"); +// write(" return null;\r\n"); +// for (String s : sorted(definitions.getBaseResources().keySet())) { +// if (!definitions.getBaseResources().get(s).isAbstract()) { +// write(" if (src instanceof org.hl7.fhir.r5.model."+s+")\r\n"); +// write(" return convert"+s+"((org.hl7.fhir.r5.model."+s+") src);\r\n"); +// } +// } +// for (String s : sorted(definitions.getResources().keySet())) { +// write(" if (src instanceof org.hl7.fhir.r5.model."+s+")\r\n"); +// write(" return convert"+s+"((org.hl7.fhir.r5.model."+s+") src);\r\n"); +// } +// write(" throw new Error(\"Unknown resource \"+src.fhirType());\r\n"); +// write(" }\r\n\r\n"); +// } +// +// private boolean exemptTypeName(String s) { +// return +// Utilities.existsInList(s, "Element", "BackboneElement") // structural +// || +// Utilities.existsInList(s, "ModuleMetadata"); // no equivalence in DSTU2 +// } +// +// private List sorted(Set keys) { +// List result = new ArrayList(); +// result.addAll(keys); +// Collections.sort(result); +// return result; +// } +// +// +// private void start(String version, Date genDate) throws IOException { +// write("package org.hl7.fhir.convertors;\r\n\r\n"); +// write("import org.hl7.fhir.exceptions.FHIRException;\r\n\r\n"); +// startMark(version, genDate); +// write("\r\n"); +// write("public class VersionConvertor_30_40 {\r\n"); +// write("\r\n"); +// +// +// } +// +// private void genVersionCommon() throws IOException { +// write(" private static void copyElement(org.hl7.fhir.dstu3.model.Element src, org.hl7.fhir.r5.model.Element tgt) throws FHIRException {\r\n"); +// write(" if (src.hasId())\r\n tgt.setId(src.getId());\r\n"); +// write(" for (org.hl7.fhir.dstu3.model.Extension e : src.getExtension()) {\r\n"); +// write(" tgt.addExtension(convertExtension(e));\r\n"); +// write(" }\r\n"); +// write(" }\r\n\r\n"); +// +// write(" private static void copyElement(org.hl7.fhir.r5.model.Element src, org.hl7.fhir.dstu3.model.Element tgt) throws FHIRException {\r\n"); +// write(" if (src.hasId())\r\n tgt.setId(src.getId());\r\n"); +// write(" for (org.hl7.fhir.r5.model.Extension e : src.getExtension()) {\r\n"); +// write(" tgt.addExtension(convertExtension(e));\r\n"); +// write(" }\r\n"); +// write(" }\r\n\r\n"); +// +// write(" private static void copyBackboneElement(org.hl7.fhir.dstu3.model.BackboneElement src, org.hl7.fhir.r5.model.BackboneElement tgt) throws FHIRException {\r\n"); +// write(" copyElement(src, tgt);\r\n"); +// write(" for (org.hl7.fhir.dstu3.model.Extension e : src.getModifierExtension()) {\r\n"); +// write(" tgt.addModifierExtension(convertExtension(e));\r\n"); +// write(" }\r\n"); +// write(" }\r\n\r\n"); +// +// write(" private static void copyBackboneElement(org.hl7.fhir.r5.model.BackboneElement src, org.hl7.fhir.dstu3.model.BackboneElement tgt) throws FHIRException {\r\n"); +// write(" copyElement(src, tgt);\r\n"); +// write(" for (org.hl7.fhir.r5.model.Extension e : src.getModifierExtension()) {\r\n"); +// write(" tgt.addModifierExtension(convertExtension(e));\r\n"); +// write(" }\r\n"); +// write(" }\r\n\r\n"); +// +// } +// +// private void genVersionConvertor(DefinedCode pt) throws IOException { +// String tn = getPrimitiveTypeModelName(pt.getCode()); +// write(" public static org.hl7.fhir.r5.model."+tn+" convert"+tn.substring(0, tn.length()-4)+"(org.hl7.fhir.dstu3.model."+tn+" src) throws FHIRException {\r\n"); +// write(" org.hl7.fhir.r5.model."+tn+" tgt = new org.hl7.fhir.r5.model."+tn+"(src.getValue());\r\n"); +// write(" copyElement(src, tgt);\r\n"); +// write(" return tgt;\r\n"); +// write(" }\r\n\r\n"); +// write(" public static org.hl7.fhir.dstu3.model."+tn+" convert"+tn.substring(0, tn.length()-4)+"(org.hl7.fhir.r5.model."+tn+" src) throws FHIRException {\r\n"); +// write(" org.hl7.fhir.dstu3.model."+tn+" tgt = new org.hl7.fhir.dstu3.model."+tn+"(src.getValue());\r\n"); +// write(" copyElement(src, tgt);\r\n"); +// write(" return tgt;\r\n"); +// write(" }\r\n\r\n"); +// } +// +// +// private String getPrimitiveTypeModelName(String code) { +// if (code.equals("string")) +// return "StringType"; +// if (definitions.hasPrimitiveType(code)) +// return upFirst(code)+"Type"; +// return upFirst(code); +// } +// +// private String upFirst(String n) { +// if (Utilities.noString(n)) +// return ""; +// return n.substring(0,1).toUpperCase() + n.substring(1); +// } +// +// +// private void generate(ElementDefn n, JavaGenClass clss, String nameOverride) throws Exception { +// if (n.getName().equals("Quantity") && !doneQ) { +// doneQ = true; +// write(" public static void copyQuantity(org.hl7.fhir.dstu3.model.Quantity src, org.hl7.fhir.r5.model.Quantity tgt) throws FHIRException {\r\n"); +// write(" if (src == null || tgt == null)\r\n"); +// write(" return;\r\n"); +// write(" copyElement(src, tgt);\r\n"); +// write(" if (src.hasValue())\r\n"); +// write(" tgt.setValue(src.getValue());\r\n"); +// write(" if (src.hasComparator())\r\n"); +// write(" tgt.setComparator(convertQuantityComparator(src.getComparator()));\r\n"); +// write(" if (src.hasUnit())\r\n"); +// write(" tgt.setUnit(src.getUnit());\r\n"); +// write(" if (src.hasSystem())\r\n"); +// write(" tgt.setSystem(src.getSystem());\r\n"); +// write(" if (src.hasCode())\r\n"); +// write(" tgt.setCode(src.getCode());\r\n"); +// write(" }\r\n"); +// write(" \r\n"); +// write(" public static void copyQuantity(org.hl7.fhir.r5.model.Quantity src, org.hl7.fhir.dstu3.model.Quantity tgt) throws FHIRException {\r\n"); +// write(" if (src == null || tgt == null)\r\n"); +// write(" return;\r\n"); +// write(" copyElement(src, tgt);\r\n"); +// write(" if (src.hasValue())\r\n"); +// write(" tgt.setValue(src.getValue());\r\n"); +// write(" if (src.hasComparator())\r\n"); +// write(" tgt.setComparator(convertQuantityComparator(src.getComparator()));\r\n"); +// write(" if (src.hasUnit())\r\n"); +// write(" tgt.setUnit(src.getUnit());\r\n"); +// write(" if (src.hasSystem())\r\n"); +// write(" tgt.setSystem(src.getSystem());\r\n"); +// write(" if (src.hasCode())\r\n"); +// write(" tgt.setCode(src.getCode());\r\n"); +// write("}\r\n"); +// write("\r\n"); +// } +// generate(n, n, clss, nameOverride); +// } +// +// private void generate(ElementDefn root, ElementDefn n, JavaGenClass clss, String nameOverride) throws Exception { +// if (exemptTypeName(n.getName())) +// return; +// +// typeNames.clear(); +// typeNameStrings.clear(); +// enums.clear(); +// strucs.clear(); +// enumNames.clear(); +// String nn = javaClassName(n.getName()); +// for (ElementDefn e : n.getElements()) { +// scanNestedTypes(n, nn, e); +// } +// +// if (clss == JavaGenClass.AbstractResource) +// genInnerAbstract(n); +// else +// genInner(null, root, n, clss, nameOverride); +// +// for (ElementDefn e : strucs) { +// genInner(n.getName(), root, e, clss == JavaGenClass.Resource ? JavaGenClass.BackboneElement : JavaGenClass.Structure, null); +// } +// +// } +// +// +// private String javaClassName(String name) { +// if (name.equals("List")) +// return "ListResource"; +// else +// return name; +// } +// +// +// private void genInner(String typeName, ElementDefn root, ElementDefn ed, JavaGenClass clss, String nameOverride) throws IOException, Exception { +// String es = ""; +// String tn = nameOverride; +// String stn = nameOverride; +// if (tn == null) { +// if (typeName == null) +// tn = javaClassName(ed.getName()); +// else +// tn = typeName+"."+(ed.getDeclaredTypeName() != null ? ed.getDeclaredTypeName() : upFirst(ed.getName())); +// stn = tn.contains(".") ? tn.substring(tn.lastIndexOf(".") + 1) : tn; +// } +// +// write(" public static org.hl7.fhir.r5.model."+tn+" convert"+stn+"(org.hl7.fhir.dstu3.model."+tn+" src) throws FHIRException {\r\n"); +// write(" if (src == null)\r\n"); +// write(" return null;\r\n"); +// write(" org.hl7.fhir.r5.model."+tn+" tgt = new org.hl7.fhir.r5.model."+tn+"();\r\n"); +// String parentType = ed.typeCode(); +// if (Utilities.noString(parentType) || parentType.equals("Type") || parentType.equals("Structure")) +// parentType = "Element"; +// write(" copy"+parentType+"(src, tgt);\r\n"); +// es = processElements(root, ed, es, "dstu3"); +// write(" return tgt;\r\n"); +// write(" }\r\n\r\n"); +// +// write(" public static org.hl7.fhir.dstu3.model."+tn+" convert"+stn+"(org.hl7.fhir.r5.model."+tn+" src) throws FHIRException {\r\n"); +// write(" if (src == null)\r\n"); +// write(" return null;\r\n"); +// write(" org.hl7.fhir.dstu3.model."+tn+" tgt = new org.hl7.fhir.dstu3.model."+tn+"();\r\n"); +// write(" copy"+parentType+"(src, tgt);\r\n"); +// es = processElements(root, ed, es, "r4"); +// write(" return tgt;\r\n"); +// write(" }\r\n\r\n"); +// +// write(es); +// } +// +// private String processElements(ElementDefn root, ElementDefn ed, String es, String ver) throws Exception, IOException { +// for (ElementDefn c : ed.getElements()) { +// boolean prim = isPrimitive(c) || "xhtml".equals(c.typeCode()); +// String en = upFirst(c.getName()).replace("[x]", ""); +// if (en.equals("Class")) +// en = "Class_"; +// String cn = ""; +// String tn = c.typeCode(); +// if (tn.contains("(")) +// tn = tn.substring(0, tn.indexOf("(")); +// String tt = ""; +// if (prim) { +// BindingSpecification cd = c.getBinding(); +// String ctn = typeNames.get(c); +// tn = ctn; +// if (c.typeCode().equals("code") && cd != null && isEnum(cd)) { +// cn = "convert"+upFirst(ctn.contains(".") ? ctn.substring(ctn.lastIndexOf(".")+1) : ctn)+"("; +// es = es + genEnumConvertor(cn.substring(0, cn.length()-1), ctn, cd); +// tn = "Enumeration"; +// } else { +// tn = upFirst(tn) + "Type"; +// } +// tt = ".getValue()"; +// } else { +// if (c.typeCode().contains("@")) { +// ElementDefn cs = getElementForPath(root, c.typeCode().substring(1)); +// tn = cs.getDeclaredTypeName() == null ? upFirst(cs.getName()) : cs.getDeclaredTypeName(); +// cn = "convert"+tn+"("; +// tn = root.getName()+"."+tn; +// } else if (c.getTypes().size() == 0) { +// tn = c.getDeclaredTypeName() == null ? upFirst(c.getName()) : c.getDeclaredTypeName(); +// cn = "convert"+tn+"("; +// if (ed.getPath().contains(".")) +// tn = root(typeNames.get(ed)) +"."+tn; +// else +// tn = ed.getName()+"."+tn; +// } else if (c.getTypes().size() != 1 || "*".equals(c.typeCode())) +// cn = "convertType("; +// else +// cn = "convert"+upFirst(c.getTypes().get(0).getName())+"("; +// } +// String ct = Utilities.noString(cn) ? "" : ")"; +// if (c.unbounded()) { +// write(" for (org.hl7.fhir."+ver+".model."+tn+" t : src.get"+en+"())\r\n"); +// write(" tgt.add"+en+"("+cn+"t"+tt+ct+");\r\n"); +// +// } else { +// write(" if (src.has"+en+"())\r\n"); +// write(" tgt.set"+en+"("+cn+"src.get"+en+"()"+ct+");\r\n"); +// } +// } +// return es; +// } +// +// private String root(String s) { +// return s.contains(".") ? s.substring(0, s.indexOf(".")) : s; +// } +// +// private String genEnumConvertor(String cn, String ctn, BindingSpecification cd) throws Exception { +// if (elist.contains(cn)) +// return ""; +// elist.add(cn); +// +// StringBuilder b = new StringBuilder(); +// b.append(" private static org.hl7.fhir.r5.model."+ctn+" "+cn+"(org.hl7.fhir.dstu3.model."+ctn+" src) throws FHIRException {\r\n"); +// b.append(" if (src == null)\r\n"); +// b.append(" return null;\r\n"); +// b.append(" switch (src) {\r\n"); +// for (DefinedCode c : cd.getAllCodes(definitions.getCodeSystems(), definitions.getValuesets(), true)) { +// String cc = Utilities.camelCase(c.getCode()); +// cc = makeConst(cc); +// b.append(" case "+cc+": return org.hl7.fhir.r5.model."+ctn+"."+cc+";\r\n"); +// } +// b.append(" default: return org.hl7.fhir.r5.model."+ctn+".NULL;\r\n"); +// b.append(" }\r\n"); +// b.append("}\r\n\r\n"); +// b.append(" private static org.hl7.fhir.dstu3.model."+ctn+" "+cn+"(org.hl7.fhir.r5.model."+ctn+" src) throws FHIRException {\r\n"); +// b.append(" if (src == null)\r\n"); +// b.append(" return null;\r\n"); +// b.append(" switch (src) {\r\n"); +// for (DefinedCode c : cd.getAllCodes(definitions.getCodeSystems(), definitions.getValuesets(), true)) { +// String cc = Utilities.camelCase(c.getCode()); +// cc = makeConst(cc); +// b.append(" case "+cc+": return org.hl7.fhir.dstu3.model."+ctn+"."+cc+";\r\n"); +// } +// b.append(" default: return org.hl7.fhir.dstu3.model."+ctn+".NULL;\r\n"); +// b.append(" }\r\n"); +// b.append("}\r\n\r\n"); +// return b.toString(); +// } +// +// private void genInnerAbstract(ElementDefn n) throws IOException, Exception { +// String tn = typeNames.containsKey(n) ? typeNames.get(n) : javaClassName(n.getName()); +// String parent = n.typeCode(); +// String es = ""; +// write(" private static void copy"+tn+"(org.hl7.fhir.dstu3.model."+tn+" src, org.hl7.fhir.r5.model."+tn+" tgt) throws FHIRException {\r\n"); +// if (!Utilities.noString(parent)) +// write(" copy"+parent+"(src, tgt);\r\n"); +// es = processElements(n, n, es, "dstu3"); +// write(" }\r\n"); +// write(" private static void copy"+tn+"(org.hl7.fhir.r5.model."+tn+" src, org.hl7.fhir.dstu3.model."+tn+" tgt) throws FHIRException {\r\n"); +// if (!Utilities.noString(parent)) +// write(" copy"+parent+"(src, tgt);\r\n"); +// es = processElements(n, n, es, "r4"); +// write(" }\r\n"); +// write(es); +// } +// +// private String getCodeListType(String binding) throws IOException { +// StringBuilder b = new StringBuilder(); +// boolean up = true; +// for (char ch: binding.toCharArray()) { +// if (ch == '-' || ch == ' ') +// up = true; +// else if (up) { +// b.append(Character.toUpperCase(ch)); +// up = false; +// } +// else +// b.append(ch); +// } +// return b.toString(); +// } +// +// private void scanNestedTypes(ElementDefn root, String path, ElementDefn e) throws Exception { +// String tn = null; +// if (e.typeCode().equals("code") && e.hasBinding()) { +// BindingSpecification cd = e.getBinding(); +// if (cd != null && isEnum(cd)) { +// tn = getCodeListType(cd.getName()); +// if (!enumNames.contains(tn)) { +// enumNames.add(tn); +// enums.add(e); +// } +// if (Utilities.existsInList(tn, "AbstractType", "AdministrativeGender", "AgeUnits", "BindingStrength", "ConceptMapEquivalence", "DataAbsentReason", "DataType", "DocumentReferenceStatus", "FHIRAllTypes", "FHIRDefinedType", "MessageEvent", "NoteType", "PublicationStatus", "RemittanceOutcome", "ResourceType", "SearchParamType", "SpecialValues")) +// typeNames.put(e, "Enumerations."+upFirst(tn)); +// else +// typeNames.put(e, rootOf(path)+"."+upFirst(tn)); +// } +// } +// if (tn == null) { +// if (e.getTypes().size() > 0 && !e.usesCompositeType()) { +// tn = e.typeCode(); +// TypeRef tr = e.getTypes().get(0); +// if (tr.isUnboundGenericParam()) +// tn = genparam; +// else if (tr.isXhtml()) +// tn = "char[]"; +// else if (tr.isWildcardType()) +// tn ="Type"; +// else if (tn.equals("string")) +// tn = "String"; +// typeNames.put(e, tn); +// } else { +// if (e.usesCompositeType()) { +// tn = typeNames.get(getElementForPath(root, e.typeCode().substring(1))); +// typeNames.put(e, tn); +// } else { +// if (e.getDeclaredTypeName() != null) +// tn = e.getDeclaredTypeName(); +// else +// tn = upFirst(e.getName()); +// if (tn.equals("Element")) +// tn = "Element_"; +// if (!e.getName().equals("extension")) +// strucs.add(e); +// if (typeNameStrings.contains(tn)) { +// char i = 'A'; +// while (typeNameStrings.contains(tn+i)) +// i++; +// tn = tn + i; +// } +// typeNameStrings.add(tn); +// tn = path+"."+tn; +// typeNames.put(e, tn); +// for (ElementDefn c : e.getElements()) { +// scanNestedTypes(root, path, c); +// } +// } +// } +// } +// } +// +// +// private String rootOf(String path) { +// int i = path.indexOf('.'); +// return i == -1 ? path : path.substring(0, i); +// } +// +// private ElementDefn getElementForPath(ElementDefn root, String pathname) throws Exception { +// String[] path = pathname.split("\\."); +// if (!path[0].equals(root.getName())) +// throw new Exception("Element Path '"+pathname+"' is not legal in this context"); +// ElementDefn res = root; +// for (int i = 1; i < path.length; i++) +// { +// String en = path[i]; +// if (en.length() == 0) +// throw new Exception("Improper path "+pathname); +// ElementDefn t = res.getElementByName(definitions, en, true, false); +// if (t == null) { +// throw new Exception("unable to resolve "+pathname); +// } +// res = t; +// } +// return res; +// +// } +// +// +// +// private boolean isPrimitive(ElementDefn e) { +// return definitions.hasPrimitiveType(e.typeCode()); +// } +// + +} diff --git a/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/todo/JavaPatternImplGenerator.java b/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/todo/JavaPatternImplGenerator.java new file mode 100644 index 000000000..4d9c81444 --- /dev/null +++ b/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/todo/JavaPatternImplGenerator.java @@ -0,0 +1,904 @@ +package org.hl7.fhir.core.generator.codegen.todo; + +/* +Copyright (c) 2011+, HL7, Inc +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.TreeSet; + +import org.hl7.fhir.core.generator.codegen.Configuration; +import org.hl7.fhir.core.generator.codegen.JavaBaseGenerator; +import org.hl7.fhir.core.generator.codegen.JavaResourceGenerator; +import org.hl7.fhir.core.generator.codegen.JavaResourceGenerator.JavaGenClass; +import org.hl7.fhir.core.generator.engine.Definitions; +import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.Utilities; + +/* +changes for James +- lazy construction of lists +- getX will construct if null +- add hasX + +*/ +public class JavaPatternImplGenerator extends JavaBaseGenerator { + + public JavaPatternImplGenerator(OutputStream arg0, Definitions definitions, Configuration config, String version, Date genDate) + throws UnsupportedEncodingException { + super(arg0, definitions, config, version, genDate); + // TODO Auto-generated constructor stub + } +// +// private static final boolean HAPI_16 = true; +// private JavaGenClass clss; +// private Map adornments; +// private Map enumInfo; +// +// public JavaPatternImplGenerator(OutputStream out, Definitions definitions, Map adornments, Map enumInfo) throws UnsupportedEncodingException { +// super(out); +// this.definitions = definitions; +// this.adornments = adornments; +// this.enumInfo = enumInfo; +// } +// +// private Map typeNames = new HashMap(); +// private List typeNameStrings = new ArrayList(); +// private List enums = new ArrayList(); +// private List enumNames = new ArrayList(); +// private List strucs = new ArrayList(); +// private String classname; +// private String allfields; +// private long hashSum; +// private String inheritedHash; +// +// +// public Map getTypeNames() { +// return typeNames; +// } +// +// public void generate(ElementDefn root, String name, JavaGenClass clss, ProfiledType cd, Date genDate, String version, boolean isAbstract, Map nameToSearchParamDef, ElementDefn template, String patternName, ElementDefn impl) throws Exception { +// typeNames.clear(); +// typeNameStrings.clear(); +// enums.clear(); +// strucs.clear(); +// enumNames.clear(); +// this.clss = clss; +// +// boolean isRefType = root.getName().equals("Reference"); +// +//// ElementDefn elem = root.getElementByName("reference"); +//// elem.getTypes().get(0); +//// } +// +// write("package org.hl7.fhir.r5.patterns;\r\n"); +// startMark(version, genDate); +// if (clss != JavaGenClass.Constraint) { +// boolean l = true; // hasList(root); +// boolean h = hasXhtml(root); +// boolean d = hasDecimal(root); +// boolean s = hasString(root); +// boolean e = hasSharedEnums(root); +// if (l || h || d || e) { +// if (l) +// write("import java.util.*;\r\n"); +// if (h) { +// write("import org.hl7.fhir.utilities.xhtml.NodeType;\r\n"); +// write("import org.hl7.fhir.utilities.xhtml.XhtmlNode;\r\n"); +// } +// write("\r\n"); +// if (d) +// write("import java.math.*;\r\n"); +// if (s) +// write("import org.hl7.fhir.utilities.Utilities;\r\n"); +// if (e) +// write("import org.hl7.fhir.r5.model.Enumerations.*;\r\n"); +// } +// } +// write("import org.hl7.fhir.r5.model.*;\r\n"); +// write("import org.hl7.fhir.r5.model.Enumeration;\r\n"); +// write("import org.hl7.fhir.exceptions.FHIRException;\r\n"); +// +// classname = upFirst(name); +// String supertype = root.typeCode(); +// +// if (template != null) +// supertype = template.getName(); +// +// write("\r\n"); +// write("public class "+name+patternName+"Impl extends PatternBaseImpl implements "+patternName+" "); +// +// write("{\r\n"); +// write("\r\n"); +// +// write(" private "+name+" wrapped;\r\n"); +// write("\r\n"); +// write(" public "+name+patternName+"Impl("+name+" wrapped) {\r\n"); +// write(" super(wrapped);\r\n"); +// write(" this.wrapped = wrapped;\r\n"); +// write(" }\r\n"); +// write("\r\n"); +// +// +// if (clss != JavaGenClass.Constraint) { +// for (ElementDefn e : root.getElements()) { +// scanNestedTypes(root, root.getName(), e); +// } +//// for (ElementDefn e : enums) { +//// generateEnum(e, upFirst(name)); +//// } +// for (ElementDefn e : strucs) { +// generateType(e, clss == JavaGenClass.Resource ? JavaGenClass.BackboneElement : JavaGenClass.Structure, impl, name); +// } +// +// for (ElementDefn e : root.getElements()) { +// if (doGenerateAccessors(e)) +// generateAccessors(root, e, resolveTarget(root, e, impl), " ", patternName, name); +// } +// +// generateFhirType(name); +// } else { +// write(" private static final long serialVersionUID = "+inheritedHash+"L;\r\n\r\n"); +// } +// +// +// write("\r\n"); +// write("}\r\n"); +// write("\r\n"); +// flush(); +// } +// +// private boolean doGenerateAccessors(ElementDefn e) throws Exception { +// String gen = e.getMapping("http://hl7.org/fhir/object-implementation"); +// if (!e.isFromTemplate()) { +// if (gen == null) +// return true; +// else +// return !"no-gen-base".equals(gen); +// } else +// return true; +// } +// +// private void generateFhirType(String name) throws IOException { +// write(" public String fhirType() {\r\n return \""+name+"\";\r\n}\r\n\r\n"); +// } +// +// private String cleanSpName(String code) { +// StringBuilder b = new StringBuilder(); +// for (char c : code.toCharArray()) +// if (Character.isLetter(c)) { +// b.append(c); +// } else if (c == '-') { +// b.append('_'); +// } +// return b.toString(); +// } +// +// private String pipeSeparate(List paths) { +// StringBuilder b = new StringBuilder(); +// boolean first = true; +// for (String p : paths) { +// if (first) +// first = false; +// else +// b.append("|"); +// b.append(p); +// } +// return b.toString(); +// } +// +// private String asCommaText(List types) { +// CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(); +// Set tset = new HashSet(); +// for (TypeRef t : types) { +// if (!tset.contains(t.getName())) { +// b.append("\""+t.getName()+"\""); +// tset.add(t.getName()); +// } +// } +// return b.toString(); +// } +// +// private String propId(String name) { +// return Integer.toString(name.hashCode()); +// } +// +// +// private boolean isAbstract(String typeCode) { +// if (typeCode.equals("Resource")) +// return true; +// else +// return false; +// } +// +// private void generateConstructor(String className, List params, String indent) throws IOException { +// write(indent+"/**\r\n"); +// write(indent+" * Constructor\r\n"); +// write(indent+" */\r\n"); +// write(indent+" public "+className+"("); +// boolean first = true; +// for (ElementDefn e : params) { +// if (!first) +// write(", "); +// first = false; +// String tn = typeNames.get(e); +// String en = getElementName(e.getName(), true); +// write(tn +" "+en); +// } +// write(") {\r\n"); +// write(indent+" super();\r\n"); +// for (ElementDefn e : params) { +// String en = getElementName(e.getName(), true); +// write(indent+" this."+en+" = "+en+";\r\n"); +// } +// write(indent+" }\r\n\r\n"); +// } +// +// private String upFirst(String name) { +// return name.substring(0,1).toUpperCase()+name.substring(1); +// } +// +// private boolean hasList(ElementDefn root) { +// for (ElementDefn e : root.getElements()) { +// if (!e.getName().equals("text")) { +// if (e.unbounded() || hasListInner(e)) +// return true; +// } +// } +// return false; +// } +// +// private boolean hasDecimal(ElementDefn root) { +// for (ElementDefn e : root.getElements()) { +// if (e.typeCode().equals("decimal") || hasDecimalInner(e)) +// return true; +// } +// return false; +// } +// +// private boolean hasString(ElementDefn root) { +// for (ElementDefn e : root.getElements()) { +// if (Utilities.existsInList(e.typeCode(), "string", "id", "code", "uri", "oid", "uuid", "url", "canonical") || hasString(e)) +// return true; +// } +// return false; +// } +// +// private boolean hasSharedEnums(ElementDefn root) { +// for (ElementDefn e : root.getElements()) { +// if ((e.getBinding() != null && e.getBinding().isShared()) || hasSharedEnums(e)) +// return true; +// } +// return false; +// } +// +// private boolean hasXhtml(ElementDefn root) { +// for (ElementDefn e : root.getElements()) { +// if (e.isXhtmlElement() || hasXhtmlInner(e)) +// return true; +// } +// return false; +// } +// +// private boolean hasListInner(ElementDefn e) { +// for (ElementDefn c : e.getElements()) { +// if (c.unbounded() || hasListInner(c)) +// return true; +// } +// +// return false; +// } +// +// private boolean hasXhtmlInner(ElementDefn e) { +// for (ElementDefn c : e.getElements()) { +// if (c.isXhtmlElement() || hasXhtmlInner(c)) +// return true; +// } +// +// return false; +// } +// +// private boolean hasDecimalInner(ElementDefn e) { +// for (ElementDefn c : e.getElements()) { +// if (c.typeCode().equals("decimal") || hasDecimalInner(c)) +// return true; +// } +// +// return false; +// } +// +// +// private void generateType(ElementDefn e, JavaGenClass clss, ElementDefn impl, String resName) throws Exception { +// String tn = typeNames.get(e); +// +// write(" public class "+tn+"Impl extends PatternBaseImpl implements EventPerformerComponent {\r\n"); +// write(" private Element wrapped;\r\n"); +// write("\r\n"); +// write(" public "+tn+"Impl(Element wrapped) {\r\n"); +// write(" super(wrapped);\r\n"); +// write(" this.wrapped = wrapped;\r\n"); +// write(" }\r\n"); +// write("\r\n"); +// for (ElementDefn c : e.getElements()) { +// generateAccessors(e, c, resolveTarget(e, c, impl), " ", tn, resName); +// } +// write(" }\r\n"); +// write("\r\n"); +// +// } +// +// +// private ElementDefn resolveTarget(ElementDefn e, ElementDefn c, ElementDefn impl) { +// String path = e.getName()+"."+c.getName(); +// for (ElementDefn n : impl.getElements()) { +// String wm = getWorkflowMapping(n); +// if (wm != null && wm.equals(path)) +// return n; +// } +// return null; +// } +// +// private String getWorkflowMapping(ElementDefn n) { +// for (String m : n.getMappings().keySet()) { +// if ("http://hl7.org/fhir/workflow".equals(m)) +// return n.getMapping(m); +// } +// return null; +// } +// +// private void scanNestedTypes(ElementDefn root, String path, ElementDefn e) throws Exception { +// String tn = null; +// if (e.typeCode().equals("code") && e.hasBinding()) { +// BindingSpecification cd = e.getBinding(); +// if (cd != null && (cd.getBinding() == BindingSpecification.BindingMethod.CodeList)) { +// tn = getCodeListType(cd.getValueSet().getName()); +// if (!enumNames.contains(tn)) { +// enumNames.add(tn); +// enums.add(e); +// } +// typeNames.put(e, "Enumeration<"+tn+">"); +// } else if (isEnum(cd)) { +// tn = getCodeListType(cd.getName()); +// if (!enumNames.contains(tn)) { +// enumNames.add(tn); +// enums.add(e); +// } +// typeNames.put(e, "Enumeration<"+tn+">"); +// } +// } +// if (tn == null) { +// if (e.getTypes().size() > 0 && !e.usesCompositeType()) { +// tn = e.typeCode(); +//// if (clss != JavaGenClass.Resource) { +//// if (tn.equals("boolean")) tn = "Boolean"; +//// else if (tn.equals("integer")) tn = "Integer"; +//// else if (tn.equals("decimal")) tn = "Decimal"; +//// else if (tn.equals("base64Binary")) tn = "Base64Binary"; +//// else if (tn.equals("instant")) tn = "Instant"; +//// else if (tn.equals("string")) tn = "StringType"; +//// else if (tn.equals("uri")) tn = "Uri"; +//// else if (tn.equals("xml:lang")) tn = "Code"; +//// else if (tn.equals("code")) tn = "Code"; +//// else if (tn.equals("oid")) tn = "Oid"; +//// else if (tn.equals("uuid")) tn = "Uuid"; +//// else if (tn.equals("sid")) tn = "Sid"; +//// else if (tn.equals("id")) tn = "Id"; +//// else if (tn.equals("date")) tn = "Date"; +//// else if (tn.equals("dateTime")) tn = "DateTime"; +//// else +//// tn = getTypeName(e); +//// } else +// tn = getTypeName(e); +// if (e.typeCode().equals("xml:lang")) +// tn = "CodeType"; +// if (e.getTypes().get(0).isUnboundGenericParam()) +// tn = "T"; +// else if (e.isXhtmlElement()) +// tn = "XhtmlNode"; +// else if (e.getTypes().get(0).isWildcardType()) +// tn ="org.hl7.fhir.r5.model.Type"; +// else if (definitions.hasPrimitiveType(tn)) +// tn = upFirst(tn)+"Type"; +// +// typeNames.put(e, tn); +// } else { +// if (e.usesCompositeType()) { +// tn = typeNames.get(getElementForPath(root, e.typeCode().substring(1))); +// typeNames.put(e, tn); +//// } else if (e.getDeclaredTypeName() != null) { +//// tn = e.getDeclaredTypeName(); +//// typeNames.put(e, tn); +//// System.out.println(tn); +// } else { +// if (e.getDeclaredTypeName() != null) +// tn = e.getDeclaredTypeName(); +// else +// tn = getTitle(e.getName()); +// if (tn.equals("Element")) +// tn = "Element_"; +// strucs.add(e); +// if (typeNameStrings.contains(tn)) { +// char i = 'A'; +// while (typeNameStrings.contains(tn+i)) +// i++; +// tn = tn + i; +// } +// typeNames.put(e, tn); +// typeNameStrings.add(tn); +// for (ElementDefn c : e.getElements()) { +// scanNestedTypes(root, path+getTitle(e.getName()), c); +// } +// } +// } +// } +// } +// +// private Object getElementForPath(ElementDefn root, String pathname) throws Exception { +// String[] path = pathname.split("\\."); +// if (!path[0].equals(root.getName())) +// throw new Exception("Element Path '"+pathname+"' is not legal in this context"); +// ElementDefn res = root; +// for (int i = 1; i < path.length; i++) +// { +// String en = path[i]; +// if (en.length() == 0) +// throw new Exception("Improper path "+pathname); +// ElementDefn t = res.getElementByName(definitions, en, true, false); +// if (t == null) { +// throw new Exception("unable to resolve "+pathname); +// } +// res = t; +// } +// return res; +// +// } +// +// private String getCodeListType(String binding) { +// StringBuilder b = new StringBuilder(); +// boolean up = true; +// for (char ch: binding.toCharArray()) { +// if (ch == '-') +// up = true; +// else if (up) { +// b.append(Character.toUpperCase(ch)); +// up = false; +// } +// else +// b.append(ch); +// } +// return b.toString(); +// } +// +// private String getTypeClassList(ElementDefn e, String tn) throws Exception { +// CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(); +// for (TypeRef tr : e.getTypes()) { +// if (tr.isResourceReference()) { +// for (String p : tr.getParams()) +// if (p.equalsIgnoreCase("Any")) { +// b.append("Reference.class"); +// } else { +// if (p.equals("List")) +// b.append(p+"Resource.class"); +// else +// b.append(p+".class"); +// } +// } else if (definitions.hasPrimitiveType(tr.getName())) { +// b.append(upFirst(tr.getName())+"Type.class"); +// } else if (tr.getName().startsWith("@")){ +// b.append(tn+".class"); +// } else if (!tr.getName().equalsIgnoreCase("*") && !tr.getName().equalsIgnoreCase("xhtml")) { +// b.append(getTypename(tr)+".class"); +// } +// } +// return b.toString(); +// } +// +// private String getSimpleType(String n) { +// if (n.equals("StringType")) +// return "String"; +// if (n.equals("CodeType")) +// return "String"; +// if (n.equals("MarkdownType")) +// return "String"; +// if (n.equals("Base64BinaryType")) +// return "byte[]"; +// if (n.equals("UriType")) +// return "String"; +// if (n.equals("UrlType")) +// return "String"; +// if (n.equals("CanonicalType")) +// return "String"; +// if (n.equals("OidType")) +// return "String"; +// if (n.equals("IntegerType")) +// return "int"; +// if (n.equals("UnsignedIntType")) +// return "int"; +// if (n.equals("PositiveIntType")) +// return "int"; +// if (n.equals("BooleanType")) +// return "boolean"; +// if (n.equals("DecimalType")) +// return "BigDecimal"; +// if (n.equals("DateTimeType")) +// return "Date"; +// if (n.equals("DateType")) +// return "Date"; +// if (n.equals("IdType")) +// return "String"; +// if (n.equals("InstantType")) +// return "Date"; +// if (n.equals("TimeType")) +// return "String"; +// +// String tns = null; +// if (n.indexOf("<") > 0) { +// tns = n.substring(n.indexOf("<")+1); +// tns = tns.substring(0, tns.length()-1); +// } +// +// if (tns != null && enumNames.contains(tns)) +// return tns; +// +// return "??"; +// } +// private void generateAccessors(ElementDefn root, ElementDefn e, ElementDefn impl, String indent, String className, String resName) throws Exception { +// String tn = typeNames.get(e); +// +// boolean isReferenceRefField = (root.getName().equals("Reference") && e.getName().equals("reference")); +// String cvtB = getConversion1(e, impl); +// String cvtR = getConversion2(e, impl); +// String cvtE = Utilities.noString(cvtB) ? "" : ")"; +// +// String simpleType = getSimpleType(tn); +// write(indent+"public int get"+getTitle(getElementName(e.getName(), false))+"Min() {\r\n"); +// if (impl == null) +// write(indent+" return 0;\r\n"); +// else +// write(indent+" return "+impl.getMinCardinality()+";\r\n"); +// write(indent+"}\r\n\r\n"); +// write(indent+"public int get"+getTitle(getElementName(e.getName(), false))+"Max() {\r\n"); +// if (impl == null) +// write(indent+" return 0;\r\n"); +// else +// write(indent+" return "+impl.getMaxCardinality()+";\r\n"); +// write(indent+"}\r\n\r\n"); +// if (e.unbounded()) { +// /* +// * getXXX()for repeatable type +// */ +// String listGenericType; +// if (tn == null && e.usesCompositeType()) { +// listGenericType = root.getName(); +// } else { +// listGenericType = tn; +// } +// write(indent+"public List<"+listGenericType+"> get"+getTitle(getElementName(e.getName(), false))+"() throws FHIRException {\r\n"); +// if (impl == null) +// write(indent+" throw new FHIRException(\"The pattern property '"+e.getName()+"' is not supported in '"+resName+"'\");\r\n"); +// else if (impl.unbounded()) +// write(indent+" return wrapped.get"+getTitle(getElementName(impl.getName(), false))+"();\r\n"); +// else { +// write(indent+" ArrayList<"+listGenericType+"> list = new ArrayList<"+listGenericType+">();\r\n"); +// write(indent+" list.add("+cvtB+"wrapped.get"+getTitle(getElementName(impl.getName(), false))+"()"+cvtE+");\r\n"); +// write(indent+" return list;\r\n"); +// } +// write(indent+"}\r\n\r\n"); +// +// /* +// * setXXX(List) for repeating type +// */ +// write(indent+"public " + className + " set"+getTitle(getElementName(e.getName(), false))+"(" + "List<"+listGenericType+"> the" + getTitle(getElementName(e.getName(), false)) + ") throws FHIRException {\r\n\r\n"); +// if (impl == null) +// write(indent+" throw new FHIRException(\"The pattern property '"+e.getName()+"' is not supported in '"+resName+"'\");\r\n"); +// else { +// if (impl.unbounded()) +// write(indent+" wrapped.set"+getTitle(getElementName(impl.getName(), false))+"("+cvtR+"the" + getTitle(getElementName(e.getName(), false)) + ""+cvtE+");\r\n"); +// else +// write(indent+" wrapped.set"+getTitle(getElementName(impl.getName(), false))+"("+cvtR+"the" + getTitle(getElementName(e.getName(), false)) + ".get(0)"+cvtE+");\r\n"); +// write(indent+" return this;\r\n\r\n"); +// } +// write(indent+"}\r\n\r\n"); +// +// /* +// * hasXXX() for repeatable type +// */ +// write(indent+"public boolean has"+getTitle(getElementName(e.getName(), false))+"() {\r\n"); +// if (impl == null) +// write(indent+" return false;\r\n"); +// else +// write(indent+" return wrapped.has"+getTitle(getElementName(impl.getName(), false))+"();\r\n"); +// write(indent+"}\r\n\r\n"); +// +// write("\r\n"); +// if (e.getTypes().size() == 1 && (definitions.getPrimitives().containsKey(e.typeCode()) || e.typeCode().equals("xml:lang") || e.typeCode().startsWith("canonical("))) { +// /* +// * addXXXElement() for repeatable primitive +// */ +// write(indent+"public "+tn+" add"+getTitle(getElementName(e.getName(), false))+"Element() throws FHIRException {\r\n"); +// write(indent+" throw new FHIRException(\"The pattern property '"+e.getName()+"' is not supported in '"+resName+"'\");\r\n"); +// write(indent+"}\r\n\r\n"); +// write("\r\n"); +// +// /* +// * addXXX(foo) for repeatable primitive +// */ +// write(indent+"public "+className+" add"+getTitle(getElementName(e.getName(), false))+"("+simpleType+" value) throws FHIRException {\r\n"); +// write(indent+" throw new FHIRException(\"The pattern property '"+e.getName()+"' is not supported in '"+resName+"'\");\r\n"); +// write(indent+"}\r\n\r\n"); +// write("\r\n"); +// +// /* +// * hasXXX(foo) for repeatable primitive +// */ +// write(indent+"public boolean has"+getTitle(getElementName(e.getName(), false))+"("+simpleType+" value) {\r\n"); +// if (impl == null) +// write(indent+" return false;\r\n"); +// else +// write(indent+" return wrapped.has"+getTitle(getElementName(impl.getName(), false))+"(value);\r\n"); +// write(indent+"}\r\n\r\n"); +// write("\r\n"); +// } else { +// if (!definitions.getBaseResources().containsKey(tn)) { +// /* +// * addXXX() for repeatable composite +// */ +// write(indent+"public "+tn+" add"+getTitle(getElementName(e.getName(), false))+"() throws FHIRException {\r\n"); +// write(indent+" throw new FHIRException(\"The pattern property '"+e.getName()+"' is not supported in '"+resName+"'\");\r\n"); +// write(indent+"}\r\n\r\n"); +// write("\r\n"); +// +// /* +// * addXXX(foo) for repeatable composite +// */ +// write(indent+"public "+className+" add"+getTitle(getElementName(e.getName(), false))+"("+tn+" t) throws FHIRException {\r\n"); +// write(indent+" throw new FHIRException(\"The pattern property '"+e.getName()+"' is not supported in '"+resName+"'\");\r\n"); +// write(indent+"}\r\n\r\n"); +// write("\r\n"); +// } else { +// /* +// * addXXX(foo) for repeatable composite +// */ +// write(indent+"public "+className+" add"+getTitle(getElementName(e.getName(), false))+"("+tn+" t) throws FHIRException {\r\n"); +// write(indent+" throw new FHIRException(\"The pattern property '"+e.getName()+"' is not supported in '"+resName+"'\");\r\n"); +// write(indent+"}\r\n\r\n"); +// write("\r\n"); +// } +// +// /* +// * getXXXFirstRep() for repeatable element +// */ +// if (!"DomainResource".equals(className)) { +// write(indent+"public "+tn+" get"+getTitle(getElementName(e.getName(), false))+"FirstRep() throws FHIRException {\r\n\r\n"); +// if (impl == null) +// write(indent+" throw new FHIRException(\"The pattern property '"+e.getName()+"' is not supported in '"+resName+"'\");\r\n"); +// else if (impl.unbounded()) +// write(indent+" return "+cvtB+"wrapped.get"+getTitle(getElementName(impl.getName(), false))+"FirstRep()"+cvtE+";\r\n"); +// else +// write(indent+" return "+cvtB+"wrapped.get"+getTitle(getElementName(impl.getName(), false))+"()"+cvtE+";\r\n"); +// write(indent+"}\r\n\r\n"); +// } +// } +// } else { +// if (isJavaPrimitive(e) || (e.getTypes().size() == 1 && e.typeCode().startsWith("canonical("))) { +// if (isReferenceRefField) { +// /* +// * Reference#getReferenceElement is defined differently in BaseReference.java? +// */ +// write(indent+"public "+tn+" get"+getTitle(getElementName(e.getName(), false))+"Element_() throws FHIRException {\r\n"); +// if (impl == null) +// write(indent+" throw new FHIRException(\"The pattern property '"+e.getName()+"' is not supported in '"+resName+"'\");\r\n"); +// else if (impl.unbounded()) +// write(indent+" return "+cvtB+"wrapped.get"+getTitle(getElementName(impl.getName(), false))+"ElementFirstRep()"+cvtE+";\r\n"); +// else +// write(indent+" return "+cvtB+"wrapped.get"+getTitle(getElementName(impl.getName(), false))+"Element_()"+cvtE+";\r\n"); +// write(indent+"}\r\n\r\n"); +// } else { +// write(indent+"public "+tn+" get"+getTitle(getElementName(e.getName(), false))+"Element() throws FHIRException {\r\n"); +// if (impl == null) +// write(indent+" throw new FHIRException(\"The pattern property '"+e.getName()+"' is not supported in '"+resName+"'\");\r\n"); +// else if (impl.unbounded()) +// write(indent+" return "+cvtB+"wrapped.get"+getTitle(getElementName(impl.getName(), false))+"ElementFirstRep()"+cvtE+";\r\n"); +// else +// write(indent+" return "+cvtB+"wrapped.get"+getTitle(getElementName(impl.getName(), false))+"Element()"+cvtE+";\r\n"); +// write(indent+"}\r\n\r\n"); +// } +// write("\r\n"); +// +// write(indent+"public boolean has"+getTitle(getElementName(e.getName(), false))+"Element() {\r\n"); +// if (impl == null) +// write(indent+" return false;\r\n"); +// else +// write(indent+" return wrapped.has"+getTitle(getElementName(impl.getName(), false))+"Element();\r\n"); +// write(indent+"}\r\n\r\n"); +// write("\r\n"); +// write(indent+"public boolean has"+getTitle(getElementName(e.getName(), false))+"() {\r\n"); +// if (impl == null) +// write(indent+" return false;\r\n"); +// else +// write(indent+" return wrapped.has"+getTitle(getElementName(impl.getName(), false))+"();\r\n"); +// write(indent+"}\r\n\r\n"); +// write("\r\n"); +// write(indent+"public "+className+" set"+getTitle(getElementName(e.getName(), false))+"Element("+tn+" value) throws FHIRException {\r\n"); +// if (impl == null) +// write(indent+" throw new FHIRException(\"The pattern property '"+e.getName()+"' is not supported in '"+resName+"'\");\r\n"); +// else { +// if (impl.unbounded()) { +// write(indent+" wrapped.set"+getTitle(getElementName(impl.getName(), false))+"Element(value);\r\n"); +// } else { +// write(indent+" wrapped.set"+getTitle(getElementName(impl.getName(), false))+"Element(value);\r\n"); +// } +// write(indent+" return this;\r\n\r\n"); +// } +// write(indent+"}\r\n\r\n"); +// write("\r\n"); +// write(indent+"public "+simpleType+" get"+getTitle(getElementName(e.getName(), false))+"() throws FHIRException {\r\n"); +// if (impl == null) +// write(indent+" throw new FHIRException(\"The pattern property '"+e.getName()+"' is not supported in '"+resName+"'\");\r\n"); +// else if (impl.unbounded()) +// write(indent+" return "+cvtB+"wrapped.get"+getTitle(getElementName(impl.getName(), false))+"FirstRep()"+cvtE+";\r\n"); +// else +// write(indent+" return "+cvtB+"wrapped.get"+getTitle(getElementName(impl.getName(), false))+"()"+cvtE+";\r\n"); +// write(indent+"}\r\n\r\n"); +// generateSetter(e, indent, className, tn, simpleType, impl, resName, cvtR, cvtE); +// +// // BigDecimal sugar methods +// if (simpleType.equals("BigDecimal")) { +// generateSetter(e, indent, className, tn, "long", impl, resName, cvtR, cvtE); +// generateSetter(e, indent, className, tn, "double", impl, resName, cvtR, cvtE); +// } +// +// } else { +// write(indent+"public "+tn+" get"+getTitle(getElementName(e.getName(), false))+"() throws FHIRException {\r\n"); +// if (impl == null) +// write(indent+" throw new FHIRException(\"The pattern property '"+e.getName()+"' is not supported in '"+resName+"'\");\r\n"); +// else if (impl.unbounded()) +// write(indent+" return "+cvtB+"wrapped.get"+getTitle(getElementName(impl.getName(), false))+(isPrimitive(impl.typeCode()) ? "Element" : "")+"FirstRep()"+cvtE+";\r\n"); +// else +// write(indent+" return "+cvtB+"wrapped.get"+getTitle(getElementName(impl.getName(), false))+(isPrimitive(impl.typeCode()) ? "Element" : "")+"()"+cvtE+";\r\n"); +// write(indent+"}\r\n\r\n"); +// if (e.getTypes().size() > 1 && (tn.equals("Type") || !tn.endsWith(".Type"))) { +// for (TypeRef t : e.getTypes()) { +// String ttn = getTypename(t); +// TypeRef ti = impl == null ? null : getTypeFromImplementation(impl, t); +// write(indent+"public "+ttn+" get"+getTitle(getElementName(e.getName(), false))+ttn+"() throws FHIRException {\r\n"); +// if (impl == null) +// write(indent+" throw new FHIRException(\"The pattern property '"+e.getName()+"' is not supported in '"+resName+"'\");\r\n"); +// else if (ti == null) +// write(indent+" throw new FHIRException(\"The pattern property '"+e.getName()+"' does not support the type '"+ttn+"' for the resource '"+resName+"'\");\r\n"); +// else +// write(indent+" return "+cvtB+"wrapped.get"+getTitle(getElementName(impl.getName(), false))+ttn+"()"+cvtE+";\r\n"); +// write(indent+"}\r\n\r\n"); +// write(indent+"public boolean has"+getTitle(getElementName(e.getName(), false))+ttn+"() { \r\n"); +// if (impl == null || ti == null) +// write(indent+" return false;\r\n"); +// else +// write(indent+" return wrapped.has"+getTitle(getElementName(impl.getName(), false))+ttn+"(); // tt2\r\n"); +// write(indent+"}\r\n\r\n"); +// } +// } +// write(indent+"public boolean has"+getTitle(getElementName(e.getName(), false))+"() {\r\n"); +// if (impl == null) +// write(indent+" return false;\r\n"); +// else +// write(indent+" return wrapped.has"+getTitle(getElementName(impl.getName(), false))+"();\r\n"); +// write(indent+"}\r\n\r\n"); +// write(indent+"public "+className+" set"+getTitle(getElementName(e.getName(), false))+"("+tn+" value) throws FHIRException {\r\n"); if (impl == null) +// write(indent+" throw new FHIRException(\"The pattern property '"+e.getName()+"' is not supported in '"+resName+"'\");\r\n"); +// else { +// if (impl.unbounded()) { +// write(indent+" wrapped.get"+getTitle(getElementName(impl.getName(), false))+"().clear();\r\n"); +// write(indent+" if (value != null)\r\n"); +// write(indent+" wrapped.get"+getTitle(getElementName(impl.getName(), false))+"().add(value);\r\n"); +// } else +// write(indent+" wrapped.set"+getTitle(getElementName(impl.getName(), false))+"(value);\r\n"); +// write(indent+" return this;\r\n\r\n"); +// } +// write(indent+"}\r\n\r\n"); +// if (e.getTypes().size() == 1 && e.typeCode().startsWith("Reference(")) { +// List params = e.getTypes().get(0).getParams(); +// String rn = params.size() == 1 ? params.get(0) : "Resource"; +// if (rn.equals("Any")) +// rn = "Resource"; +// else if (rn.equals("List")) +// rn = "ListResource"; +// } +// } +// } +// +// } +// +// private TypeRef getTypeFromImplementation(ElementDefn impl, TypeRef t) { +// for (TypeRef ti : impl.getTypes()) { +// if (ti.getName().equals(t.getName())) +// return ti; +// } +// return null; +// } +// +// private String getConversion1(ElementDefn e, ElementDefn impl) { +// if ( e == null || e.getTypes().size() != 1 || impl == null || impl.getTypes().size() != 1) +// return ""; +// String tp = e.getTypes().get(0).getName(); +// String ti = impl.getTypes().get(0).getName(); +// if (tp.equals(ti)) +// return ""; +// return "convert"+Utilities.capitalize(ti)+"To"+Utilities.capitalize(tp)+"("; +// } +// +// private String getConversion2(ElementDefn e, ElementDefn impl) { +// if ( e == null || e.getTypes().size() != 1 || impl == null || impl.getTypes().size() != 1) +// return ""; +// String tp = e.getTypes().get(0).getName(); +// String ti = impl.getTypes().get(0).getName(); +// if (tp.equals(ti)) +// return ""; +// return "convert"+Utilities.capitalize(tp)+"To"+Utilities.capitalize(ti)+"("; +// } +// +// private void generateSetter(ElementDefn e, String indent, String className, String tn, String simpleType, ElementDefn impl, String resName, String cvtR, String cvtE) throws IOException { +// write(indent+"public "+className+" set"+getTitle(getElementName(e.getName(), false))+"("+simpleType+" value) throws FHIRException {\r\n"); +// if (impl == null) +// write(indent+" throw new FHIRException(\"The pattern property '"+e.getName()+"' is not supported in '"+resName+"'\");\r\n"); +// else { +// if (impl.unbounded()) { +// write(indent+" wrapped.get"+getTitle(getElementName(impl.getName(), false))+"().clear();\r\n"); +// write(indent+" if (value != null)\r\n"); +// write(indent+" wrapped.set"+getTitle(getElementName(impl.getName(), false))+"("+cvtR+"value"+cvtE+");\r\n"); +// } else { +// write(indent+" wrapped.set"+getTitle(getElementName(impl.getName(), false))+"("+cvtR+"value"+cvtE+");\r\n"); +// } +// write(indent+" return this;\r\n\r\n"); +// } +// write("}\r\n\r\n"); +// } +// +// private boolean isString(String tn) { +// return tn.equals("StringType") || tn.equals("CodeType") || tn.equals("IdType") || tn.equals("UriType") || tn.equals("OidType") || tn.equals("CanonicalType") || tn.equals("UrlType") || tn.equals("UuidType"); +// } +// +// public long getHashSum() { +// return hashSum; +// } +// +// public void setInheritedHash(String value) { +// inheritedHash = value; +// +// } +// + +} diff --git a/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/todo/JavaPatternIntfGenerator.java b/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/todo/JavaPatternIntfGenerator.java new file mode 100644 index 000000000..01db40422 --- /dev/null +++ b/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/codegen/todo/JavaPatternIntfGenerator.java @@ -0,0 +1,1069 @@ +package org.hl7.fhir.core.generator.codegen.todo; + +/* +Copyright (c) 2011+, HL7, Inc +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of HL7 nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.TreeSet; + +import org.hl7.fhir.core.generator.codegen.Configuration; +import org.hl7.fhir.core.generator.codegen.JavaBaseGenerator; +import org.hl7.fhir.core.generator.codegen.JavaResourceGenerator; +import org.hl7.fhir.core.generator.codegen.JavaResourceGenerator.JavaGenClass; +import org.hl7.fhir.core.generator.engine.Definitions; +import org.hl7.fhir.utilities.CommaSeparatedStringBuilder; +import org.hl7.fhir.utilities.Utilities; + + +/* +changes for James +- lazy construction of lists +- getX will construct if null +- add hasX + +*/ +public class JavaPatternIntfGenerator extends JavaBaseGenerator { + + public JavaPatternIntfGenerator(OutputStream arg0, Definitions definitions, Configuration config, String version, Date genDate) + throws UnsupportedEncodingException { + super(arg0, definitions, config, version, genDate); + // TODO Auto-generated constructor stub + } +// +// /** +// * This property should be committed with a value of false +// * until HAPI 1.6 is released, at which point it will be +// * removed. Added by JA 2016-05-28 +// */ +// private static final boolean HAPI_16 = true; +// +// private JavaGenClass clss; +// private Map adornments; +// private Map enumInfo; +// +// public JavaPatternIntfGenerator(OutputStream out, Definitions definitions, Map adornments, Map enumInfo) throws UnsupportedEncodingException { +// super(out); +// this.definitions = definitions; +// this.adornments = adornments; +// this.enumInfo = enumInfo; +// } +// +// private Map typeNames = new HashMap(); +// private List typeNameStrings = new ArrayList(); +// private List enums = new ArrayList(); +// private List enumNames = new ArrayList(); +// private List strucs = new ArrayList(); +// private String classname; +// private long hashSum; +// private String inheritedHash; +// +// +// public Map getTypeNames() { +// return typeNames; +// } +// +// public void generate(ElementDefn root, String name, JavaGenClass clss, ProfiledType cd, Date genDate, String version, boolean isAbstract, Map nameToSearchParamDef, ElementDefn template) throws Exception { +// typeNames.clear(); +// typeNameStrings.clear(); +// enums.clear(); +// strucs.clear(); +// enumNames.clear(); +// this.clss = clss; +// +// +//// ElementDefn elem = root.getElementByName("reference"); +//// elem.getTypes().get(0); +//// } +// +// write("package org.hl7.fhir.r5.patterns;\r\n"); +// startMark(version, genDate); +// write("import org.hl7.fhir.r5.model.*;\r\n"); +// write("import org.hl7.fhir.r5.model.Enumeration;\r\n"); +// if (clss != JavaGenClass.Constraint) { +// boolean l = true; // hasList(root); +// boolean h = hasXhtml(root); +// boolean d = hasDecimal(root); +// boolean s = hasString(root); +// boolean e = hasSharedEnums(root); +// if (l || h || d || e) { +// if (l) +// write("import java.util.*;\r\n"); +// if (h) { +// write("import org.hl7.fhir.utilities.xhtml.NodeType;\r\n"); +// write("import org.hl7.fhir.utilities.xhtml.XhtmlNode;\r\n"); +// } +// write("\r\n"); +// if (d) +// write("import java.math.*;\r\n"); +// if (s) +// write("import org.hl7.fhir.utilities.Utilities;\r\n"); +// if (e) +// write("import org.hl7.fhir.r5.model.Enumerations.*;\r\n"); +// } +// } +// write("import org.hl7.fhir.exceptions.FHIRException;\r\n"); +// +// classname = upFirst(name); +// if (adornments.containsKey(classname+".imports")) { +// write("// added from java-adornments.txt:\r\n"); +// write(adornments.get(classname+".imports")+"\r\n"); +// write("// end addition\r\n"); +// } +// jdoc("", root.getDefinition()); +// +// write("public interface "+upFirst(name)+" extends PatternBase "); +// +// write("{\r\n"); +// write("\r\n"); +// +// if (clss != JavaGenClass.Constraint) { +// for (ElementDefn e : root.getElements()) { +// scanNestedTypes(root, root.getName(), e); +// } +// for (ElementDefn e : enums) { +// generateEnum(e, upFirst(name)); +// } +// for (ElementDefn e : strucs) { +// generateType(e, clss == JavaGenClass.Resource ? JavaGenClass.BackboneElement : JavaGenClass.Structure); +// } +// +// for (ElementDefn e : root.getElements()) { +// if (doGenerateAccessors(e)) +// generateAccessors(root, e, " ", upFirst(name)); +// } +// +// generateTypeSpecificAccessors(name); +// generateFhirType(root.getName()); +// } else { +// write(" private static final long serialVersionUID = "+inheritedHash+"L;\r\n\r\n"); +// } +// +// +// if (adornments.containsKey(classname)) { +// write("// added from java-adornments.txt:\r\n"); +// write(adornments.get(classname)+"\r\n"); +// write("// end addition\r\n"); +// } +// write("\r\n"); +// write("}\r\n"); +// write("\r\n"); +// flush(); +// } +// +// private boolean doGenerateAccessors(ElementDefn e) throws Exception { +// String gen = e.getMapping("http://hl7.org/fhir/object-implementation"); +// if (!e.isFromTemplate()) { +// if (gen == null) +// return true; +// else +// return !"no-gen-base".equals(gen); +// } else +// return true; +// } +// +// +// private void generateTypeSpecificAccessors(String name) throws IOException { +// if (upFirst(name).equals("DomainResource")) { +// write(" /**\r\n"); +// write(" * Returns a list of extensions from this element which have the given URL. Note that\r\n"); +// write(" * this list may not be modified (you can not add or remove elements from it)\r\n"); +// write(" */\r\n"); +// write(" public List getExtensionsByUrl(String theUrl) {\r\n"); +// write(" org.apache.commons.lang3.Validate.notBlank(theUrl, \"theUrl must be provided with a value\");\r\n"); +// write(" ArrayList retVal = new ArrayList();\r\n"); +// write(" for (Extension next : getExtension()) {\r\n"); +// write(" if (theUrl.equals(next.getUrl())) {\r\n"); +// write(" retVal.add(next);\r\n"); +// write(" }\r\n"); +// write(" }\r\n"); +// write(" return Collections.unmodifiableList(retVal);\r\n"); +// write(" }\r\n"); +// write("\r\n"); +// write(" /**\r\n"); +// write(" * Returns a list of modifier extensions from this element which have the given URL. Note that\r\n"); +// write(" * this list may not be modified (you can not add or remove elements from it)\r\n"); +// write(" */\r\n"); +// write(" public List getModifierExtensionsByUrl(String theUrl) {\r\n"); +// write(" org.apache.commons.lang3.Validate.notBlank(theUrl, \"theUrl must be provided with a value\");\r\n"); +// write(" ArrayList retVal = new ArrayList();\r\n"); +// write(" for (Extension next : getModifierExtension()) {\r\n"); +// write(" if (theUrl.equals(next.getUrl())) {\r\n"); +// write(" retVal.add(next);\r\n"); +// write(" }\r\n"); +// write(" }\r\n"); +// write(" return Collections.unmodifiableList(retVal);\r\n"); +// write(" }\r\n"); +// write("\r\n"); +// } +// if (upFirst(name).equals("Element")) { +// write(" /**\r\n"); +// write(" * Returns an unmodifiable list containing all extensions on this element which \r\n"); +// write(" * match the given URL.\r\n"); +// write(" * \r\n"); +// write(" * @param theUrl The URL. Must not be blank or null.\r\n"); +// write(" * @return an unmodifiable list containing all extensions on this element which \r\n"); +// write(" * match the given URL\r\n"); +// write(" */\r\n"); +// write(" public List getExtensionsByUrl(String theUrl) {\r\n"); +// write(" org.apache.commons.lang3.Validate.notBlank(theUrl, \"theUrl must not be blank or null\");\r\n"); +// write(" ArrayList retVal = new ArrayList();\r\n"); +// write(" for (Extension next : getExtension()) {\r\n"); +// write(" if (theUrl.equals(next.getUrl())) {\r\n"); +// write(" retVal.add(next);\r\n"); +// write(" }\r\n"); +// write(" }\r\n"); +// write(" return java.util.Collections.unmodifiableList(retVal);\r\n"); +// write(" }\r\n"); +// write(" public boolean hasExtension(String theUrl) {\r\n"); +// write(" return !getExtensionsByUrl(theUrl).isEmpty(); \r\n"); +// write(" }\r\n"); +// write("\r\n"); +// write(" public String getExtensionString(String theUrl) throws FHIRException {\r\n"); +// write(" List ext = getExtensionsByUrl(theUrl); \r\n"); +// write(" if (ext.isEmpty()) \r\n"); +// write(" return null; \r\n"); +// write(" if (ext.size() > 1) \r\n"); +// write(" throw new FHIRException(\"Multiple matching extensions found\");\r\n"); +// write(" if (!ext.get(0).getValue().isPrimitive())\r\n"); +// write(" throw new FHIRException(\"Extension could not be converted to a string\");\r\n"); +// write(" return ext.get(0).getValue().primitiveValue();\r\n"); +// write(" }\r\n"); +// write("\r\n"); +// } +// if (upFirst(name).equals("Bundle") || upFirst(name).equals("BundleEntryComponent")) { +// write(" /**\r\n"); +// write(" * Returns the {@link #getLink() link} which matches a given {@link BundleLinkComponent#getRelation() relation}. \r\n"); +// write(" * If no link is found which matches the given relation, returns null. If more than one\r\n"); +// write(" * link is found which matches the given relation, returns the first matching BundleLinkComponent.\r\n"); +// write(" * \r\n"); +// write(" * @param theRelation\r\n"); +// write(" * The relation, such as \"next\", or \"self. See the constants such as {@link IBaseBundle#LINK_SELF} and {@link IBaseBundle#LINK_NEXT}.\r\n"); +// write(" * @return Returns a matching BundleLinkComponent, or null\r\n"); +// write(" * @see IBaseBundle#LINK_NEXT\r\n"); +// write(" * @see IBaseBundle#LINK_PREV\r\n"); +// write(" * @see IBaseBundle#LINK_SELF\r\n"); +// write(" */\r\n"); +// write(" public BundleLinkComponent getLink(String theRelation) {\r\n"); +// write(" org.apache.commons.lang3.Validate.notBlank(theRelation, \"theRelation may not be null or empty\");\r\n"); +// write(" for (BundleLinkComponent next : getLink()) {\r\n"); +// write(" if (theRelation.equals(next.getRelation())) {\r\n"); +// write(" return next;\r\n"); +// write(" }\r\n"); +// write(" }\r\n"); +// write(" return null;\r\n"); +// write(" }\r\n"); +// write("\r\n"); +// write(" /**\r\n"); +// write(" * Returns the {@link #getLink() link} which matches a given {@link BundleLinkComponent#getRelation() relation}. \r\n"); +// write(" * If no link is found which matches the given relation, creates a new BundleLinkComponent with the\r\n"); +// write(" * given relation and adds it to this Bundle. If more than one\r\n"); +// write(" * link is found which matches the given relation, returns the first matching BundleLinkComponent.\r\n"); +// write(" * \r\n"); +// write(" * @param theRelation\r\n"); +// write(" * The relation, such as \"next\", or \"self. See the constants such as {@link IBaseBundle#LINK_SELF} and {@link IBaseBundle#LINK_NEXT}.\r\n"); +// write(" * @return Returns a matching BundleLinkComponent, or null\r\n"); +// write(" * @see IBaseBundle#LINK_NEXT\r\n"); +// write(" * @see IBaseBundle#LINK_PREV\r\n"); +// write(" * @see IBaseBundle#LINK_SELF\r\n"); +// write(" */\r\n"); +// write(" public BundleLinkComponent getLinkOrCreate(String theRelation) {\r\n"); +// write(" org.apache.commons.lang3.Validate.notBlank(theRelation, \"theRelation may not be null or empty\");\r\n"); +// write(" for (BundleLinkComponent next : getLink()) {\r\n"); +// write(" if (theRelation.equals(next.getRelation())) {\r\n"); +// write(" return next;\r\n"); +// write(" }\r\n"); +// write(" }\r\n"); +// write(" BundleLinkComponent retVal = new BundleLinkComponent();\r\n"); +// write(" retVal.setRelation(theRelation);\r\n"); +// write(" getLink().add(retVal);\r\n"); +// write(" return retVal;\r\n"); +// write(" }\r\n"); +// write(""); +// } +// if (upFirst(name).equals("HumanName")) { +// write(" /**\r\n"); +// write(" /**\r\n"); +// write(" * Returns all repetitions of {@link #getGiven() given name} as a space separated string\r\n"); +// write(" * \r\n"); +// write(" * @see DatatypeUtil#joinStringsSpaceSeparated(List)\r\n"); +// write(" */\r\n"); +// write(" public String getGivenAsSingleString() {\r\n"); +// write(" return joinStringsSpaceSeparated(getGiven());\r\n"); +// write(" }\r\n"); +// write("\r\n"); +// write(" /**\r\n"); +// write(" * Returns all repetitions of {@link #getPrefix() prefix name} as a space separated string\r\n"); +// write(" * \r\n"); +// write(" * @see DatatypeUtil#joinStringsSpaceSeparated(List)\r\n"); +// write(" */\r\n"); +// write(" public String getPrefixAsSingleString() {\r\n"); +// write(" return joinStringsSpaceSeparated(getPrefix());\r\n"); +// write(" }\r\n"); +// write("\r\n"); +// write(" /**\r\n"); +// write(" * Returns all repetitions of {@link #getSuffix() suffix} as a space separated string\r\n"); +// write(" * \r\n"); +// write(" * @see DatatypeUtil#joinStringsSpaceSeparated(List)\r\n"); +// write(" */\r\n"); +// write(" public String getSuffixAsSingleString() {\r\n"); +// write(" return joinStringsSpaceSeparated(getSuffix());\r\n"); +// write(" }\r\n"); +// write("\r\n"); +// write(" /**\r\n"); +// write(" * Returns all of the components of the name (prefix, given, family, suffix) as a single string with a single spaced\r\n"); +// write(" * string separating each part.\r\n"); +// write(" *

\r\n"); +// write(" * If none of the parts are populated, returns the {@link #getTextElement() text} element value instead.\r\n"); +// write(" *

\r\n"); +// write(" */\r\n"); +// write(" public String getNameAsSingleString() {\r\n"); +// write(" List nameParts = new ArrayList();\r\n"); +// write(" nameParts.addAll(getPrefix());\r\n"); +// write(" nameParts.addAll(getGiven());\r\n"); +// write(" nameParts.add(getFamilyElement());\r\n"); +// write(" nameParts.addAll(getSuffix());\r\n"); +// write(" if (nameParts.size() > 0) {\r\n"); +// write(" return joinStringsSpaceSeparated(nameParts);\r\n"); +// write(" } else {\r\n"); +// write(" return getTextElement().getValue();\r\n"); +// write(" }\r\n"); +// write(" }\r\n"); +// write("\r\n"); +// write(" /**\r\n"); +// write(" * Joins a list of strings with a single space (' ') between each string\r\n"); +// write(" * \r\n"); +// write(" * TODO: replace with call to ca.uhn.fhir.util.DatatypeUtil.joinStringsSpaceSeparated when HAPI upgrades to 1.4\r\n"); +// write(" */\r\n"); +// write(" private static String joinStringsSpaceSeparated(List> theStrings) {\r\n"); +// write(" StringBuilder b = new StringBuilder();\r\n"); +// write(" for (IPrimitiveType next : theStrings) {\r\n"); +// write(" if (next.isEmpty()) {\r\n"); +// write(" continue;\r\n"); +// write(" }\r\n"); +// write(" if (b.length() > 0) {\r\n"); +// write(" b.append(' ');\r\n"); +// write(" }\r\n"); +// write(" b.append(next.getValue());\r\n"); +// write(" }\r\n"); +// write(" return b.toString();\r\n"); +// write(" }\r\n"); +// write(""); +// } +// if (upFirst(name).equals("Meta")) { +// write(" /**\r\n"); +// write(" * Convenience method which adds a tag\r\n"); +// write(" * \r\n"); +// write(" * @param theSystem The code system\r\n"); +// write(" * @param theCode The code\r\n"); +// write(" * @param theDisplay The display name\r\n"); +// write(" * @return Returns a reference to this for easy chaining\r\n"); +// write(" */\r\n"); +// write(" public Meta addTag(String theSystem, String theCode, String theDisplay) {\r\n"); +// write(" addTag().setSystem(theSystem).setCode(theCode).setDisplay(theDisplay);\r\n"); +// write(" return this;\r\n"); +// write(" }\r\n"); +// write(""); +// write(" /**\r\n"); +// write(" * Convenience method which adds a security tag\r\n"); +// write(" * \r\n"); +// write(" * @param theSystem The code system\r\n"); +// write(" * @param theCode The code\r\n"); +// write(" * @param theDisplay The display name\r\n"); +// write(" * @return Returns a reference to this for easy chaining\r\n"); +// write(" */\r\n"); +// write(" public Meta addSecurity(String theSystem, String theCode, String theDisplay) {\r\n"); +// write(" addSecurity().setSystem(theSystem).setCode(theCode).setDisplay(theDisplay);\r\n"); +// write(" return this;\r\n"); +// write(" }\r\n"); +// write(""); +// write(" /**\r\n" ); +// write( " * Returns the first tag (if any) that has the given system and code, or returns\r\n"); +// write( " * null if none\r\n"); +// write( " */\r\n" ); +// write( " public Coding getTag(String theSystem, String theCode) {\r\n"); +// write ( " for (Coding next : getTag()) {\r\n" ); +// write ( " if (ca.uhn.fhir.util.ObjectUtil.equals(next.getSystem(), theSystem) && ca.uhn.fhir.util.ObjectUtil.equals(next.getCode(), theCode)) {\r\n" ); +// write ( " return next;\r\n" ); +// write ( " }\r\n" ); +// write ( " }\r\n" ); +// write( " return null;\r\n" ); +// write( " }\r\n" ); +// write( "\r\n" ); +// write( " /**\r\n" ); +// write( " * Returns the first security label (if any) that has the given system and code, or returns\r\n" ); +// write( " * null if none\r\n"); +// write( " */\r\n" ); +// write( " public Coding getSecurity(String theSystem, String theCode) {\r\n"); +// write( " for (Coding next : getTag()) {\r\n" ); +// write( " if (ca.uhn.fhir.util.ObjectUtil.equals(next.getSystem(), theSystem) && ca.uhn.fhir.util.ObjectUtil.equals(next.getCode(), theCode)) {\r\n" ); +// write( " return next;\r\n" ); +// write( " }\r\n" ); +// write( " }\r\n" ); +// write( " return null;\r\n"); +// write( " }\r\n"); +// } +// if (upFirst(name).equals("Period")) { +// write(" /**\r\n"); +// write(" * Sets the value for start ()\r\n"); +// write(" *\r\n"); +// write(" *

\r\n"); +// write(" * Definition:\r\n"); +// write(" * The start of the period. The boundary is inclusive.\r\n"); +// write(" *

\r\n"); +// write(" */\r\n"); +// write(" public Period setStart( Date theDate, TemporalPrecisionEnum thePrecision) {\r\n"); +// write(" start = new DateTimeType(theDate, thePrecision); \r\n"); +// write(" return this; \r\n"); +// write(" }\r\n"); +// write("\r\n"); +// write(" /**\r\n"); +// write(" * Sets the value for end ()\r\n"); +// write(" *\r\n"); +// write(" *

\r\n"); +// write(" * Definition:\r\n"); +// write(" * The end of the period. The boundary is inclusive.\r\n"); +// write(" *

\r\n"); +// write(" */\r\n"); +// write(" public Period setEnd( Date theDate, TemporalPrecisionEnum thePrecision) {\r\n"); +// write(" end = new DateTimeType(theDate, thePrecision); \r\n"); +// write(" return this; \r\n"); +// write(" }\r\n"); +// write("\r\n"); +// } +// if (upFirst(name).equals("Reference")) { +// write(" /**\r\n"); +// write(" * Convenience setter which sets the reference to the complete {@link IIdType#getValue() value} of the given\r\n"); +// write(" * reference.\r\n"); +// write(" *\r\n"); +// write(" * @param theReference The reference, or null\r\n"); +// write(" * @return \r\n"); +// write(" * @return Returns a reference to this\r\n"); +// write(" */\r\n"); +// write(" public Reference setReferenceElement(IIdType theReference) {\r\n"); +// write(" if (theReference != null) {\r\n"); +// write(" setReference(theReference.getValue());\r\n"); +// write(" } else {\r\n"); +// write(" setReference(null);\r\n"); +// write(" }\r\n"); +// write(" return this;\r\n"); +// write(" }\r\n"); +// write(""); +// } +// } +// +// private void generateFhirType(String path) throws IOException { +// write(" public String fhirType();\r\n\r\n"); +// } +// +// private void jdoc(String indent, String text) throws IOException { +// write(indent+"/**\r\n"); +// write(indent+" * "+text+"\r\n"); +// write(indent+" */\r\n"); +// } +// +// private String upFirst(String name) { +// return name.substring(0,1).toUpperCase()+name.substring(1); +// } +// +// private boolean hasDecimal(ElementDefn root) { +// for (ElementDefn e : root.getElements()) { +// if (e.typeCode().equals("decimal") || hasDecimalInner(e)) +// return true; +// } +// return false; +// } +// +// private boolean hasString(ElementDefn root) { +// for (ElementDefn e : root.getElements()) { +// if (Utilities.existsInList(e.typeCode(), "string", "id", "code", "uri", "oid", "uuid", "url", "canonical") || hasString(e)) +// return true; +// } +// return false; +// } +// +// private boolean hasSharedEnums(ElementDefn root) { +// for (ElementDefn e : root.getElements()) { +// if ((e.getBinding() != null && e.getBinding().isShared()) || hasSharedEnums(e)) +// return true; +// } +// return false; +// } +// +// private boolean hasXhtml(ElementDefn root) { +// for (ElementDefn e : root.getElements()) { +// if (e.isXhtmlElement() || hasXhtmlInner(e)) +// return true; +// } +// return false; +// } +// +// private boolean hasXhtmlInner(ElementDefn e) { +// for (ElementDefn c : e.getElements()) { +// if (c.isXhtmlElement() || hasXhtmlInner(c)) +// return true; +// } +// +// return false; +// } +// +// private boolean hasDecimalInner(ElementDefn e) { +// for (ElementDefn c : e.getElements()) { +// if (c.typeCode().equals("decimal") || hasDecimalInner(c)) +// return true; +// } +// +// return false; +// } +// +// private void generateEnum(ElementDefn e, String name) throws Exception { +// String tn = typeNames.get(e); +// String tns = tn.substring(tn.indexOf("<")+1); +// tns = tns.substring(0, tns.length()-1); +// BindingSpecification cd = e.getBinding(); +// if (cd.isShared()) +// return; +// cd.getValueSet().setUserData("java-generated", true); +// List codes = cd.getAllCodes(definitions.getCodeSystems(), definitions.getValuesets(), true); +// +// String url = cd.getValueSet().getUrl(); +// CommaSeparatedStringBuilder el = new CommaSeparatedStringBuilder(); +// +// write(" public enum "+tns+" {\r\n"); +// int l = codes.size(); +// int i = 0; +// for (DefinedCode c : codes) { +// i++; +// String cc = Utilities.camelCase(c.getCode()); +// cc = makeConst(cc); +// el.append(cc); +// write(" /**\r\n"); +// write(" * "+c.getDefinition()+"\r\n"); +// write(" */\r\n"); +// write(" "+cc.toUpperCase()+", \r\n"); +// } +// write(" /**\r\n"); +// write(" * added to help the parsers with the generic types\r\n"); +// write(" */\r\n"); +// write(" NULL;\r\n"); +// el.append("NULL"); +// +// +// write(" public static "+tns+" fromCode(String codeString) throws FHIRException {\r\n"); +// write(" if (codeString == null || \"\".equals(codeString))\r\n"); +// write(" return null;\r\n"); +// for (DefinedCode c : codes) { +// String cc = Utilities.camelCase(c.getCode()); +// cc = makeConst(cc); +// write(" if (\""+c.getCode()+"\".equals(codeString))\r\n"); +// write(" return "+cc+";\r\n"); +// } +// write(" if (Configuration.isAcceptInvalidEnums())\r\n"); +// write(" return null;\r\n"); +// write(" else\r\n"); +// write(" throw new FHIRException(\"Unknown "+tns+" code '\"+codeString+\"'\");\r\n"); +// write(" }\r\n"); +// +// write(" public String toCode() {\r\n"); +// write(" switch (this) {\r\n"); +// for (DefinedCode c : codes) { +// String cc = Utilities.camelCase(c.getCode()); +// cc = makeConst(cc); +// write(" case "+cc+": return \""+c.getCode()+"\";\r\n"); +// } +// write(" default: return \"?\";\r\n"); +// write(" }\r\n"); +// write(" }\r\n"); +// +// write(" public String getSystem() {\r\n"); +// write(" switch (this) {\r\n"); +// for (DefinedCode c : codes) { +// String cc = Utilities.camelCase(c.getCode()); +// cc = makeConst(cc); +// write(" case "+cc+": return \""+c.getSystem()+"\";\r\n"); +// } +// write(" default: return \"?\";\r\n"); +// write(" }\r\n"); +// write(" }\r\n"); +// +// write(" public String getDefinition() {\r\n"); +// write(" switch (this) {\r\n"); +// for (DefinedCode c : codes) { +// String cc = Utilities.camelCase(c.getCode()); +// cc = makeConst(cc); +// write(" case "+cc+": return \""+Utilities.escapeJava(c.getDefinition())+"\";\r\n"); +// } +// write(" default: return \"?\";\r\n"); +// write(" }\r\n"); +// write(" }\r\n"); +// +// write(" public String getDisplay() {\r\n"); +// write(" switch (this) {\r\n"); +// for (DefinedCode c : codes) { +// String cc = Utilities.camelCase(c.getCode()); +// cc = makeConst(cc); +// write(" case "+cc+": return \""+Utilities.escapeJava(Utilities.noString(c.getDisplay()) ? c.getCode() : c.getDisplay())+"\";\r\n"); +// } +// write(" default: return \"?\";\r\n"); +// write(" }\r\n"); +// write(" }\r\n"); +// +// write(" }\r\n"); +// write("\r\n"); +// +// +// write(" public class "+tns+"EnumFactory implements EnumFactory<"+tns+"> {\r\n"); +// write(" public "+tns+" fromCode(String codeString) throws IllegalArgumentException {\r\n"); +// +// write(" if (codeString == null || \"\".equals(codeString))\r\n"); +// write(" if (codeString == null || \"\".equals(codeString))\r\n"); +// write(" return null;\r\n"); +// for (DefinedCode c : codes) { +// String cc = Utilities.camelCase(c.getCode()); +// cc = makeConst(cc); +// write(" if (\""+c.getCode()+"\".equals(codeString))\r\n"); +// write(" return "+tns+"."+cc+";\r\n"); +// } +// write(" throw new IllegalArgumentException(\"Unknown "+tns+" code '\"+codeString+\"'\");\r\n"); +// write(" }\r\n"); +// write(" public Enumeration<"+tns+"> fromType(Base code) throws FHIRException {\r\n"); +// write(" if (code == null)\r\n"); +// write(" return null;\r\n"); +// write(" if (code.isEmpty())\r\n"); +// write(" return new Enumeration<"+tns+">(this);\r\n"); +// write(" String codeString = ((PrimitiveType) code).asStringValue();\r\n"); +// write(" if (codeString == null || \"\".equals(codeString))\r\n"); +// write(" return null;\r\n"); +// for (DefinedCode c : codes) { +// String cc = Utilities.camelCase(c.getCode()); +// cc = makeConst(cc); +// write(" if (\""+c.getCode()+"\".equals(codeString))\r\n"); +// write(" return new Enumeration<"+tns+">(this, "+tns+"."+cc+");\r\n"); +// } +// write(" throw new FHIRException(\"Unknown "+tns+" code '\"+codeString+\"'\");\r\n"); +// write(" }\r\n"); +// +// write(" public String toCode("+tns+" code) {\r\n"); +// for (DefinedCode c : codes) { +// String cc = Utilities.camelCase(c.getCode()); +// cc = makeConst(cc); +// write(" if (code == "+tns+"."+cc+")\r\n return \""+c.getCode()+"\";\r\n"); +// } +// write(" return \"?\";\r\n"); +// write(" }\r\n"); +// +// write(" public String toSystem("+tns+" code) {\r\n"); +// write(" return code.getSystem();\r\n"); +// write(" }\r\n"); +// write(" }\r\n"); +// write("\r\n"); +// enumInfo.put("org.hl7.fhir.r5.model."+name+"."+tns, url+"|"+el.toString()); +// } +// +// private void generateType(ElementDefn e, JavaGenClass clss) throws Exception { +// String tn = typeNames.get(e); +// +// if (clss == JavaGenClass.BackboneElement) { +// write(" public interface "+tn+" extends PatternBase {\r\n"); +// } else { +// write(" public interface "+tn+" extends PatternBase {\r\n"); +// } +// for (ElementDefn c : e.getElements()) { +// generateAccessors(e, c, " ", tn); +// } +// if (adornments.containsKey(tn)) { +// write("// added from java-adornments.txt:\r\n"); +// write(adornments.get(tn)+"\r\n"); +// write("// end addition\r\n"); +// } +// write(" }\r\n"); +// write("\r\n"); +// +// } +// +// +// private void scanNestedTypes(ElementDefn root, String path, ElementDefn e) throws Exception { +// String tn = null; +// if (e.typeCode().equals("code") && e.hasBinding()) { +// BindingSpecification cd = e.getBinding(); +// if (cd != null && (cd.getBinding() == BindingSpecification.BindingMethod.CodeList)) { +// tn = getCodeListType(cd.getValueSet().getName()); +// if (!enumNames.contains(tn)) { +// enumNames.add(tn); +// enums.add(e); +// } +// typeNames.put(e, "Enumeration<"+tn+">"); +// } else if (isEnum(cd)) { +// tn = getCodeListType(cd.getName()); +// if (!enumNames.contains(tn)) { +// enumNames.add(tn); +// enums.add(e); +// } +// typeNames.put(e, "Enumeration<"+tn+">"); +// } +// } +// if (tn == null) { +// if (e.getTypes().size() > 0 && !e.usesCompositeType()) { +// tn = e.typeCode(); +//// if (clss != JavaGenClass.Resource) { +//// if (tn.equals("boolean")) tn = "Boolean"; +//// else if (tn.equals("integer")) tn = "Integer"; +//// else if (tn.equals("decimal")) tn = "Decimal"; +//// else if (tn.equals("base64Binary")) tn = "Base64Binary"; +//// else if (tn.equals("instant")) tn = "Instant"; +//// else if (tn.equals("string")) tn = "StringType"; +//// else if (tn.equals("uri")) tn = "Uri"; +//// else if (tn.equals("xml:lang")) tn = "Code"; +//// else if (tn.equals("code")) tn = "Code"; +//// else if (tn.equals("oid")) tn = "Oid"; +//// else if (tn.equals("uuid")) tn = "Uuid"; +//// else if (tn.equals("sid")) tn = "Sid"; +//// else if (tn.equals("id")) tn = "Id"; +//// else if (tn.equals("date")) tn = "Date"; +//// else if (tn.equals("dateTime")) tn = "DateTime"; +//// else +//// tn = getTypeName(e); +//// } else +// tn = getTypeName(e); +// if (e.typeCode().equals("xml:lang")) +// tn = "CodeType"; +// if (e.getTypes().get(0).isUnboundGenericParam()) +// tn = "T"; +// else if (e.isXhtmlElement()) +// tn = "XhtmlNode"; +// else if (e.getTypes().get(0).isWildcardType()) +// tn ="org.hl7.fhir.r5.model.Type"; +// else if (definitions.hasPrimitiveType(tn)) +// tn = upFirst(tn)+"Type"; +// +// typeNames.put(e, tn); +// } else { +// if (e.usesCompositeType()) { +// tn = typeNames.get(getElementForPath(root, e.typeCode().substring(1))); +// typeNames.put(e, tn); +//// } else if (e.getDeclaredTypeName() != null) { +//// tn = e.getDeclaredTypeName(); +//// typeNames.put(e, tn); +//// System.out.println(tn); +// } else { +// if (e.getDeclaredTypeName() != null) +// tn = e.getDeclaredTypeName(); +// else +// tn = getTitle(e.getName()); +// if (tn.equals("Element")) +// tn = "Element_"; +// strucs.add(e); +// if (typeNameStrings.contains(tn)) { +// char i = 'A'; +// while (typeNameStrings.contains(tn+i)) +// i++; +// tn = tn + i; +// } +// typeNames.put(e, tn); +// typeNameStrings.add(tn); +// for (ElementDefn c : e.getElements()) { +// scanNestedTypes(root, path+getTitle(e.getName()), c); +// } +// } +// } +// } +// } +// +// private Object getElementForPath(ElementDefn root, String pathname) throws Exception { +// String[] path = pathname.split("\\."); +// if (!path[0].equals(root.getName())) +// throw new Exception("Element Path '"+pathname+"' is not legal in this context"); +// ElementDefn res = root; +// for (int i = 1; i < path.length; i++) +// { +// String en = path[i]; +// if (en.length() == 0) +// throw new Exception("Improper path "+pathname); +// ElementDefn t = res.getElementByName(definitions, en, true, false); +// if (t == null) { +// throw new Exception("unable to resolve "+pathname); +// } +// res = t; +// } +// return res; +// +// } +// +// private String getCodeListType(String binding) { +// StringBuilder b = new StringBuilder(); +// boolean up = true; +// for (char ch: binding.toCharArray()) { +// if (ch == '-') +// up = true; +// else if (up) { +// b.append(Character.toUpperCase(ch)); +// up = false; +// } +// else +// b.append(ch); +// } +// return b.toString(); +// } +// +// +// +// +// private String getSimpleType(String n) { +// if (n.equals("StringType")) +// return "String"; +// if (n.equals("CodeType")) +// return "String"; +// if (n.equals("MarkdownType")) +// return "String"; +// if (n.equals("Base64BinaryType")) +// return "byte[]"; +// if (n.equals("UriType")) +// return "String"; +// if (n.equals("UrlType")) +// return "String"; +// if (n.equals("CanonicalType")) +// return "String"; +// if (n.equals("OidType")) +// return "String"; +// if (n.equals("IntegerType")) +// return "int"; +// if (n.equals("UnsignedIntType")) +// return "int"; +// if (n.equals("PositiveIntType")) +// return "int"; +// if (n.equals("BooleanType")) +// return "boolean"; +// if (n.equals("DecimalType")) +// return "BigDecimal"; +// if (n.equals("DateTimeType")) +// return "Date"; +// if (n.equals("DateType")) +// return "Date"; +// if (n.equals("IdType")) +// return "String"; +// if (n.equals("InstantType")) +// return "Date"; +// if (n.equals("TimeType")) +// return "String"; +// +// String tns = null; +// if (n.indexOf("<") > 0) { +// tns = n.substring(n.indexOf("<")+1); +// tns = tns.substring(0, tns.length()-1); +// } +// +// if (tns != null && enumNames.contains(tns)) +// return tns; +// +// return "??"; +// } +// private void generateAccessors(ElementDefn root, ElementDefn e, String indent, String className) throws Exception { +// String tn = typeNames.get(e); +// +// boolean isReferenceRefField = (root.getName().equals("Reference") && e.getName().equals("reference")); +// +// String simpleType = getSimpleType(tn); +// if (e.unbounded()) { +// /* +// * getXXX()for repeatable type +// */ +// jdoc(indent, "@return {@link #"+getElementName(e.getName(), true)+"} ("+e.getDefinition()+")"); +// String listGenericType; +// if (tn == null && e.usesCompositeType()) { +// listGenericType = root.getName(); +// } else { +// listGenericType = tn; +// } +// write(indent+"public List<"+listGenericType+"> get"+getTitle(getElementName(e.getName(), false))+"() throws FHIRException;\r\n\r\n"); +// +// /* +// * setXXX(List) for repeating type +// */ +// jdoc(indent, "@return Returns a reference to this for easy method chaining"); +// write(indent+"public " + className + " set"+getTitle(getElementName(e.getName(), false))+"(" + "List<"+listGenericType+"> the" + getTitle(getElementName(e.getName(), false)) + ") throws FHIRException;\r\n\r\n"); +// +// /* +// * hasXXX() for repeatable type +// */ +// jdoc(indent, "@return whether there is more than zero values for "+getElementName(e.getName(), false)); +// write(indent+"public boolean has"+getTitle(getElementName(e.getName(), false))+"();\r\n"); +// jdoc(indent, "@return minimum allowed cardinality for "+getElementName(e.getName(), false)+". Note that with patterns, this may be different for the underlying resource"); +// write(indent+"public int get"+getTitle(getElementName(e.getName(), false))+"Min();\r\n"); +// jdoc(indent, "@return maximum allowed cardinality for "+getElementName(e.getName(), false)+". Note that with patterns, this may be different for the underlying resource"); +// write(indent+"public int get"+getTitle(getElementName(e.getName(), false))+"Max();\r\n"); +// +// write("\r\n"); +// if (e.getTypes().size() == 1 && (definitions.getPrimitives().containsKey(e.typeCode()) || e.typeCode().equals("xml:lang") || e.typeCode().startsWith("canonical("))) { +// /* +// * addXXXElement() for repeatable primitive +// */ +// jdoc(indent, "@return {@link #"+getElementName(e.getName(), true)+"} ("+e.getDefinition()+")"); +// write(indent+"public "+tn+" add"+getTitle(getElementName(e.getName(), false))+"Element() throws FHIRException;\r\n"); +// write("\r\n"); +// +// /* +// * addXXX(foo) for repeatable primitive +// */ +// jdoc(indent, "@param value {@link #"+getElementName(e.getName(), true)+"} ("+e.getDefinition()+")"); +// write(indent+"public "+className+" add"+getTitle(getElementName(e.getName(), false))+"("+simpleType+" value) throws FHIRException;\r\n"); +// write("\r\n"); +// +// /* +// * hasXXX(foo) for repeatable primitive +// */ +// jdoc(indent, "@param value {@link #"+getElementName(e.getName(), true)+"} ("+e.getDefinition()+")"); +// write(indent+"public boolean has"+getTitle(getElementName(e.getName(), false))+"("+simpleType+" value) throws FHIRException;\r\n"); +// write("\r\n"); +// } else { +// if (!definitions.getBaseResources().containsKey(tn)) { +// /* +// * addXXX() for repeatable composite +// */ +// write(indent+"public "+tn+" add"+getTitle(getElementName(e.getName(), false))+"() throws FHIRException;\r\n"); +// write("\r\n"); +// +// /* +// * addXXX(foo) for repeatable composite +// */ +// write(indent+"public "+className+" add"+getTitle(getElementName(e.getName(), false))+"("+tn+" t) throws FHIRException;\r\n"); +// write("\r\n"); +// } else { +// /* +// * addXXX(foo) for repeatable composite +// */ +// write(indent+"public "+className+" add"+getTitle(getElementName(e.getName(), false))+"("+tn+" t) throws FHIRException;\r\n"); +// write("\r\n"); +// } +// +// /* +// * getXXXFirstRep() for repeatable element +// */ +// if (!"DomainResource".equals(className)) { +// jdoc(indent, "@return The first repetition of repeating field {@link #"+getElementName(e.getName(), true)+"}, creating it if it does not already exist"); +// write(indent+"public "+tn+" get"+getTitle(getElementName(e.getName(), false))+"FirstRep() throws FHIRException;\r\n\r\n"); +// } +// } +// } else { +// if (isJavaPrimitive(e) || (e.getTypes().size() == 1 && e.typeCode().startsWith("canonical("))) { +// jdoc(indent, "@return {@link #"+getElementName(e.getName(), true)+"} ("+e.getDefinition()+"). This is the underlying object with id, value and extensions. The accessor \"get"+getTitle(getElementName(e.getName(), false))+"\" gives direct access to the value"); +// if (isReferenceRefField) { +// /* +// * Reference#getReferenceElement is defined differently in BaseReference.java? +// */ +// write(indent+"public "+tn+" get"+getTitle(getElementName(e.getName(), false))+"Element_() throws FHIRException;\r\n"); +// } else { +// write(indent+"public "+tn+" get"+getTitle(getElementName(e.getName(), false))+"Element() throws FHIRException;\r\n"); +// } +// write("\r\n"); +// +// jdoc(indent, "@return whether there is more than zero values for "+getElementName(e.getName(), false)); +// write(indent+"public boolean has"+getTitle(getElementName(e.getName(), false))+"();\r\n"); +// jdoc(indent, "@return minimum allowed cardinality for "+getElementName(e.getName(), false)+". Note that with patterns, this may be different for the underlying resource"); +// write(indent+"public int get"+getTitle(getElementName(e.getName(), false))+"Min() throws FHIRException;\r\n"); +// jdoc(indent, "@return maximum allowed cardinality for "+getElementName(e.getName(), false)+". Note that with patterns, this may be different for the underlying resource"); +// write(indent+"public int get"+getTitle(getElementName(e.getName(), false))+"Max() throws FHIRException;\r\n"); +// +// write(indent+"public boolean has"+getTitle(getElementName(e.getName(), false))+"Element();\r\n"); +// write("\r\n"); +// jdoc(indent, "@param value {@link #"+getElementName(e.getName(), true)+"} ("+e.getDefinition()+"). This is the underlying object with id, value and extensions. The accessor \"get"+getTitle(getElementName(e.getName(), false))+"\" gives direct access to the value"); +// write(indent+"public "+className+" set"+getTitle(getElementName(e.getName(), false))+"Element("+tn+" value) throws FHIRException;\r\n"); +// write("\r\n"); +// jdoc(indent, "@return "+e.getDefinition()); +// write(indent+"public "+simpleType+" get"+getTitle(getElementName(e.getName(), false))+"() throws FHIRException;\r\n"); +// write("\r\n"); +// generateSetter(e, indent, className, tn, simpleType); +// +// // BigDecimal sugar methods +// if (simpleType.equals("BigDecimal")) { +// generateSetter(e, indent, className, tn, "long"); +// generateSetter(e, indent, className, tn, "double"); +// } +// +// } else { +// jdoc(indent, "@return {@link #"+getElementName(e.getName(), true)+"} ("+e.getDefinition()+")"); +// write(indent+"public "+tn+" get"+getTitle(getElementName(e.getName(), false))+"() throws FHIRException ;\r\n"); +// write("\r\n"); +// if (e.getTypes().size() > 1 && (tn.equals("Type") || !tn.endsWith(".Type"))) { +// for (TypeRef t : e.getTypes()) { +// jdoc(indent, "@return {@link #"+getElementName(e.getName(), true)+"} ("+e.getDefinition()+")"); +// String ttn = getTypename(t); +// write(indent+"public "+ttn+" get"+getTitle(getElementName(e.getName(), false))+ttn+"() throws FHIRException;\r\n"); +// write("\r\n"); +// write(indent+"public boolean has"+getTitle(getElementName(e.getName(), false))+ttn+"();\r\n"); +// write("\r\n"); +// } +// } +// jdoc(indent, "@return whether there is more than zero values for "+getElementName(e.getName(), false)); +// write(indent+"public boolean has"+getTitle(getElementName(e.getName(), false))+"();\r\n"); +// jdoc(indent, "@return minimum allowed cardinality for "+getElementName(e.getName(), false)+". Note that with patterns, this may be different for the underlying resource"); +// write(indent+"public int get"+getTitle(getElementName(e.getName(), false))+"Min();\r\n"); +// jdoc(indent, "@return maximum allowed cardinality for "+getElementName(e.getName(), false)+". Note that with patterns, this may be different for the underlying resource"); +// write(indent+"public int get"+getTitle(getElementName(e.getName(), false))+"Max();\r\n"); +// +// jdoc(indent, "@param value {@link #"+getElementName(e.getName(), true)+"} ("+e.getDefinition()+")"); +// write(indent+"public "+className+" set"+getTitle(getElementName(e.getName(), false))+"("+tn+" value) throws FHIRException;\r\n"); +// write("\r\n"); +// if (e.getTypes().size() == 1 && e.typeCode().startsWith("Reference(")) { +// List params = e.getTypes().get(0).getParams(); +// String rn = params.size() == 1 ? params.get(0) : "Resource"; +// if (rn.equals("Any")) +// rn = "Resource"; +// else if (rn.equals("List")) +// rn = "ListResource"; +// } +// } +// } +// +// } +// +// private void generateSetter(ElementDefn e, String indent, String className, String tn, String simpleType) throws IOException { +// jdoc(indent, "@param value "+e.getDefinition()); +// write(indent+"public "+className+" set"+getTitle(getElementName(e.getName(), false))+"("+simpleType+" value) throws FHIRException;\r\n"); +// write("\r\n"); +// } +// +// public long getHashSum() { +// return hashSum; +// } +// +// public void setInheritedHash(String value) { +// inheritedHash = value; +// +// } +// + +} diff --git a/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/engine/JavaCoreGenerator.java b/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/engine/JavaCoreGenerator.java index e851194c3..c13c77bea 100644 --- a/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/engine/JavaCoreGenerator.java +++ b/org.hl7.fhir.core.generator/src/org/hl7/fhir/core/generator/engine/JavaCoreGenerator.java @@ -15,6 +15,8 @@ import org.hl7.fhir.core.generator.codegen.Configuration; import org.hl7.fhir.core.generator.codegen.JavaEnumerationsGenerator; import org.hl7.fhir.core.generator.codegen.JavaFactoryGenerator; import org.hl7.fhir.core.generator.codegen.JavaParserJsonGenerator; +import org.hl7.fhir.core.generator.codegen.JavaParserRdfGenerator; +import org.hl7.fhir.core.generator.codegen.JavaParserXmlGenerator; import org.hl7.fhir.core.generator.codegen.JavaResourceGenerator; import org.hl7.fhir.core.generator.loader.DefinitionsLoader; import org.hl7.fhir.r5.model.ValueSet; @@ -53,6 +55,7 @@ public class JavaCoreGenerator { private void generate(String version, String src, String dest) throws Exception { + long start = System.currentTimeMillis(); Date date = new Date(); String ap = Utilities.path(src, "src", "main", "resources"); @@ -82,6 +85,8 @@ public class JavaCoreGenerator { JavaFactoryGenerator fgen = new JavaFactoryGenerator(new FileOutputStream(Utilities.path(dest, "src", "org", "hl7", "fhir", "r5", "model", "ResourceFactory.java")), master, config, date, npm.version()); JavaParserJsonGenerator jgen = new JavaParserJsonGenerator(new FileOutputStream(Utilities.path(dest, "src", "org", "hl7", "fhir", "r5", "formats", "JsonParser.java")), master, config, date, npm.version()); + JavaParserXmlGenerator xgen = new JavaParserXmlGenerator(new FileOutputStream(Utilities.path(dest, "src", "org", "hl7", "fhir", "r5", "formats", "XmlParser.java")), master, config, date, npm.version()); + JavaParserRdfGenerator rgen = new JavaParserRdfGenerator(new FileOutputStream(Utilities.path(dest, "src", "org", "hl7", "fhir", "r5", "formats", "RdfParser.java")), master, config, date, npm.version()); for (StructureDefinition sd : master.getStructures().getList()) { if (sd.getDerivation() == TypeDerivationRule.SPECIALIZATION && sd.getKind() == StructureDefinitionKind.COMPLEXTYPE) { @@ -97,6 +102,8 @@ public class JavaCoreGenerator { gen.generate(analysis); gen.close(); jgen.seeClass(analysis); + xgen.seeClass(analysis); + rgen.seeClass(analysis); } } } @@ -113,6 +120,8 @@ public class JavaCoreGenerator { gen.generate(analysis); gen.close(); jgen.seeClass(analysis); + xgen.seeClass(analysis); + rgen.seeClass(analysis); } } } @@ -130,6 +139,8 @@ public class JavaCoreGenerator { gen.generate(analysis); gen.close(); jgen.seeClass(analysis); + xgen.seeClass(analysis); + rgen.seeClass(analysis); } } } @@ -146,6 +157,8 @@ public class JavaCoreGenerator { gen.generate(analysis); gen.close(); jgen.seeClass(analysis); + xgen.seeClass(analysis); + rgen.seeClass(analysis); } } } @@ -155,7 +168,13 @@ public class JavaCoreGenerator { System.out.println(" .. JsonParser"); jgen.generate(); jgen.close(); - System.out.println("Done"); + System.out.println(" .. XmlParser"); + xgen.generate(); + xgen.close(); + System.out.println(" .. RdfParser"); + rgen.generate(); + rgen.close(); + System.out.println("Done ("+Long.toString(System.currentTimeMillis()-start)+"ms)"); }