first complete generator

This commit is contained in:
Grahame Grieve 2019-12-29 07:58:25 +11:00
parent 193e61999e
commit 1131ac236e
50 changed files with 6732 additions and 4 deletions

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -0,0 +1,6 @@

@Override
public String toString() {
return getUrl();
}

View File

@ -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();
}

View File

@ -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 <code>null</code>. 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 <code>null</code>
* @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 <code>null</code>
* @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;
}

View File

@ -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 <code>null</code>. 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 <code>null</code>
* @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 <code>null</code>
* @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;
}

View File

@ -0,0 +1,12 @@
 @Override
public String toString() {
return fhirType()+"["+getUrl()+"]";
}
public String present() {
if (hasTitle())
return getTitle();
if (hasName())
return getName();
return toString();
}

View File

@ -0,0 +1 @@


View File

@ -0,0 +1,7 @@
 public PropertyComponent getProperty(String code) {
for (PropertyComponent pd : getProperty()) {
if (pd.getCode().equalsIgnoreCase(code))
return pd;
}
return null;
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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;
}

View File

@ -0,0 +1,6 @@

@Override
public String toString() {
return getCode()+": "+getDisplay();
}

View File

@ -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<Extension> retVal = new ArrayList<Extension>();
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<Extension> getExtensionsByUrl(String theUrl) {
org.apache.commons.lang3.Validate.notBlank(theUrl, "theUrl must be provided with a value");
ArrayList<Extension> retVal = new ArrayList<Extension>();
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<Extension> getModifierExtensionsByUrl(String theUrl) {
org.apache.commons.lang3.Validate.notBlank(theUrl, "theUrl must be provided with a value");
ArrayList<Extension> retVal = new ArrayList<Extension>();
for (Extension next : getModifierExtension()) {
if (theUrl.equals(next.getUrl())) {
retVal.add(next);
}
}
return Collections.unmodifiableList(retVal);
}

View File

@ -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<Extension> retVal = new ArrayList<Extension>();
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<Extension> getExtensionsByUrl(String theUrl) {
org.apache.commons.lang3.Validate.notBlank(theUrl, "theUrl must not be blank or null");
ArrayList<Extension> retVal = new ArrayList<Extension>();
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<Extension> 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();
}

View File

@ -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]");
}

View File

@ -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();
}

View File

@ -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.
* <p>
* If none of the parts are populated, returns the {@link #getTextElement() text} element value instead.
* </p>
*/
public String getNameAsSingleString() {
List<StringType> nameParts = new ArrayList<StringType>();
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<? extends IPrimitiveType<String>> theStrings) {
StringBuilder b = new StringBuilder();
for (IPrimitiveType<String> next : theStrings) {
if (next.isEmpty()) {
continue;
}
if (b.length() > 0) {
b.append(' ');
}
b.append(next.getValue());
}
return b.toString();
}

View File

@ -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 <E extends Enum<E>> Enumeration<E> parseEnumeration(String s, E item, EnumFactory e) throws IOException, FHIRFormatError {
Enumeration<E> res = new Enumeration<E>(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 <E extends Enum<E>> void composeEnumerationCore(String name, Enumeration<E> 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 <E extends Enum<E>> void composeEnumerationExtras(String name, Enumeration<E> 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());
}
}

View File

@ -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 <code>this</code> 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
* <code>null</code> 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
* <code>null</code> 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;
}

View File

@ -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<DataType> getParameters(String name) {
List<DataType> 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;
}

View File

@ -0,0 +1,26 @@
/**
* Sets the value for <b>start</b> ()
*
* <p>
* <b>Definition:</b>
* The start of the period. The boundary is inclusive.
* </p>
*/
public Period setStart( Date theDate, TemporalPrecisionEnum thePrecision) {
start = new DateTimeType(theDate, thePrecision);
return this;
}
/**
* Sets the value for <b>end</b> ()
*
* <p>
* <b>Definition:</b>
* The end of the period. The boundary is inclusive.
* </p>
*/
public Period setEnd( Date theDate, TemporalPrecisionEnum thePrecision) {
end = new DateTimeType(theDate, thePrecision);
return this;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<? extends Enum> 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");
}
}
}

View File

@ -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 <code>null</code>
* @return
* @return Returns a reference to this
*/
public Reference setReferenceElement(IIdType theReference) {
if (theReference != null) {
setReference(theReference.getValue());
} else {
setReference(null);
}
return this;
}

View File

@ -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;
}

View File

@ -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+"'");
}
}
}

View File

@ -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";
}
}

View File

@ -0,0 +1,5 @@

public String toString() {
return StructureMapUtilities.render(this);
}

View File

@ -0,0 +1,5 @@

public String toString() {
return StructureMapUtilities.groupToString(this);
}

View File

@ -0,0 +1,5 @@

public String toString() {
return StructureMapUtilities.ruleToString(this);
}

View File

@ -0,0 +1,5 @@

public String toString() {
return StructureMapUtilities.sourceToString(this);
}

View File

@ -0,0 +1,5 @@

public String toString() {
return StructureMapUtilities.targetToString(this);
}

View File

@ -0,0 +1,6 @@

public String toString() {
return value == null ? "null!" : value.toString();
}

View File

@ -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;
}

View File

@ -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 <E extends Enum<E>> Enumeration<E> parseEnumeration(XmlPullParser xpp, E item, EnumFactory e) throws XmlPullParserException, IOException, FHIRFormatError {
Enumeration<E> res = new Enumeration<E>(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 <E extends Enum<E>> void composeEnumeration(String name, Enumeration<E> 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());
}
}
}

