Add setting to disable resource type target validation in JPA

This commit is contained in:
James Agnew 2019-03-12 17:45:19 -04:00
parent 6597a928d5
commit ed4da7c414
4 changed files with 48 additions and 11 deletions

View File

@ -1550,15 +1550,17 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao,
continue;
}
for (IBase nextChild : values) {
IBaseReference nextRef = (IBaseReference) nextChild;
IIdType referencedId = nextRef.getReferenceElement();
if (!isBlank(referencedId.getResourceType())) {
if (!isLogicalReference(referencedId)) {
if (!referencedId.getValue().contains("?")) {
if (!validTypes.contains(referencedId.getResourceType())) {
throw new UnprocessableEntityException(
"Invalid reference found at path '" + newPath + "'. Resource type '" + referencedId.getResourceType() + "' is not valid for this path");
if (getConfig().isEnforceReferenceTargetTypes()) {
for (IBase nextChild : values) {
IBaseReference nextRef = (IBaseReference) nextChild;
IIdType referencedId = nextRef.getReferenceElement();
if (!isBlank(referencedId.getResourceType())) {
if (!isLogicalReference(referencedId)) {
if (!referencedId.getValue().contains("?")) {
if (!validTypes.contains(referencedId.getResourceType())) {
throw new UnprocessableEntityException(
"Invalid reference found at path '" + newPath + "'. Resource type '" + referencedId.getResourceType() + "' is not valid for this path");
}
}
}
}

View File

@ -26,9 +26,9 @@ import java.util.*;
* 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.
@ -142,6 +142,7 @@ public class DaoConfig {
private List<WarmCacheEntry> myWarmCacheEntries = new ArrayList<>();
private boolean myDisableHashBasedSearches;
private boolean myEnableInMemorySubscriptionMatching = true;
private boolean myEnforceReferenceTargetTypes = true;
private ClientIdStrategyEnum myResourceClientIdStrategy = ClientIdStrategyEnum.ALPHANUMERIC;
/**
@ -161,6 +162,26 @@ public class DaoConfig {
}
}
/**
* If set to <code>true</code> (default is true) when a resource is being persisted,
* the target resource types of references will be validated to ensure that they
* are appropriate for the field containing the reference. This is generally a good idea
* because invalid reference target types may not be searchable.
*/
public boolean isEnforceReferenceTargetTypes() {
return myEnforceReferenceTargetTypes;
}
/**
* If set to <code>true</code> (default is true) when a resource is being persisted,
* the target resource types of references will be validated to ensure that they
* are appropriate for the field containing the reference. This is generally a good idea
* because invalid reference target types may not be searchable.
*/
public void setEnforceReferenceTargetTypes(boolean theEnforceReferenceTargetTypes) {
myEnforceReferenceTargetTypes = theEnforceReferenceTargetTypes;
}
/**
* If a non-null value is supplied (default is <code>null</code>), a default
* for the <code>_total</code> parameter may be specified here. For example,
@ -1392,6 +1413,7 @@ public class DaoConfig {
/**
* If set to <code>true</code> (default is true) the server will match incoming resources against active subscriptions
* and send them to the subscription channel. If set to <code>false</code> no matching or sending occurs.
*
* @since 3.7.0
*/
@ -1402,6 +1424,7 @@ public class DaoConfig {
/**
* If set to <code>true</code> (default is true) the server will match incoming resources against active subscriptions
* and send them to the subscription channel. If set to <code>false</code> no matching or sending occurs.
*
* @since 3.7.0
*/

View File

@ -73,6 +73,7 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
myDaoConfig.setAllowExternalReferences(new DaoConfig().isAllowExternalReferences());
myDaoConfig.setTreatReferencesAsLogical(new DaoConfig().getTreatReferencesAsLogical());
myDaoConfig.setEnforceReferentialIntegrityOnDelete(new DaoConfig().isEnforceReferentialIntegrityOnDelete());
myDaoConfig.setEnforceReferenceTargetTypes(new DaoConfig().isEnforceReferenceTargetTypes());
}
private void assertGone(IIdType theId) {
@ -945,6 +946,13 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
assertEquals("Resource Organization/testCreateWithIllegalReference not found, specified in path: Patient.managingOrganization", e.getMessage());
}
// Disable validation
myDaoConfig.setEnforceReferenceTargetTypes(false);
Patient p = new Patient();
p.getManagingOrganization().setReferenceElement(id1);
myPatientDao.create(p, mySrd);
}
@Test

View File

@ -73,6 +73,10 @@
(e.g. "Patient?identifier=&amp;identifier=b" returned no results even if resources
should have matched. Thanks to @mingdatacom for reporting!
</action>
<action type="add">
A new config setting has been added to the JPA DaoConfig that disables validation
of the resource type for target resources in references.
</action>
</release>
<release version="3.7.0" date="2019-02-06" description="Gale">
<action type="add">