Major upgrade of PE subsystem - pass initial tests

This commit is contained in:
Grahame Grieve 2023-09-27 05:49:25 +10:00
parent a159ce7db5
commit f48c6a26f2
19 changed files with 1132 additions and 398 deletions

View File

@ -4452,6 +4452,14 @@ public class ProfileUtilities extends TranslatingUtilities {
return value != null && !value.isProhibited();
}
public static boolean isComplexExtension(StructureDefinition sd) {
if (!isExtensionDefinition(sd)) {
return false;
}
ElementDefinition value = sd.getSnapshot().getElementByPath("Extension.value");
return value == null || value.isProhibited();
}
public static boolean isModifierExtension(StructureDefinition sd) {
ElementDefinition defn = sd.getSnapshot().getElementByPath("Extension");
return defn.getIsModifier();

View File

@ -1,5 +1,33 @@
package org.hl7.fhir.r5.profilemodel;
/*
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.util.ArrayList;
import java.util.List;
@ -340,7 +368,11 @@ public class PEBuilder {
} else if (isTypeSlicing(defn)) {
res.add(new PEDefinitionTypeSlice(this, list.get(i).getSliceName(), profile, list.get(i), defn, parent.path()));
} else {
res.add(new PEDefinitionSlice(this, list.get(i).getSliceName(), profile, list.get(i), defn, parent.path()));
if (ProfileUtilities.isComplexExtension(profile) && defn.getPath().endsWith(".extension")) {
res.add(new PEDefinitionSubExtension(this, profile, list.get(i), parent.path()));
} else {
res.add(new PEDefinitionSlice(this, list.get(i).getSliceName(), profile, list.get(i), defn, parent.path()));
}
}
i++;
}
@ -364,6 +396,15 @@ public class PEBuilder {
}
}
protected PEDefinition makeChild(PEDefinition parent, StructureDefinition profileStructure, ElementDefinition definition) {
PEDefinitionElement pe = new PEDefinitionElement(this, profileStructure, definition, parent.path());
if (context.isPrimitiveType(definition.getTypeFirstRep().getWorkingCode()) && "value".equals(pe.name())) {
pe.setMustHaveValue(definition.getMustHaveValue());
}
pe.setInFixedValue(definition.hasFixed() || definition.hasPattern() || parent.isInFixedValue());
return pe;
}
private boolean passElementPropsCheck(ElementDefinition bdefn) {
switch (elementProps) {
case EXTENSION:
@ -417,7 +458,7 @@ public class PEBuilder {
}
}
}
return false;
return !defn.getPath().contains(".");
}
@ -463,6 +504,10 @@ public class PEBuilder {
}
protected PEType makeType(String tn, String url) {
return new PEType(tn, tn, url);
}
protected PEType makeType(String tn) {
return new PEType(tn, tn, "http://hl7.org/fhir/StructureDefinition/"+ tn);
}
@ -484,15 +529,15 @@ public class PEBuilder {
}
protected void populateByProfile(Base base, PEDefinition definition) {
for (PEDefinition pe : definition.children(true)) {
System.out.println("PopulateByProfile for "+pe.path);
if (pe.fixedValue()) {
if (pe.definition().hasPattern()) {
base.setProperty(pe.schemaName(), pe.definition().getPattern());
} else {
base.setProperty(pe.schemaName(), pe.definition().getFixed());
}
} else if (!pe.isSlicer()) {
if (definition.types().size() == 1) {
for (PEDefinition pe : definition.directChildren(true)) {
if (pe.fixedValue()) {
if (pe.definition().hasPattern()) {
base.setProperty(pe.schemaName(), pe.definition().getPattern());
} else {
base.setProperty(pe.schemaName(), pe.definition().getFixed());
}
} else if (!pe.isSlicer() && pe.max() == 1) {
for (int i = 0; i < pe.min(); i++) {
Base b = null;
if (pe.schemaName().endsWith("[x]")) {
@ -507,6 +552,7 @@ public class PEBuilder {
if (b != null) {
populateByProfile(b, pe);
}
}
}
}
}

View File

@ -1,5 +1,33 @@
package org.hl7.fhir.r5.profilemodel;
/*
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.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -32,6 +60,7 @@ public abstract class PEDefinition {
private boolean mustHaveValue;
private boolean inFixedValue;
private boolean isSlicer;
private List<PEDefinition> slices; // if there are some...
// /**
// * Don't create one of these directly - always use the public methods on ProfiledElementBuilder
@ -77,7 +106,19 @@ public abstract class PEDefinition {
* @return The name of the element in the resource (may be different to the slice name)
*/
public String schemaName() {
return definition.getName();
String n = definition.getName();
return n;
}
/**
* @return The name of the element in the resource (may be different to the slice name)
*/
public String schemaNameWithType() {
String n = definition.getName();
if (n.endsWith("[x]") && types().size() == 1) {
n = n.replace("[x]", Utilities.capitalize(types.get(0).getType()));
}
return n;
}
/**
@ -249,7 +290,7 @@ public abstract class PEDefinition {
public boolean isList() {
return "*".equals(definition.getBase().getMax());
return "*".equals(definition.getMax());
}
@ -314,6 +355,38 @@ public abstract class PEDefinition {
return selfKey;
}
public boolean isPrimitive() {
return types().size() == 1 && builder.getContext().isPrimitiveType(types.get(0).getName());
}
public boolean isBasePrimitive() {
ElementDefinition ed = baseDefinition();
return ed != null && ed.getType().size() == 1 && builder.getContext().isPrimitiveType(ed.getType().get(0).getWorkingCode());
}
// extensions do something different here
public List<PEDefinition> directChildren(boolean allFixed) {
return children(allFixed);
}
public List<PEDefinition> getSlices() {
return slices;
}
public void setSlices(List<PEDefinition> slices) {
this.slices = slices;
}
public boolean isExtension() {
return false;
}
}

View File

@ -1,5 +1,33 @@
package org.hl7.fhir.r5.profilemodel;
/*
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.util.List;
import org.hl7.fhir.r5.model.CanonicalType;
@ -35,21 +63,21 @@ public class PEDefinitionElement extends PEDefinition {
@Override
public String fhirpath() {
String base = definition.getName().replace("[x]", "");
if (definition.hasSlicing()) {
// get all the slices
CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(" or ");
CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(" or ");
if (getSlices() != null) {
for (PEDefinition slice : getSlices()) {
b.append("("+builder.makeSliceExpression(slice.profile, definition.getSlicing(), slice.definition())+")");
}
} else if (definition.hasSlicing()) {
List<PEDefinition> slices = builder.listSlices(profile, definition, this);
// list all the fhirpaths
for (PEDefinition slice : slices) {
b.append("("+builder.makeSliceExpression(profile, definition.getSlicing(), slice.definition())+")");
}
if (b.count() == 0)
return base;
else
return base+".where(("+b.toString()+").not())";
} else {
return base;
}
if (b.count() == 0)
return base;
else
return base+".where(("+b.toString()+").not())";
}

View File

@ -1,7 +1,37 @@
package org.hl7.fhir.r5.profilemodel;
/*
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.util.ArrayList;
import java.util.List;
import org.hl7.fhir.r5.conformance.profile.ProfileUtilities;
import org.hl7.fhir.r5.model.CanonicalType;
import org.hl7.fhir.r5.model.ElementDefinition;
import org.hl7.fhir.r5.model.ElementDefinition.SlicingRules;
@ -37,6 +67,8 @@ public class PEDefinitionExtension extends PEDefinition {
types.add(builder.makeType(t.getWorkingCode()));
}
}
} else if (ProfileUtilities.isComplexExtension(extension)) {
types.add(builder.makeType(extension.getName(), extension.getUrl()));
} else {
types.add(builder.makeType("Extension"));
}
@ -47,10 +79,14 @@ public class PEDefinitionExtension extends PEDefinition {
if (ved.isRequired() || eed.isProhibited()) {
children.addAll(builder.listChildren(allFixed, this, extension, ved, typeUrl));
} else {
List<PEDefinition> slices = builder.listSlices(extension, eed, this);
if (eed.getSlicing().getRules() != SlicingRules.CLOSED) {
children.addAll(builder.listChildren(allFixed, this, extension, eed, "http://hl7.org/fhir/StructureDefinition/Extension", "value[x]", "url"));
if (!children.isEmpty()) {
children.get(0).setSlices(slices);
}
}
children.addAll(builder.listSlices(extension, eed, this));
children.addAll(slices);
}
}
@ -66,4 +102,17 @@ public class PEDefinitionExtension extends PEDefinition {
public PEDefinitionElementMode mode() {
return PEDefinitionElementMode.Extension;
}
public List<PEDefinition> directChildren(boolean allFixed) {
List<PEDefinition> children = new ArrayList<>();
children.addAll(builder.listChildren(allFixed, this, extension, extension.getSnapshot().getElementFirstRep(), "http://hl7.org/fhir/StructureDefinition/Extension"));
return children;
}
public boolean isExtension() {
return true;
}
}

View File

@ -1,5 +1,33 @@
package org.hl7.fhir.r5.profilemodel;
/*
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.util.List;
import org.hl7.fhir.r5.model.StructureDefinition;

View File

@ -1,5 +1,33 @@
package org.hl7.fhir.r5.profilemodel;
/*
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.util.List;
import org.hl7.fhir.r5.model.CanonicalType;

View File

@ -1,5 +1,34 @@
package org.hl7.fhir.r5.profilemodel;
/*
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.util.ArrayList;
import java.util.List;
import org.hl7.fhir.r5.model.CanonicalType;
@ -48,6 +77,12 @@ public class PEDefinitionSubExtension extends PEDefinition {
}
return null;
}
public List<PEDefinition> directChildren(boolean allFixed) {
List<PEDefinition> children = new ArrayList<>();
children.addAll(builder.listChildren(allFixed, this, profile, definition, "http://hl7.org/fhir/StructureDefinition/Extension"));
return children;
}
@Override
protected void makeChildren(String typeUrl, List<PEDefinition> children, boolean allFixed) {
@ -74,4 +109,9 @@ public class PEDefinitionSubExtension extends PEDefinition {
return PEDefinitionElementMode.Extension;
}
public boolean isExtension() {
return true;
}
}

View File

@ -1,5 +1,33 @@
package org.hl7.fhir.r5.profilemodel;
/*
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.util.List;
import org.hl7.fhir.r5.model.CanonicalType;

View File

@ -1,5 +1,33 @@
package org.hl7.fhir.r5.profilemodel;
/*
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.util.ArrayList;
import java.util.Date;
import java.util.List;
@ -8,10 +36,13 @@ import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.r5.model.Base;
import org.hl7.fhir.r5.model.BaseDateTimeType;
import org.hl7.fhir.r5.model.CodeableConcept;
import org.hl7.fhir.r5.model.Coding;
import org.hl7.fhir.r5.model.ContactPoint;
import org.hl7.fhir.r5.model.Identifier;
import org.hl7.fhir.r5.model.DataType;
import org.hl7.fhir.r5.model.DateTimeType;
import org.hl7.fhir.r5.model.DateType;
import org.hl7.fhir.r5.model.Extension;
import org.hl7.fhir.r5.model.HumanName;
import org.hl7.fhir.r5.context.IWorkerContext;
import org.hl7.fhir.r5.model.Address;
@ -19,6 +50,7 @@ import org.hl7.fhir.r5.model.PrimitiveType;
import org.hl7.fhir.r5.model.Quantity;
import org.hl7.fhir.r5.model.Reference;
import org.hl7.fhir.r5.model.Resource;
import org.hl7.fhir.r5.model.StringType;
/**
* This class provides a profile centric view of a resource, as driven by a profile
@ -109,6 +141,9 @@ public class PEInstance {
if (defn.name().equals(name)) {
return defn;
}
if (defn.name().equals(name+"[x]")) {
return defn;
}
}
throw new FHIRException("No children with the name '"+name+"'");
}
@ -118,7 +153,7 @@ public class PEInstance {
*/
public PEInstance makeChild(String name) {
PEDefinition child = byName(definition.children(), name);
Base b = data.addChild(child.schemaName());
Base b = child.isBaseList() || !child.isBasePrimitive() ? data.addChild(child.schemaNameWithType()) : data.makeProperty(child.schemaNameWithType().hashCode(), child.schemaNameWithType());
builder.populateByProfile(b, child);
return new PEInstance(builder, child, resource, b, path+"."+child.name());
}
@ -141,10 +176,16 @@ public class PEInstance {
/**
* remove the nominated child from the resource
*/
public boolean removeChild(PEInstance child) {
return data.removeChild(child.definition().schemaName(), child.data);
public void removeChild(PEInstance child) {
data.removeChild(child.definition().schemaName(), child.data);
}
public void clear(String name) {
List<PEInstance> children = children(name);
for (PEInstance child : children) {
removeChild(child);
}
}
public enum PEInstanceDataKind {
Resource, Complex, DataType, Primitive
@ -251,4 +292,19 @@ public class PEInstance {
public IWorkerContext getContext() {
return builder.getContext();
}
public void addChild(String name, DataType value) {
PEDefinition child = byName(definition.children(), name);
Base b = data.setProperty(child.schemaName(), value);
}
public void addChild(String name, String value) {
PEDefinition child = byName(definition.children(), name);
Base b = data.setProperty(child.schemaName(), new StringType(value));
}
public void addChild(String name, Date value) {
PEDefinition child = byName(definition.children(), name);
Base b = data.setProperty(child.schemaName(), new DateType(value));
}
}

View File

@ -1,5 +1,33 @@
package org.hl7.fhir.r5.profilemodel;
/*
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.
*/
public class PEType {
private String name;
private String type;

View File

@ -1,10 +1,39 @@
package org.hl7.fhir.r5.profilemodel.gen;
/*
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.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import java.util.ArrayList;
import java.util.Date;
@ -23,14 +52,21 @@ import org.hl7.fhir.r5.profilemodel.PEType;
import org.hl7.fhir.utilities.TextFile;
import org.hl7.fhir.utilities.Utilities;
public class PECodeGenerator {
public static final String DEFAULT_DATE() {
SimpleDateFormat sdf = new SimpleDateFormat("EEE, MMM d, yyyy HH:mmZ", new Locale("en", "US"));
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
return sdf.format(new Date());
}
public enum ExtensionPolicy {
None, Complexes, Primitives;
}
public static final SimpleDateFormat DATE_FORMAT() {
return new SimpleDateFormat("EEE, MMM d, yyyy HH:mmZ", new Locale("en", "US"));
}
private class PEGenClass {
private String name;
private String base;
@ -44,18 +80,24 @@ public class PECodeGenerator {
private StringBuilder copy = new StringBuilder();
private StringBuilder accessors = new StringBuilder();
private StringBuilder hash = new StringBuilder();
public void genId() {
if (isResource) {
genField(true, "id", "String", "id", "", false, "");
genAccessors(true, false, "id", "String", "", "String", "String", "Id", "Ids", false, "", false);
genLoad(true, false, "id", "IdType", "", "String", "String", "Id", "Ids", false, false, null);
genLoad(true, false, "id", "id", "IdType", "", "String", "String", "Id", "Ids", false, false, null);
genSave(true, false, "id", "id", "IdType", "", "String", "String", "Id", "Ids", false, false, false, null);
genClear(false, "id");
}
}
public void write(StringBuilder b) {
public void write(StringBuilder b, String copyright) {
w(b);
w(b, "// Generated by the HAPI Java Profile Generator, "+DATE_FORMAT().format(new Date()));
if (copyright != null) {
w(b, "/*");
w(b, copyright);
w(b, " */");
w(b);
}
w(b, "// Generated by the HAPI Java Profile Generator, "+genDate);
w(b);
jdoc(b, doco, 0, true);
w(b, "public class "+name+" extends PEGeneratedBase {");
@ -167,9 +209,11 @@ public class PECodeGenerator {
String cname = Utilities.capitalize(name);
String csname = Utilities.capitalize(sname);
String nn = field.min() == 1 ? "// @NotNull" : "";
boolean isExtension = field.isExtension();
genField(isPrim, name, ptype, ltype, nn, field.isList(), field.shortDocumentation());
genAccessors(isPrim, isAbstract, name, type, init, ptype, ltype, cname, csname, field.isList(), field.documentation(), field.fixedValue());
genLoad(isPrim, isAbstract, name, type, init, ptype, ltype, cname, csname, field.isList(), field.fixedValue(), field.types().get(0));
genLoad(isPrim, isAbstract, name, sname, type, init, ptype, ltype, cname, csname, field.isList(), field.fixedValue(), field.types().get(0));
genSave(isPrim, isAbstract, name, sname, type, init, ptype, ltype, cname, csname, field.isList(), field.fixedValue(), isExtension, field.types().get(0));
genClear(field.isList(), name);
}
} else {
@ -179,16 +223,26 @@ public class PECodeGenerator {
}
private void genClear(boolean list, String name) {
w(clear, " "+name+" = null;");
if (list) {
w(clear, " "+name+".clear();");
} else {
w(clear, " "+name+" = null;");
}
}
private void genLoad(boolean isPrim, boolean isAbstract, String name, String type, String init, String ptype, String ltype, String cname, String csname, boolean isList, boolean isFixed, PEType typeInfo) {
private void genLoad(boolean isPrim, boolean isAbstract, String name, String sname, String type, String init, String ptype, String ltype, String cname, String csname, boolean isList, boolean isFixed, PEType typeInfo) {
if (isList) {
w(load, " for (PEInstance item : src.children(\""+name+"\")) {");
w(load, " for (PEInstance item : src.children(\""+sname+"\")) {");
w(load, " "+name+".add(("+type+") item.asDataType());");
w(load, " }");
} else if (isPrim) {
w(load, " if (src.hasChild(\""+name+"\")) {");
w(load, " "+name+" = (("+type+") src.child(\""+name+"\").asDataType()).getValue();");
if ("CodeType".equals(type)) {
// might be code or enum
w(load, " "+name+" = src.child(\""+name+"\").asDataType().primitiveValue();");
} else {
w(load, " "+name+" = (("+type+") src.child(\""+name+"\").asDataType()).getValue();");
}
w(load, " }");
} else if (typeInfo != null && typeInfo.getUrl() != null && !typeInfo.getUrl().startsWith("http://hl7.org/fhir/StructureDefinition")) {
w(load, " if (src.hasChild(\""+name+"\")) {");
@ -201,6 +255,41 @@ public class PECodeGenerator {
}
}
private void genSave(boolean isPrim, boolean isAbstract, String name, String sname, String type, String init, String ptype, String ltype, String cname, String csname, boolean isList, boolean isFixed, boolean isExtension, PEType typeInfo) {
w(save, " tgt.clear(\""+sname+"\");");
if (isList) {
w(save, " for ("+type+" item : "+name+") {");
if (isExtension) {
w(save, " tgt.makeChild(\""+sname+"\").data().setProperty(\"value[x]\", item);");
} else {
w(save, " tgt.addChild(\""+sname+"\", item);");
}
w(save, " }");
} else if (isPrim) {
w(save, " if ("+name+" != null) {");
if (isExtension) {
w(save, " tgt.makeChild(\""+sname+"\").data().setProperty(\"value[x]\", new "+type+"("+name+"));");
} else if (Utilities.existsInList(type, "DateType", "InstantType", "DateTimeType")) {
w(save, " tgt.addChild(\""+sname+"\", new "+type+"("+name+"));");
} else {
w(save, " tgt.makeChild(\""+sname+"\").data().setProperty(\"value\", new "+type+"("+name+"));");
}
w(save, " }");
} else if (typeInfo != null && typeInfo.getUrl() != null && !typeInfo.getUrl().startsWith("http://hl7.org/fhir/StructureDefinition")) {
w(save, " if ("+name+" != null) {");
w(save, " "+name+".save(tgt.makeChild(\""+sname+"\"), nulls);");
w(save, " }");
} else if (isExtension) {
w(save, " if ("+name+" != null) {");
w(save, " tgt.makeChild(\""+sname+"\").data().setProperty(\"value[x]\", "+name+");");
w(save, " }");
} else {
w(save, " if ("+name+" != null) {");
w(save, " tgt.addChild(\""+sname+"\", "+name+");");
w(save, " }");
}
}
private void genAccessors(boolean isPrim, boolean isAbstract, String name, String type, String init, String ptype, String ltype, String cname, String csname, boolean isList, String shortDoco, boolean isFixed) {
jdoc(accessors, doco, 2, true);
if (isPrim && extensionPolicy != ExtensionPolicy.Primitives && !isList) {
@ -294,6 +383,8 @@ public class PECodeGenerator {
// jdoc(fields, field.documentation(), 2, true);
if (isPrim && extensionPolicy != ExtensionPolicy.Primitives && !isList) {
w(fields, " private "+ptype+" "+name+";"+nn+" // "+shortDoco);
} else if (isList) {
w(fields, " private "+ltype+" "+name+" = new ArrayList<>();"+nn+" // "+shortDoco);
} else {
w(fields, " private "+ltype+" "+name+";"+nn+" // "+shortDoco);
}
@ -311,7 +402,9 @@ public class PECodeGenerator {
private boolean contained;
private boolean meta;
private String language;
private boolean keyELementsOnly;
private boolean keyElementsOnly;
private String genDate = DEFAULT_DATE();
public PECodeGenerator(IWorkerContext workerContext) {
super();
@ -377,12 +470,12 @@ public class PECodeGenerator {
this.language = language;
}
public boolean isKeyELementsOnly() {
return keyELementsOnly;
public boolean isKeyElementsOnly() {
return keyElementsOnly;
}
public void setKeyELementsOnly(boolean keyELementsOnly) {
this.keyELementsOnly = keyELementsOnly;
public void setKeyElementsOnly(boolean keyElementsOnly) {
this.keyElementsOnly = keyElementsOnly;
}
public boolean isContained() {
@ -393,6 +486,14 @@ public class PECodeGenerator {
this.contained = contained;
}
public String getGenDate() {
return genDate;
}
public void setGenDate(String genDate) {
this.genDate = genDate;
}
private StringBuilder imports = new StringBuilder();
/**
@ -420,7 +521,7 @@ public class PECodeGenerator {
jdoc(b, source.getProfile().getCopyright(), 0, false);
}
w(b, imports.toString());
cls.write(b);
cls.write(b, source.getProfile().getCopyright());
TextFile.stringToFile(b.toString(), Utilities.path(folder, cls.name+".java"));
}
@ -498,7 +599,7 @@ public class PECodeGenerator {
if (child.definition().getBase().getPath().equals("DomainResource.contained")) {
return contained;
}
return !keyELementsOnly || (child.isKeyElement());
return !keyElementsOnly || (child.isKeyElement());
}

View File

@ -1,5 +1,33 @@
package org.hl7.fhir.r5.profilemodel.gen;
/*
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 org.hl7.fhir.r5.context.IWorkerContext;
import org.hl7.fhir.r5.model.Base;
import org.hl7.fhir.r5.profilemodel.PEInstance;

View File

@ -1,232 +0,0 @@
package org.hl7.fhir.r5.profilemodel.gen;
import java.util.ArrayList;
import java.util.List;
import org.hl7.fhir.r5.context.IWorkerContext;
import org.hl7.fhir.r5.model.CodeType;
import org.hl7.fhir.r5.model.CodeableConcept;
import org.hl7.fhir.r5.model.Coding;
import org.hl7.fhir.r5.model.Enumerations.ObservationStatus;
import org.hl7.fhir.r5.model.Observation;
import org.hl7.fhir.r5.model.StringType;
import org.hl7.fhir.r5.profilemodel.PEBuilder;
import org.hl7.fhir.r5.profilemodel.PEBuilder.PEElementPropertiesPolicy;
import org.hl7.fhir.r5.profilemodel.PEInstance;
/**
* This class is a manually written example of the code that a POJO code
* generator for Profiles would produce
*
* Should you generate code? If you can bind at compile time, then you should.
* If you can't - and most systems can't, given the nature of profiles, then
* you should use PEInstance directly
*
* @author grahamegrieve
*
*/
public class ProfileExample extends PEGeneratedBase {
public enum LOINCCodesForCholesterolInSerumPlasma {
L14647_2, L2093_3, L35200_5, L9342_7;
public String getCode() {
switch (this) {
case L14647_2: return "14647-2";
case L2093_3: return "2093-3";
case L35200_5: return "35200-5";
case L9342_7: return "9342-7";
}
return null;
}
public String getDisplay() {
switch (this) {
case L14647_2: return "Cholesterol [Moles/Volume]";
case L2093_3: return "Cholesterol [Mass/Volume]";
case L35200_5: return "Cholesterol [Mass Or Moles/Volume]";
case L9342_7: return "Cholesterol [Percentile]";
}
return null;
}
public static LOINCCodesForCholesterolInSerumPlasma fromCode(String code) {
if (code != null) {
switch (code) {
case "14647-2": return L14647_2;
case "2093-3": return L2093_3;
case "35200-5": return L35200_5;
case "9342-7": return L9342_7;
}
}
return null;
}
}
public static class ProfileExampleComplexSlice3 extends PEGeneratedBase {
private ProfileExampleComplexSlice3(PEInstance instance) {
super();
this.instance = instance;
}
public List<Coding> getSlice3a() {
List<Coding> res = new ArrayList<>();
for (PEInstance pe : instance.children("slice3a")) {
res.add((Coding) pe.asDataType());
}
return res;
}
public boolean hasSlice3a() {
return instance.children("slice3a").size() > 0;
}
public ProfileExampleComplexSlice3 clearSlice3a() {
removeChildren("slice3a");
return this;
}
public List<StringType> getSlice3b() {
List<StringType> res = new ArrayList<>();
for (PEInstance pe : instance.children("slice3b")) {
res.add((StringType) pe.asDataType());
}
return res;
}
public boolean hasSlice3b() {
return instance.children("slice3b").size() > 0;
}
public ProfileExampleComplexSlice3 clearSlice3b() {
removeChildren("slice3b");
return this;
}
}
public static class ProfileExampleComplex extends PEGeneratedBase {
private ProfileExampleComplex(PEInstance instance) {
super();
this.instance = instance;
}
public List<Coding> getSlice1() {
List<Coding> res = new ArrayList<>();
for (PEInstance pe : instance.children("slice1")) {
res.add((Coding) pe.asDataType());
}
return res;
}
public boolean hasSlice1() {
return instance.children("slice1").size() > 0;
}
public ProfileExampleComplex clearSlice1() {
removeChildren("slice1");
return this;
}
public List<StringType> getSlice2() {
List<StringType> res = new ArrayList<>();
for (PEInstance pe : instance.children("slice2")) {
res.add((StringType) pe.asDataType());
}
return res;
}
public boolean hasSlice2() {
return instance.children("slice2").size() > 0;
}
public ProfileExampleComplex clearSlice2() {
removeChildren("slice1");
return this;
}
public ProfileExampleComplexSlice3 getSlice3() {
PEInstance pe = instance.forceChild("slice3");
return new ProfileExampleComplexSlice3(pe);
}
public boolean hasComplex() {
return instance.child("slice3") != null;
}
public ProfileExampleComplex clearComplex() {
removeChild("slice3");
return this;
}
}
public ProfileExample(IWorkerContext context, Observation observation) {
super();
PEBuilder builder = new PEBuilder(context, PEElementPropertiesPolicy.EXTENSION_ID, true);
instance = builder.buildPEInstance("http://hl7.org/fhir/test/StructureDefinition/pe-profile1", "0.1", observation);
}
/**
* this is public for testing purposes, but you generally shouldn't use it. If you do, make
* sure the parameters are (PEElementPropertiesPolicy.EXTENSION_ID, true) when building the PEBuilder
*
* @param instance
*/
public ProfileExample(PEInstance instance) {
super();
this.instance = instance;
}
/**
* @return fixed value "final"
*/
public ObservationStatus getStatus() {
return ObservationStatus.FINAL;
}
public CodeableConcept getCode() {
return instance.forceChild("code").asCodeableConcept();
}
/**
* Extension http://hl7.org/fhir/test/StructureDefinition/pe-extension-simple, type code
* @return
*/
public LOINCCodesForCholesterolInSerumPlasma getSimple() {
return LOINCCodesForCholesterolInSerumPlasma.fromCode(((CodeType) instance.forceChild("simple").asDataType()).primitiveValue());
}
public boolean hasSimple() {
return instance.child("simple") != null;
}
public ProfileExample clearSimple() {
removeChild("simple");
return this;
}
public ProfileExampleComplex getComplex() {
PEInstance pe = instance.child("complex");
return new ProfileExampleComplex(pe);
}
public boolean hasComplex() {
return instance.child("complex") != null;
}
public ProfileExample clearComplex() {
removeChild("complex");
return this;
}
/*
* this doesn't exist, because of the way infrastructure works.
* You get the value and set the properties
*/
// public void setSimple() {
// return (CodeType) instance.forceChild("simple").asDataType();
// }
}

View File

@ -0,0 +1,82 @@
package org.hl7.fhir.r5.profiles;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.r5.context.IWorkerContext;
import org.hl7.fhir.r5.model.CodeableConcept;
import org.hl7.fhir.r5.model.Identifier;
import org.hl7.fhir.r5.model.Observation;
import org.hl7.fhir.r5.model.Patient;
import org.hl7.fhir.r5.model.Reference;
import org.hl7.fhir.r5.context.SimpleWorkerContext;
import org.hl7.fhir.r5.formats.IParser.OutputStyle;
import org.hl7.fhir.r5.formats.JsonParser;
import org.hl7.fhir.r5.formats.XmlParser;
import org.hl7.fhir.r5.profilemodel.PEBuilder;
import org.hl7.fhir.r5.test.utils.CompareUtilities;
import org.hl7.fhir.r5.test.utils.TestPackageLoader;
import org.hl7.fhir.r5.test.utils.TestingUtilities;
import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.npm.NpmPackage;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.hl7.fhir.utilities.npm.FilesystemPackageCacheManager;
public class GeneratedPEModelTest {
private IWorkerContext ctxt;
public void load() throws Exception {
if (ctxt == null) {
ctxt = TestingUtilities.getSharedWorkerContext();
FilesystemPackageCacheManager pc = new FilesystemPackageCacheManager(true);
NpmPackage npm = pc.loadPackage("hl7.fhir.us.core", "5.0.0");
ctxt.loadFromPackage(npm, new TestPackageLoader(Utilities.strings("StructureDefinition" )));
ctxt.cacheResource(new JsonParser().parse(TestingUtilities.loadTestResource("r5", "profiles", "pe-extension-simple.json")));
ctxt.cacheResource(new JsonParser().parse(TestingUtilities.loadTestResource("r5", "profiles", "pe-extension-complex.json")));
ctxt.cacheResource(new JsonParser().parse(TestingUtilities.loadTestResource("r5", "profiles", "pe-profile2.json")));
ctxt.cacheResource(new JsonParser().parse(TestingUtilities.loadTestResource("r5", "profiles", "pe-profile1.json")));
}
}
@Test
public void testPEGenLoad() throws Exception {
load();
Observation obs = (Observation) new XmlParser().parse(TestingUtilities.loadTestResourceStream("r5", "profiles", "pe-instance.xml"));
TestProfile tp = TestProfile.fromSource(ctxt, obs);
Assertions.assertEquals("pe-instance", tp.getId());
Assertions.assertNotNull(tp);
Assertions.assertEquals("pe-instance", tp.getId());
Assertions.assertEquals("something", tp.getIdentifier().getValue());
Assertions.assertEquals("final", tp.getStatus());
Assertions.assertEquals("Sexual Orientation", tp.getCode().getText());
Assertions.assertEquals("Patient/us-example", tp.getSubject().getReference());
Assertions.assertNull(tp.getEncounter().getReference());
Assertions.assertNotNull(tp.getEffective());
Assertions.assertEquals(0, tp.getPerformers().size());
TestDatatypeProfile dt = tp.getValueCodeableConcept();
Assertions.assertNotNull(dt);
Assertions.assertEquals("42035005", dt.getSnomedct().getCode());
Assertions.assertEquals("LA22876-9", dt.getLoinc().getCode());
Assertions.assertFalse(dt.hasCoding());
Assertions.assertEquals("code", tp.getSimple());
Assertions.assertEquals("14647-2", tp.getComplex().getSlice1().getCode());
Assertions.assertEquals("something", tp.getComplex().getSlice2s().get(0).getValue());
Assertions.assertEquals(0, tp.getComplex().getExtensions().size());
Observation tgt = tp.build(ctxt);
new XmlParser().setOutputStyle(OutputStyle.PRETTY).compose(new FileOutputStream(Utilities.path("[tmp]", "pe-instance-gen.xml")), tgt);
String msg = CompareUtilities.checkXMLIsSame(TestingUtilities.loadTestResourceStream("r5", "profiles", "pe-instance.xml"), new FileInputStream(Utilities.path("[tmp]", "pe-instance-gen.xml")));
Assertions.assertNull(msg, msg);
}
}

View File

@ -1,7 +1,39 @@
package org.hl7.fhir.r5.profiles;
/*
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.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.hl7.fhir.r5.context.IWorkerContext;
@ -16,15 +48,12 @@ import org.hl7.fhir.r5.profilemodel.PEInstance;
import org.hl7.fhir.r5.profilemodel.PEType;
import org.hl7.fhir.r5.profilemodel.gen.PECodeGenerator;
import org.hl7.fhir.r5.profilemodel.gen.PECodeGenerator.ExtensionPolicy;
import org.hl7.fhir.r5.profilemodel.gen.ProfileExample;
import org.hl7.fhir.r5.profilemodel.gen.ProfileExample.LOINCCodesForCholesterolInSerumPlasma;
import org.hl7.fhir.r5.profilemodel.gen.ProfileExample.ProfileExampleComplex;
import org.hl7.fhir.r5.profilemodel.gen.ProfileExample.ProfileExampleComplexSlice3;
import org.hl7.fhir.r5.profilemodel.PEBuilder;
import org.hl7.fhir.r5.profilemodel.PEBuilder.PEElementPropertiesPolicy;
import org.hl7.fhir.r5.profilemodel.PEInstance.PEInstanceDataKind;
import org.hl7.fhir.r5.test.utils.TestPackageLoader;
import org.hl7.fhir.r5.test.utils.TestingUtilities;
import org.hl7.fhir.utilities.TextFile;
import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.npm.FilesystemPackageCacheManager;
import org.hl7.fhir.utilities.npm.NpmPackage;
@ -78,7 +107,7 @@ public class PETests {
checkElement(children.get(4), "contained", "contained", 0, Integer.MAX_VALUE, false, "http://hl7.org/fhir/StructureDefinition/Resource", 4, "contained");
checkElement(children.get(5), "extension", "extension", 0, Integer.MAX_VALUE, false, "http://hl7.org/fhir/StructureDefinition/Extension", 3, "extension.where(((url = 'http://hl7.org/fhir/test/StructureDefinition/pe-extension-simple') or (url = 'http://hl7.org/fhir/test/StructureDefinition/pe-extension-complex')).not())");
checkElement(children.get(6), "extension", "simple", 0, 1, false, "http://hl7.org/fhir/StructureDefinition/code", 2, "extension('http://hl7.org/fhir/test/StructureDefinition/pe-extension-simple').value");
checkElement(children.get(7), "extension", "complex", 0, 1, false, "http://hl7.org/fhir/StructureDefinition/Extension", 4, "extension('http://hl7.org/fhir/test/StructureDefinition/pe-extension-complex')");
checkElement(children.get(7), "extension", "complex", 0, 1, false, "http://hl7.org/fhir/test/StructureDefinition/pe-extension-complex", 4, "extension('http://hl7.org/fhir/test/StructureDefinition/pe-extension-complex')");
checkElement(children.get(8), "identifier", "identifier", 0, 1, false, "http://hl7.org/fhir/StructureDefinition/Identifier", 7, "identifier");
checkElement(children.get(9), "status", "status", 1, 1, true, "http://hl7.org/fhir/StructureDefinition/code", 2, "status");
checkElement(children.get(10), "category", "category", 0, Integer.MAX_VALUE, false, "http://hl7.org/fhir/StructureDefinition/CodeableConcept", 3, "category");
@ -107,7 +136,7 @@ public class PETests {
checkElement(ggchildren.get(1), "value", "value", 1, 1, false, null, 3, "value");
gchildren = children.get(7).children("http://hl7.org/fhir/StructureDefinition/Extension");
checkElement(gchildren.get(0), "extension", "extension", 0, Integer.MAX_VALUE, false, "http://hl7.org/fhir/StructureDefinition/Extension", 3, "extension");
checkElement(gchildren.get(0), "extension", "extension", 0, Integer.MAX_VALUE, false, "http://hl7.org/fhir/StructureDefinition/Extension", 3, "extension.where(((url = 'slice1') or (url = 'slice2') or (url = 'slice3')).not())");
checkElement(gchildren.get(1), "extension", "slice1", 0, 2, false, "http://hl7.org/fhir/StructureDefinition/Coding", 6, "extension('slice1').value");
checkElement(gchildren.get(2), "extension", "slice2", 0, Integer.MAX_VALUE, false, "http://hl7.org/fhir/StructureDefinition/string", 2, "extension('slice2').value");
checkElement(gchildren.get(3), "extension", "slice3", 1, 1, false, "http://hl7.org/fhir/StructureDefinition/Extension", 3, "extension('slice3')");
@ -171,7 +200,7 @@ public class PETests {
Assertions.assertEquals("extension", pe.schemaName());
Assertions.assertEquals(0, pe.min());
Assertions.assertEquals(1, pe.max());
Assertions.assertEquals("Extension", pe.types().get(0).getName());
Assertions.assertEquals("USCoreEthnicityExtension", pe.types().get(0).getName());
Assertions.assertNotNull(pe.definition());
Assertions.assertNotNull(pe.baseDefinition());
Assertions.assertEquals("US Core ethnicity Extension", pe.shortDocumentation());
@ -359,36 +388,41 @@ public class PETests {
PEInstance slice3 = complex.child("slice3");
Assertions.assertNotNull(slice3);
Assertions.assertEquals("TestProfile.complex.slice3", slice3.getPath());
ProfileExample ex = new ProfileExample(obs);
Assertions.assertEquals(ObservationStatus.FINAL, ex.getStatus());
Assertions.assertEquals("76690-7", ex.getCode().getCodingFirstRep().getCode());
Assertions.assertEquals(LOINCCodesForCholesterolInSerumPlasma.L14647_2, ex.getSimple());
ProfileExampleComplex cplx = ex.getComplex();
Assertions.assertNotNull(cplx);
Assertions.assertEquals("18767-4", cplx.getSlice1().get(0).getCode());
Assertions.assertEquals("A string value", cplx.getSlice2().get(0).primitiveValue());
ProfileExampleComplexSlice3 sl3 = cplx.getSlice3();
Assertions.assertEquals("56874-1", sl3.getSlice3a().get(0).getCode());
Assertions.assertEquals("Another string value", sl3.getSlice3b().get(0).primitiveValue());
}
@Test
public void testGenerate() throws IOException {
load();
PECodeGenerator gen = new PECodeGenerator(ctxt);
gen.setFolder(Utilities.path("[tmp]"));
gen.setCanonical("http://hl7.org/fhir/test/StructureDefinition/pe-profile1");
gen.setPkgName("org.hl7.fhir.r5.profiles");
gen.setExtensionPolicy(ExtensionPolicy.None);
gen.setExtensionPolicy(ExtensionPolicy.Complexes);
gen.setNarrative(false);
gen.setMeta(false);
gen.setLanguage("en-AU");
gen.setContained(false);
gen.setKeyELementsOnly(true);
gen.setKeyElementsOnly(true);
gen.setGenDate("{date}");
gen.setCanonical("http://hl7.org/fhir/test/StructureDefinition/pe-profile1");
gen.setPkgName("org.hl7.fhir.r5.profiles");
gen.execute();
gen.setCanonical("http://hl7.org/fhir/test/StructureDefinition/pe-profile2");
gen.execute();
gen.setCanonical("http://hl7.org/fhir/test/StructureDefinition/pe-extension-complex");
gen.execute();
checkGeneratedJava("TestComplexExtension");
checkGeneratedJava("TestDatatypeProfile");
checkGeneratedJava("TestProfile");
}
private void checkGeneratedJava(String name) throws FileNotFoundException, IOException {
String actual = TextFile.fileToString(Utilities.path("[tmp]", name+".java"));
String expected = TestingUtilities.loadTestResource("r5", "profiles", name+".java");
if (!actual.equals(expected)) {
Assertions.fail("Generated code for "+name+" is different");
}
}
}

View File

@ -0,0 +1,218 @@
package org.hl7.fhir.r5.profiles;
import java.util.List;
import java.util.ArrayList;
import javax.annotation.Nullable;
import java.util.Date;
import org.hl7.fhir.r5.context.IWorkerContext;
import org.hl7.fhir.r5.model.*;
import org.hl7.fhir.r5.profilemodel.PEBuilder;
import org.hl7.fhir.r5.profilemodel.PEInstance;
import org.hl7.fhir.r5.profilemodel.PEBuilder.PEElementPropertiesPolicy;
import org.hl7.fhir.r5.profilemodel.gen.PEGeneratedBase;
import java.util.List;
import java.util.ArrayList;
import javax.annotation.Nullable;
import java.util.Date;
import org.hl7.fhir.r5.context.IWorkerContext;
import org.hl7.fhir.r5.model.*;
import org.hl7.fhir.r5.profilemodel.PEBuilder;
import org.hl7.fhir.r5.profilemodel.PEInstance;
import org.hl7.fhir.r5.profilemodel.PEBuilder.PEElementPropertiesPolicy;
import org.hl7.fhir.r5.profilemodel.gen.PEGeneratedBase;
import java.util.List;
import java.util.ArrayList;
import javax.annotation.Nullable;
import java.util.Date;
import org.hl7.fhir.r5.context.IWorkerContext;
import org.hl7.fhir.r5.model.*;
import org.hl7.fhir.r5.profilemodel.PEBuilder;
import org.hl7.fhir.r5.profilemodel.PEInstance;
import org.hl7.fhir.r5.profilemodel.PEBuilder.PEElementPropertiesPolicy;
import org.hl7.fhir.r5.profilemodel.gen.PEGeneratedBase;
// Generated by the HAPI Java Profile Generator, Tue, Sep 26, 2023 00:00+1000
/**
* A complex extension - an extension with 2 levels
*
*/
public class TestComplexExtension extends PEGeneratedBase {
private static final String CANONICAL_URL = "http://hl7.org/fhir/test/StructureDefinition/pe-extension-complex|0.1";
private List<Extension> extensions = new ArrayList<>();// @NotNull // Additional content defined by implementations
private Coding slice1; // A code
private List<StringType> slice2s = new ArrayList<>(); // More Details
private Extension slice3;// @NotNull // Justification Details
/**
* Parameter-less constructor. If you use this, the fixed values won't be filled
* out - they'll be missing. They'll be filled in if/when you call build, so they
* won't be missing from the resource, only from this particular object model
*
*/
public TestComplexExtension() {
// todo
}
/**
* Used when loading other models
*
*/
public static TestComplexExtension fromSource(PEInstance source) {
TestComplexExtension theThing = new TestComplexExtension();
theThing.workerContext = source.getContext();
theThing.load(source);
return theThing;
}
public void load(PEInstance src) {
clear();
for (PEInstance item : src.children("extension")) {
extensions.add((Extension) item.asDataType());
}
if (src.hasChild("slice1")) {
slice1 = (Coding) src.child("slice1").asDataType();
}
for (PEInstance item : src.children("slice2")) {
slice2s.add((StringType) item.asDataType());
}
if (src.hasChild("slice3")) {
slice3 = (Extension) src.child("slice3").asDataType();
}
}
public void save(PEInstance tgt, boolean nulls) {
tgt.clear("extension");
for (Extension item : extensions) {
tgt.addChild("extension", item);
}
tgt.clear("slice1");
if (slice1 != null) {
tgt.makeChild("slice1").data().setProperty("value[x]", slice1);
}
tgt.clear("slice2");
for (StringType item : slice2s) {
tgt.makeChild("slice2").data().setProperty("value[x]", item);
}
tgt.clear("slice3");
if (slice3 != null) {
tgt.makeChild("slice3").data().setProperty("value[x]", slice3);
}
}
/**
* A complex extension - an extension with 2 levels
*
*/
public List<Extension> getExtensions() {
if (extensions == null) { extensions = new ArrayList<>(); }
return extensions;
}
public boolean hasExtensions() {
return extensions != null && !extensions.isEmpty();
}
public Extension addExtension() {
Extension theThing = new Extension();
getExtensions().add(theThing);
return theThing;
}
public boolean hasExtension(Extension item) {
return hasExtensions() && extensions.contains(item);
}
public void removeExtension(Extension item) {
if (hasExtension(item)) {
extensions.remove(item);
}
}
/**
* A complex extension - an extension with 2 levels
*
*/
public Coding getSlice1() {
if (slice1 == null) { slice1 = new Coding(); }
return slice1;
}
public TestComplexExtension setSlice1(Coding value) {
this.slice1 = value;
return this;
}
public boolean hasSlice1() {
return slice1 != null;
}
/**
* A complex extension - an extension with 2 levels
*
*/
public List<StringType> getSlice2s() {
if (slice2s == null) { slice2s = new ArrayList<>(); }
return slice2s;
}
public boolean hasSlice2s() {
return slice2s != null && !slice2s.isEmpty();
}
public StringType addSlice2() {
StringType theThing = new StringType();
getSlice2s().add(theThing);
return theThing;
}
public boolean hasSlice2(StringType item) {
return hasSlice2s() && slice2s.contains(item);
}
public void removeSlice2(StringType item) {
if (hasSlice2(item)) {
slice2s.remove(item);
}
}
/**
* A complex extension - an extension with 2 levels
*
*/
public Extension getSlice3() {
if (slice3 == null) { slice3 = new Extension(); }
return slice3;
}
public TestComplexExtension setSlice3(Extension value) {
this.slice3 = value;
return this;
}
public boolean hasSlice3() {
return slice3 != null;
}
public void clear() {
extensions.clear();
slice1 = null;
slice2s.clear();
slice3 = null;
}
}

View File

@ -36,9 +36,9 @@ public class TestDatatypeProfile extends PEGeneratedBase {
private static final String CANONICAL_URL = "http://hl7.org/fhir/test/StructureDefinition/pe-profile2|0.1";
private List<Coding> codings;// @NotNull // Code defined by a terminology system
private List<Coding> snomedcts;// @NotNull // Code defined by a terminology system
private List<Coding> loincs; // Code defined by a terminology system
private Coding coding;// @NotNull // Code defined by a terminology system
private Coding snomedct;// @NotNull // Code defined by a terminology system
private Coding loinc; // Code defined by a terminology system
private String text;// @NotNull // Plain text representation of the concept
/**
@ -64,14 +64,14 @@ public class TestDatatypeProfile extends PEGeneratedBase {
public void load(PEInstance src) {
clear();
for (PEInstance item : src.children("codings")) {
codings.add((Coding) item.asDataType());
if (src.hasChild("coding")) {
coding = (Coding) src.child("coding").asDataType();
}
for (PEInstance item : src.children("snomedcts")) {
snomedcts.add((Coding) item.asDataType());
if (src.hasChild("snomedct")) {
snomedct = (Coding) src.child("snomedct").asDataType();
}
for (PEInstance item : src.children("loincs")) {
loincs.add((Coding) item.asDataType());
if (src.hasChild("loinc")) {
loinc = (Coding) src.child("loinc").asDataType();
}
if (src.hasChild("text")) {
text = ((StringType) src.child("text").asDataType()).getValue();
@ -80,6 +80,22 @@ public class TestDatatypeProfile extends PEGeneratedBase {
}
public void save(PEInstance tgt, boolean nulls) {
tgt.clear("coding");
if (coding != null) {
tgt.addChild("coding", coding);
}
tgt.clear("snomedct");
if (snomedct != null) {
tgt.addChild("snomedct", snomedct);
}
tgt.clear("loinc");
if (loinc != null) {
tgt.addChild("loinc", loinc);
}
tgt.clear("text");
if (text != null) {
tgt.makeChild("text").data().setProperty("value", new StringType(text));
}
}
@ -87,92 +103,53 @@ public class TestDatatypeProfile extends PEGeneratedBase {
* Test CodeableConcept Profile.
*
*/
public List<Coding> getCodings() {
if (codings == null) { codings = new ArrayList<>(); }
return codings;
public Coding getCoding() {
if (coding == null) { coding = new Coding(); }
return coding;
}
public boolean hasCodings() {
return codings != null && !codings.isEmpty();
public TestDatatypeProfile setCoding(Coding value) {
this.coding = value;
return this;
}
public Coding addCoding() {
Coding theThing = new Coding();
getCodings().add(theThing);
return theThing;
public boolean hasCoding() {
return coding != null;
}
public boolean hasCoding(Coding item) {
return hasCodings() && codings.contains(item);
}
public void removeCoding(Coding item) {
if (hasCoding(item)) {
codings.remove(item);
}
}
/**
* Test CodeableConcept Profile.
*
*/
public List<Coding> getSnomedcts() {
if (snomedcts == null) { snomedcts = new ArrayList<>(); }
return snomedcts;
public Coding getSnomedct() {
if (snomedct == null) { snomedct = new Coding(); }
return snomedct;
}
public boolean hasSnomedcts() {
return snomedcts != null && !snomedcts.isEmpty();
public TestDatatypeProfile setSnomedct(Coding value) {
this.snomedct = value;
return this;
}
public Coding addSnomedct() {
Coding theThing = new Coding();
getSnomedcts().add(theThing);
return theThing;
public boolean hasSnomedct() {
return snomedct != null;
}
public boolean hasSnomedct(Coding item) {
return hasSnomedcts() && snomedcts.contains(item);
}
public void removeSnomedct(Coding item) {
if (hasSnomedct(item)) {
snomedcts.remove(item);
}
}
/**
* Test CodeableConcept Profile.
*
*/
public List<Coding> getLoincs() {
if (loincs == null) { loincs = new ArrayList<>(); }
return loincs;
public Coding getLoinc() {
if (loinc == null) { loinc = new Coding(); }
return loinc;
}
public boolean hasLoincs() {
return loincs != null && !loincs.isEmpty();
public TestDatatypeProfile setLoinc(Coding value) {
this.loinc = value;
return this;
}
public Coding addLoinc() {
Coding theThing = new Coding();
getLoincs().add(theThing);
return theThing;
public boolean hasLoinc() {
return loinc != null;
}
public boolean hasLoinc(Coding item) {
return hasLoincs() && loincs.contains(item);
}
public void removeLoinc(Coding item) {
if (hasLoinc(item)) {
loincs.remove(item);
}
}
/**
* Test CodeableConcept Profile.
*
@ -193,9 +170,9 @@ public class TestDatatypeProfile extends PEGeneratedBase {
public void clear() {
codings = null;
snomedcts = null;
loincs = null;
coding = null;
snomedct = null;
loinc = null;
text = null;
}

View File

@ -37,13 +37,16 @@ public class TestProfile extends PEGeneratedBase {
private static final String CANONICAL_URL = "http://hl7.org/fhir/test/StructureDefinition/pe-profile1|0.1";
private String id; //
private List<Identifier> identifiers; // Business Identifier for observation
private List<Extension> extensions = new ArrayList<>(); // Extension
private String simple; // A simple extension
private TestComplexExtension complex; // A complex extension
private Identifier identifier; // Business Identifier for observation
private String status;// @NotNull // registered | preliminary | final | amended +
private CodeableConcept code;// @NotNull // Sexual Orientation
private Reference subject;// @NotNull // Who and/or what the observation is about
private Reference encounter; // Healthcare event during which this observation is made
private Date effective;// @NotNull // Clinically relevant time/time-period for observation
private List<Reference> performers; // Who is responsible for the observation
private List<Reference> performers = new ArrayList<>(); // Who is responsible for the observation
private TestDatatypeProfile valueCodeableConcept; // Sexual Orientation
/**
@ -86,11 +89,20 @@ public class TestProfile extends PEGeneratedBase {
if (src.hasChild("id")) {
id = ((IdType) src.child("id").asDataType()).getValue();
}
for (PEInstance item : src.children("identifiers")) {
identifiers.add((Identifier) item.asDataType());
for (PEInstance item : src.children("extension")) {
extensions.add((Extension) item.asDataType());
}
if (src.hasChild("simple")) {
simple = src.child("simple").asDataType().primitiveValue();
}
if (src.hasChild("complex")) {
complex = TestComplexExtension.fromSource(src.child("complex"));
}
if (src.hasChild("identifier")) {
identifier = (Identifier) src.child("identifier").asDataType();
}
if (src.hasChild("status")) {
status = ((CodeType) src.child("status").asDataType()).getValue();
status = src.child("status").asDataType().primitiveValue();
}
if (src.hasChild("code")) {
code = (CodeableConcept) src.child("code").asDataType();
@ -104,7 +116,7 @@ public class TestProfile extends PEGeneratedBase {
if (src.hasChild("effective")) {
effective = ((DateTimeType) src.child("effective").asDataType()).getValue();
}
for (PEInstance item : src.children("performers")) {
for (PEInstance item : src.children("performer")) {
performers.add((Reference) item.asDataType());
}
if (src.hasChild("valueCodeableConcept")) {
@ -139,6 +151,54 @@ public class TestProfile extends PEGeneratedBase {
}
public void save(PEInstance tgt, boolean nulls) {
tgt.clear("id");
if (id != null) {
tgt.makeChild("id").data().setProperty("value", new IdType(id));
}
tgt.clear("extension");
for (Extension item : extensions) {
tgt.addChild("extension", item);
}
tgt.clear("simple");
if (simple != null) {
tgt.makeChild("simple").data().setProperty("value[x]", new CodeType(simple));
}
tgt.clear("complex");
if (complex != null) {
complex.save(tgt.makeChild("complex"), nulls);
}
tgt.clear("identifier");
if (identifier != null) {
tgt.addChild("identifier", identifier);
}
tgt.clear("status");
if (status != null) {
tgt.makeChild("status").data().setProperty("value", new StringType(status));
}
tgt.clear("code");
if (code != null) {
tgt.addChild("code", code);
}
tgt.clear("subject");
if (subject != null) {
tgt.addChild("subject", subject);
}
tgt.clear("encounter");
if (encounter != null) {
tgt.addChild("encounter", encounter);
}
tgt.clear("effective");
if (effective != null) {
tgt.addChild("effective", new DateTimeType(effective));
}
tgt.clear("performer");
for (Reference item : performers) {
tgt.addChild("performer", item);
}
tgt.clear("valueCodeableConcept");
if (valueCodeableConcept != null) {
valueCodeableConcept.save(tgt.makeChild("valueCodeableConcept"), nulls);
}
}
@ -163,32 +223,83 @@ public class TestProfile extends PEGeneratedBase {
* Test Observation Profile.
*
*/
public List<Identifier> getIdentifiers() {
if (identifiers == null) { identifiers = new ArrayList<>(); }
return identifiers;
public List<Extension> getExtensions() {
if (extensions == null) { extensions = new ArrayList<>(); }
return extensions;
}
public boolean hasIdentifiers() {
return identifiers != null && !identifiers.isEmpty();
public boolean hasExtensions() {
return extensions != null && !extensions.isEmpty();
}
public Identifier addIdentifier() {
Identifier theThing = new Identifier();
getIdentifiers().add(theThing);
public Extension addExtension() {
Extension theThing = new Extension();
getExtensions().add(theThing);
return theThing;
}
public boolean hasIdentifier(Identifier item) {
return hasIdentifiers() && identifiers.contains(item);
public boolean hasExtension(Extension item) {
return hasExtensions() && extensions.contains(item);
}
public void removeIdentifier(Identifier item) {
if (hasIdentifier(item)) {
identifiers.remove(item);
public void removeExtension(Extension item) {
if (hasExtension(item)) {
extensions.remove(item);
}
}
/**
* Test Observation Profile.
*
*/
public String getSimple() {
return simple;
}
public TestProfile setSimple(String value) {
this.simple = value;
return this;
}
public boolean hasSimple() {
return simple != null;
}
/**
* Test Observation Profile.
*
*/
public TestComplexExtension getComplex() {
if (complex == null) { complex = new TestComplexExtension(); }
return complex;
}
public TestProfile setComplex(TestComplexExtension value) {
this.complex = value;
return this;
}
public boolean hasComplex() {
return complex != null;
}
/**
* Test Observation Profile.
*
*/
public Identifier getIdentifier() {
if (identifier == null) { identifier = new Identifier(); }
return identifier;
}
public TestProfile setIdentifier(Identifier value) {
this.identifier = value;
return this;
}
public boolean hasIdentifier() {
return identifier != null;
}
/**
* Test Observation Profile.
*
@ -321,13 +432,16 @@ public class TestProfile extends PEGeneratedBase {
public void clear() {
id = null;
identifiers = null;
extensions.clear();
simple = null;
complex = null;
identifier = null;
status = null;
code = null;
subject = null;
encounter = null;
effective = null;
performers = null;
performers.clear();
valueCodeableConcept = null;
}