View File

@ -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<Extension, DataType>, 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

View File

@ -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.
*/

View File

@ -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.

View File

@ -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, PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 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 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.r5.model.StructureDefinition.TypeDerivationRule;
import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.Utilities;
import jdk.internal.org.objectweb.asm.tree.analysis.AnalyzerException;
public class JavaParserJsonGenerator extends JavaBaseGenerator { public class JavaParserJsonGenerator extends JavaBaseGenerator {
private StringBuilder parser = new StringBuilder(); private StringBuilder parser = new StringBuilder();
private StringBuilder pregt = new StringBuilder(); private StringBuilder pregt = new StringBuilder();
private StringBuilder pregt2 = new StringBuilder(); private StringBuilder pregt2 = new StringBuilder();

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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<ElementDefn, String> typeNames = new HashMap<ElementDefn, String>();
// private List<String> typeNameStrings = new ArrayList<String>();
// private List<ElementDefn> enums = new ArrayList<ElementDefn>();
// private List<String> elist = new ArrayList<String>();
// private List<String> enumNames = new ArrayList<String>();
// private List<ElementDefn> strucs = new ArrayList<ElementDefn>();
// 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<String> sorted(Set<String> keys) {
// List<String> result = new ArrayList<String>();
// 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<org.hl7.fhir."+ver+".model."+tn+">";
// } 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());
// }
//
}

View File

@ -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<String, String> adornments;
// private Map<String, String> enumInfo;
//
// public JavaPatternImplGenerator(OutputStream out, Definitions definitions, Map<String, String> adornments, Map<String, String> enumInfo) throws UnsupportedEncodingException {
// super(out);
// this.definitions = definitions;
// this.adornments = adornments;
// this.enumInfo = enumInfo;
// }
//
// private Map<ElementDefn, String> typeNames = new HashMap<ElementDefn, String>();
// private List<String> typeNameStrings = new ArrayList<String>();
// private List<ElementDefn> enums = new ArrayList<ElementDefn>();
// private List<String> enumNames = new ArrayList<String>();
// private List<ElementDefn> strucs = new ArrayList<ElementDefn>();
// private String classname;
// private String allfields;
// private long hashSum;
// private String inheritedHash;
//
//
// public Map<ElementDefn, String> getTypeNames() {
// return typeNames;
// }
//
// public void generate(ElementDefn root, String name, JavaGenClass clss, ProfiledType cd, Date genDate, String version, boolean isAbstract, Map<String, SearchParameterDefn> 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<String> 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<TypeRef> types) {
// CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder();
// Set<String> tset = new HashSet<String>();
// 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<ElementDefn> 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<foo>) 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<String> 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;
//
// }
//
}

View File

@ -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.JavaEnumerationsGenerator;
import org.hl7.fhir.core.generator.codegen.JavaFactoryGenerator; import org.hl7.fhir.core.generator.codegen.JavaFactoryGenerator;
import org.hl7.fhir.core.generator.codegen.JavaParserJsonGenerator; 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.codegen.JavaResourceGenerator;
import org.hl7.fhir.core.generator.loader.DefinitionsLoader; import org.hl7.fhir.core.generator.loader.DefinitionsLoader;
import org.hl7.fhir.r5.model.ValueSet; 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 { private void generate(String version, String src, String dest) throws Exception {
long start = System.currentTimeMillis();
Date date = new Date(); Date date = new Date();
String ap = Utilities.path(src, "src", "main", "resources"); 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()); 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()); 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()) { for (StructureDefinition sd : master.getStructures().getList()) {
if (sd.getDerivation() == TypeDerivationRule.SPECIALIZATION && sd.getKind() == StructureDefinitionKind.COMPLEXTYPE) { if (sd.getDerivation() == TypeDerivationRule.SPECIALIZATION && sd.getKind() == StructureDefinitionKind.COMPLEXTYPE) {
@ -97,6 +102,8 @@ public class JavaCoreGenerator {
gen.generate(analysis); gen.generate(analysis);
gen.close(); gen.close();
jgen.seeClass(analysis); jgen.seeClass(analysis);
xgen.seeClass(analysis);
rgen.seeClass(analysis);
} }
} }
} }
@ -113,6 +120,8 @@ public class JavaCoreGenerator {
gen.generate(analysis); gen.generate(analysis);
gen.close(); gen.close();
jgen.seeClass(analysis); jgen.seeClass(analysis);
xgen.seeClass(analysis);
rgen.seeClass(analysis);
} }
} }
} }
@ -130,6 +139,8 @@ public class JavaCoreGenerator {
gen.generate(analysis); gen.generate(analysis);
gen.close(); gen.close();
jgen.seeClass(analysis); jgen.seeClass(analysis);
xgen.seeClass(analysis);
rgen.seeClass(analysis);
} }
} }
} }
@ -146,6 +157,8 @@ public class JavaCoreGenerator {
gen.generate(analysis); gen.generate(analysis);
gen.close(); gen.close();
jgen.seeClass(analysis); jgen.seeClass(analysis);
xgen.seeClass(analysis);
rgen.seeClass(analysis);
} }
} }
} }
@ -155,7 +168,13 @@ public class JavaCoreGenerator {
System.out.println(" .. JsonParser"); System.out.println(" .. JsonParser");
jgen.generate(); jgen.generate();
jgen.close(); 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)");
} }