Skip to content

Commit

Permalink
issue #3289 - ResourceType and ResourceTypeCode
Browse files Browse the repository at this point in the history
1. Update the CodeGenerator to combine the ResourceType and
FHIRResourceType code subtypes into a single new code subtype named
`ResourceTypeCode`
2. Rename the ResourceTypeName enum in fhir-core to ResourceType, move
the `from(String)` method there, and update ResourceTypeCode to use this
enum instead of duplicating the values in a nested class
3. Update all uses of ResourceType.Value and FHIRResourceType.Value to
use the new ResourceType enum instead

The result is
1. a simple enum we can use for ResourceType constants throughout the
codebase; and
2. a single code subtype that builds on this enum for when its used
within the fhir model

Signed-off-by: Lee Surprenant <lmsurpre@us.ibm.com>
  • Loading branch information
lmsurpre committed Feb 7, 2022
1 parent 0138876 commit e7218a3
Show file tree
Hide file tree
Showing 65 changed files with 2,632 additions and 7,090 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import java.util.stream.Collectors;

import com.ibm.fhir.core.FHIRConstants;
import com.ibm.fhir.core.ResourceType;
import com.ibm.fhir.model.format.Format;
import com.ibm.fhir.model.generator.FHIRGenerator;
import com.ibm.fhir.model.resource.SearchParameter;
Expand All @@ -27,7 +28,7 @@
import com.ibm.fhir.model.type.Uri;
import com.ibm.fhir.model.type.code.BindingStrength;
import com.ibm.fhir.model.type.code.FHIRDefinedType;
import com.ibm.fhir.model.type.code.ResourceType;
import com.ibm.fhir.model.type.code.ResourceTypeCode;
import com.ibm.fhir.profile.ProfileSupport;
import com.ibm.fhir.registry.FHIRRegistry;

Expand All @@ -48,8 +49,8 @@ public static void main(String[] args) throws Exception {
continue; // skip the parameters defined in the base spec
}

List<ResourceType> base = searchParameter.getBase();
if (base.size() != 1 || base.get(0).getValueAsEnum() == ResourceType.Value.RESOURCE) {
List<ResourceTypeCode> base = searchParameter.getBase();
if (base.size() != 1 || base.get(0).getValueAsEnum() == ResourceType.RESOURCE) {
continue; // too complicated to handle this case right now
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import java.util.stream.Collectors;

import com.ibm.fhir.core.FHIRConstants;
import com.ibm.fhir.core.ResourceType;
import com.ibm.fhir.model.format.Format;
import com.ibm.fhir.model.generator.FHIRGenerator;
import com.ibm.fhir.model.resource.SearchParameter;
Expand All @@ -27,7 +28,7 @@
import com.ibm.fhir.model.type.Uri;
import com.ibm.fhir.model.type.code.BindingStrength;
import com.ibm.fhir.model.type.code.FHIRDefinedType;
import com.ibm.fhir.model.type.code.ResourceType;
import com.ibm.fhir.model.type.code.ResourceTypeCode;
import com.ibm.fhir.profile.ProfileSupport;
import com.ibm.fhir.registry.FHIRRegistry;

Expand All @@ -49,8 +50,8 @@ public static void main(String[] args) throws Exception {
continue; // skip the parameters defined in the base spec
}

List<ResourceType> base = searchParameter.getBase();
if (base.size() != 1 || base.get(0).getValueAsEnum() == ResourceType.Value.RESOURCE) {
List<ResourceTypeCode> base = searchParameter.getBase();
if (base.size() != 1 || base.get(0).getValueAsEnum() == ResourceType.RESOURCE) {
continue; // too complicated to handle this case right now
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import java.util.stream.Collectors;

import com.ibm.fhir.core.FHIRConstants;
import com.ibm.fhir.core.ResourceType;
import com.ibm.fhir.model.format.Format;
import com.ibm.fhir.model.generator.FHIRGenerator;
import com.ibm.fhir.model.resource.SearchParameter;
Expand All @@ -27,7 +28,7 @@
import com.ibm.fhir.model.type.Uri;
import com.ibm.fhir.model.type.code.BindingStrength;
import com.ibm.fhir.model.type.code.FHIRDefinedType;
import com.ibm.fhir.model.type.code.ResourceType;
import com.ibm.fhir.model.type.code.ResourceTypeCode;
import com.ibm.fhir.profile.ProfileSupport;
import com.ibm.fhir.registry.FHIRRegistry;

Expand All @@ -49,8 +50,8 @@ public static void main(String[] args) throws Exception {
continue; // skip the parameters defined in the base spec
}

List<ResourceType> base = searchParameter.getBase();
if (base.size() != 1 || base.get(0).getValueAsEnum() == ResourceType.Value.RESOURCE) {
List<ResourceTypeCode> base = searchParameter.getBase();
if (base.size() != 1 || base.get(0).getValueAsEnum() == ResourceType.RESOURCE) {
continue; // too complicated to handle this case right now
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import com.ibm.fhir.model.resource.Parameters.Parameter;
import com.ibm.fhir.model.resource.ValueSet;
import com.ibm.fhir.model.type.code.BundleType;
import com.ibm.fhir.model.type.code.ResourceType;
import com.ibm.fhir.model.type.code.ResourceTypeCode;

/**
* This is an implementation of a terminology provider for the CQL Engine that uses
Expand All @@ -47,7 +47,7 @@ public boolean in(Code code, ValueSetInfo valueSet) {

try {
WebTarget target =
fhirClient.getWebTarget().path(ResourceType.VALUE_SET.getValue()).path(valueSet.getId()).path("$validate-code").queryParam("code", FHIRClientUtil.urlencode(code.getCode()));
fhirClient.getWebTarget().path(ResourceTypeCode.VALUE_SET.getValue()).path(valueSet.getId()).path("$validate-code").queryParam("code", FHIRClientUtil.urlencode(code.getCode()));

if (code.getSystem() != null) {
target = target.queryParam("system", FHIRClientUtil.urlencode(code.getSystem()));
Expand All @@ -73,7 +73,7 @@ public Iterable<Code> expand(ValueSetInfo valueSet) {

try {
Response response =
fhirClient.getWebTarget().path(ResourceType.VALUE_SET.getValue()).path(valueSet.getId()).path("$expand").request(MediaType.APPLICATION_JSON_TYPE).get();
fhirClient.getWebTarget().path(ResourceTypeCode.VALUE_SET.getValue()).path(valueSet.getId()).path("$expand").request(MediaType.APPLICATION_JSON_TYPE).get();
FHIRClientUtil.handleErrorResponse(response);

ValueSet expanded = response.readEntity(ValueSet.class);
Expand All @@ -97,7 +97,7 @@ public Iterable<Code> expand(ValueSetInfo valueSet) {
public Code lookup(Code code, CodeSystemInfo codeSystem) {
try {
Response response =
fhirClient.getWebTarget().path(ResourceType.CODE_SYSTEM.getValue()).path("$lookup").queryParam("code", FHIRClientUtil.urlencode(code.getCode())).queryParam("system", FHIRClientUtil.urlencode(code.getSystem())).request(MediaType.APPLICATION_JSON_TYPE).get();
fhirClient.getWebTarget().path(ResourceTypeCode.CODE_SYSTEM.getValue()).path("$lookup").queryParam("code", FHIRClientUtil.urlencode(code.getCode())).queryParam("system", FHIRClientUtil.urlencode(code.getSystem())).request(MediaType.APPLICATION_JSON_TYPE).get();
FHIRClientUtil.handleErrorResponse(response);

Parameters respParam = response.readEntity(Parameters.class);
Expand Down Expand Up @@ -144,13 +144,13 @@ public void resolveByUrl(ValueSetInfo valueSet) {
// https://github.com/DBCG/cql_engine/pull/462 - Use a search path of URL, identifier, and then resource id
FHIRParameters parameters = new FHIRParameters();
parameters.searchParam("url", encodedId);
response = fhirClient.search(ResourceType.VALUE_SET.getValue(), parameters);
response = fhirClient.search(ResourceTypeCode.VALUE_SET.getValue(), parameters);
FHIRClientUtil.handleErrorResponse(response);
searchResults = response.getResource(Bundle.class);
if (!searchResults.hasChildren() || searchResults.getEntry().isEmpty()) {
parameters = new FHIRParameters();
parameters.searchParam("identifier", encodedId);
searchResults = fhirClient.search(ResourceType.VALUE_SET.getValue(), parameters).getResource(Bundle.class);
searchResults = fhirClient.search(ResourceTypeCode.VALUE_SET.getValue(), parameters).getResource(Bundle.class);
if (!searchResults.hasChildren() || searchResults.getEntry().isEmpty()) {
String id = valueSet.getId();
if (id.startsWith(Constants.URN_OID)) {
Expand All @@ -164,7 +164,7 @@ public void resolveByUrl(ValueSetInfo valueSet) {
// be a FHIR resource ID, we will try to read it.
// See https://www.hl7.org/fhir/datatypes.html#id
if (id.matches("[A-Za-z0-9\\-\\.]{1,64}")) {
response = fhirClient.read(ResourceType.VALUE_SET.getValue(), id);
response = fhirClient.read(ResourceTypeCode.VALUE_SET.getValue(), id);
if (response.getStatus() == 200) {
ValueSet vs = response.getResource(ValueSet.class);
searchResults =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import com.ibm.fhir.model.resource.Resource;
import com.ibm.fhir.model.resource.ValueSet;
import com.ibm.fhir.model.type.Uri;
import com.ibm.fhir.model.type.code.ResourceType;
import com.ibm.fhir.model.type.code.ResourceTypeCode;
import com.ibm.fhir.persistence.SingleResourceResult;
import com.ibm.fhir.server.spi.operation.FHIRResourceHelpers;
import com.ibm.fhir.term.service.FHIRTermService;
Expand Down Expand Up @@ -120,7 +120,7 @@ protected ValueSet resolveByUrl(ValueSetInfo valueSetInfo) {
// See https://www.hl7.org/fhir/datatypes.html#id
if (id.matches("[A-Za-z0-9\\-\\.]{1,64}")) {
try {
SingleResourceResult<? extends Resource> result = resourceHelper.doRead(ResourceType.VALUE_SET.getValue(), id, /*throwExOnMissing=*/false, /*includeDeleted=*/false, /*contextResource=*/null);
SingleResourceResult<? extends Resource> result = resourceHelper.doRead(ResourceTypeCode.VALUE_SET.getValue(), id, /*throwExOnMissing=*/false, /*includeDeleted=*/false, /*contextResource=*/null);
if( result.isSuccess() ) {
valueSet = (ValueSet) result.getResource();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import com.ibm.fhir.model.type.Uri;
import com.ibm.fhir.model.type.Url;
import com.ibm.fhir.model.type.Uuid;
import com.ibm.fhir.model.type.code.ResourceTypeCode;
import com.ibm.fhir.model.util.ModelSupport;
import com.ibm.fhir.model.util.ModelSupport.ElementInfo;
import com.ibm.fhir.model.visitor.Visitable;
Expand All @@ -63,13 +64,13 @@ public class FHIRModelResolver implements ModelResolver {
public static final String RESOURCE_PACKAGE_NAME = BASE_PACKAGE_NAME + ".resource";
public static final String TYPE_PACKAGE_NAME = BASE_PACKAGE_NAME + ".type";
public static final String CODE_PACKAGE_NAME = TYPE_PACKAGE_NAME + ".code";



public static final String[] ALL_PACKAGES = new String[] {
RESOURCE_PACKAGE_NAME,
TYPE_PACKAGE_NAME,
CODE_PACKAGE_NAME };
CODE_PACKAGE_NAME };

public static final Pattern urlPattern = Pattern.compile("(^|.+\\.)url$");

Expand Down Expand Up @@ -102,7 +103,13 @@ private static Map<String, Class<?>> buildTypeMap() {

// add all code subtypes
for (Class<?> codeSubtype : ModelSupport.getCodeSubtypes()) {
if (codeSubtype == ResourceTypeCode.class) {
// special case handling for ResourceTypeCode
typeMap.put("ResourceType", codeSubtype);
typeMap.put("FHIRResourceType", codeSubtype);
}
typeMap.put(codeSubtype.getSimpleName(), codeSubtype);

}

return Collections.unmodifiableMap(typeMap);
Expand Down Expand Up @@ -141,7 +148,7 @@ private String toKey(String typeName) {
case "CurrencyCode":
case "MimeType":
case "RequestResourceType":
//removed in 4.3.0
//removed in 4.3.0
case "ExposureState":
case "EvidenceVariableType":
return "code";
Expand Down Expand Up @@ -176,13 +183,13 @@ public Object resolvePath(Object target, String path ) {
target = resolveProperty(target, identifier);
}
}

return target;
}

private Object resolveProperty(Object target, String path) {
Object value = null;

if( target != null ) {
if( target instanceof Visitable) {
Visitable visitable = (Visitable) target;
Expand All @@ -194,11 +201,11 @@ private Object resolveProperty(Object target, String path) {
if( Code.class.isAssignableFrom(clazz) ) {
clazz = Code.class;
}

ElementInfo elementInfo = ModelSupport.getElementInfo(clazz, path);
if( elementInfo.isRepeating() ) {
value = result.stream().map( n -> unpack(n, path) ).collect(Collectors.toList());
} else {
} else {
value = unpack( result.iterator().next(), path);
}
}
Expand All @@ -207,13 +214,13 @@ private Object resolveProperty(Object target, String path) {
}
}
}

return value;
}

protected Object unpack(FHIRPathNode node, String path) {
Object result = null;

if( node.isResourceNode() ) {
result = node.asResourceNode().resource();
} else if( node.isElementNode() ) {
Expand All @@ -224,7 +231,7 @@ protected Object unpack(FHIRPathNode node, String path) {
result = system.asBooleanValue()._boolean();
} else if( system.isNumberValue() ) {
result = system.asNumberValue().number();
} else if( system.isQuantityValue() ) {
} else if( system.isQuantityValue() ) {
result = system.asQuantityValue().value();
} else if( system.isStringValue() ) {
result = system.asStringValue().string();
Expand All @@ -238,9 +245,9 @@ protected Object unpack(FHIRPathNode node, String path) {
} else if( node.isTypeInfoNode() ) {
result = node.asTypeInfoNode().typeInfo();
}

result = patchResult(path, result);

return result;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
*/
package com.ibm.fhir.cql.engine.searchparam;

import com.ibm.fhir.model.type.code.ResourceType;
import com.ibm.fhir.model.type.code.ResourceTypeCode;
import com.ibm.fhir.search.SearchConstants.Modifier;

public class ReferenceParameter extends BaseQueryParameter<ReferenceParameter> {

private ResourceType resourceTypeModifier;
private ResourceTypeCode resourceTypeModifier;
private String chainedProperty;
private String value;

Expand All @@ -22,12 +22,12 @@ public ReferenceParameter(String value) {
this.value = value;
}

public ReferenceParameter(ResourceType resourceTypeModifier, String value) {
public ReferenceParameter(ResourceTypeCode resourceTypeModifier, String value) {
setResourceTypeModifier(resourceTypeModifier);
setValue(value);
}

public ReferenceParameter(ResourceType resourceTypeModifier, String chainedProperty, String value) {
public ReferenceParameter(ResourceTypeCode resourceTypeModifier, String chainedProperty, String value) {
setResourceTypeModifier(resourceTypeModifier);
setValue(value);
}
Expand All @@ -37,11 +37,11 @@ public ReferenceParameter(Modifier modifier, String value) {
setValue(value);
}

public ResourceType getResourceTypeModifier() {
public ResourceTypeCode getResourceTypeModifier() {
return resourceTypeModifier;
}

public ReferenceParameter setResourceTypeModifier(ResourceType resourceTypeModifier) {
public ReferenceParameter setResourceTypeModifier(ResourceTypeCode resourceTypeModifier) {
this.resourceTypeModifier = resourceTypeModifier;
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import org.apache.commons.lang3.tuple.Pair;

import com.ibm.fhir.model.resource.SearchParameter;
import com.ibm.fhir.model.type.code.ResourceType;
import com.ibm.fhir.model.type.code.ResourceTypeCode;
import com.ibm.fhir.model.type.code.SearchParamType;
import com.ibm.fhir.search.util.SearchUtil;

Expand Down Expand Up @@ -69,7 +69,7 @@ public Pair<String, IQueryParameter> createSearchParameter(String context, Strin
if (SearchParamType.TOKEN.equals(searchParam.getType())) {
result = Pair.of(name, new TokenParameter(value).setName(name));
} else if (SearchParamType.REFERENCE.equals(searchParam.getType())) {
result = Pair.of(name, new ReferenceParameter(ResourceType.of(context), value).setName(name));
result = Pair.of(name, new ReferenceParameter(ResourceTypeCode.of(context), value).setName(name));
} else if (SearchParamType.QUANTITY.equals(searchParam.getType())) {
result = Pair.of(name, new QuantityParameter(new BigDecimal(value)).setName(name));
} else if (SearchParamType.STRING.equals(searchParam.getType())) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
import com.ibm.fhir.model.type.CodeableConcept;
import com.ibm.fhir.model.type.code.IssueSeverity;
import com.ibm.fhir.model.type.code.IssueType;
import com.ibm.fhir.model.type.code.ResourceType;
import com.ibm.fhir.model.type.code.ResourceTypeCode;
import com.ibm.fhir.persistence.SingleResourceResult;
import com.ibm.fhir.registry.FHIRRegistry;
import com.ibm.fhir.server.spi.operation.FHIROperationContext;
Expand Down Expand Up @@ -61,7 +61,7 @@ protected Parameters doInvoke(FHIROperationContext operationContext, Class<? ext
try {
Library primaryLibrary = null;
if (operationContext.getType().equals(FHIROperationContext.Type.INSTANCE)) {
SingleResourceResult<?> readResult = resourceHelper.doRead(ResourceType.LIBRARY.getValue(), logicalId, true, false, null);
SingleResourceResult<?> readResult = resourceHelper.doRead(ResourceTypeCode.LIBRARY.getValue(), logicalId, true, false, null);
primaryLibrary = (Library) readResult.getResource();
} else if (operationContext.getType().equals(FHIROperationContext.Type.RESOURCE_TYPE)) {
Parameter param = paramMap.getSingletonParameter("library");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
import com.ibm.fhir.model.resource.Resource;
import com.ibm.fhir.model.type.UnsignedInt;
import com.ibm.fhir.model.type.code.BundleType;
import com.ibm.fhir.model.type.code.ResourceType;
import com.ibm.fhir.model.type.code.ResourceTypeCode;
import com.ibm.fhir.registry.FHIRRegistry;
import com.ibm.fhir.search.SearchConstants;
import com.ibm.fhir.server.spi.operation.FHIROperationContext;
Expand Down Expand Up @@ -72,13 +72,13 @@ protected Parameters doInvoke(FHIROperationContext operationContext, Class<? ext
searchParameters.putSingle("_total", "none");

try {
Bundle bundle = resourceHelper.doSearch(ResourceType.MEASURE.getValue(), null, null, searchParameters, null, null);
Bundle bundle = resourceHelper.doSearch(ResourceTypeCode.MEASURE.getValue(), null, null, searchParameters, null, null);

AtomicInteger pageNumber = new AtomicInteger(1);
FHIRBundleCursor cursor = new FHIRBundleCursor(url -> {
try {
searchParameters.putSingle(SearchConstants.PAGE, String.valueOf(pageNumber.incrementAndGet()));
return resourceHelper.doSearch(ResourceType.MEASURE.getValue(), null, null, searchParameters, null, null);
return resourceHelper.doSearch(ResourceTypeCode.MEASURE.getValue(), null, null, searchParameters, null, null);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
Expand Down
Loading

0 comments on commit e7218a3

Please sign in to comment.