Moved concurrent details from ValidationOptions to FhirValidator
This commit is contained in:
parent
9eb20cb668
commit
47454554e3
|
@ -127,6 +127,7 @@ public class FhirContext {
|
|||
private volatile Boolean myFormatJsonSupported;
|
||||
private volatile Boolean myFormatNDJsonSupported;
|
||||
private volatile Boolean myFormatRdfSupported;
|
||||
private IFhirValidatorFactory myFhirValidatorFactory = fhirContext -> new FhirValidator(fhirContext);
|
||||
|
||||
/**
|
||||
* @deprecated It is recommended that you use one of the static initializer methods instead
|
||||
|
@ -908,7 +909,7 @@ public class FhirContext {
|
|||
* </p>
|
||||
*/
|
||||
public FhirValidator newValidator() {
|
||||
return new FhirValidator(this);
|
||||
return myFhirValidatorFactory.newFhirValidator(this);
|
||||
}
|
||||
|
||||
public ViewGenerator newViewGenerator() {
|
||||
|
@ -1072,9 +1073,22 @@ public class FhirContext {
|
|||
*
|
||||
* @param theParserErrorHandler The error handler
|
||||
*/
|
||||
public void setParserErrorHandler(final IParserErrorHandler theParserErrorHandler) {
|
||||
public FhirContext setParserErrorHandler(final IParserErrorHandler theParserErrorHandler) {
|
||||
Validate.notNull(theParserErrorHandler, "theParserErrorHandler must not be null");
|
||||
myParserErrorHandler = theParserErrorHandler;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the factory method used to create FhirValidator instances
|
||||
*
|
||||
* @param theFhirValidatorFactory
|
||||
* @return this
|
||||
* @since 5.6.0
|
||||
*/
|
||||
public FhirContext setFhirValidatorFactory(IFhirValidatorFactory theFhirValidatorFactory) {
|
||||
myFhirValidatorFactory = theFhirValidatorFactory;
|
||||
return this;
|
||||
}
|
||||
|
||||
@SuppressWarnings({"cast"})
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
package ca.uhn.fhir.context;
|
||||
|
||||
import ca.uhn.fhir.validation.FhirValidator;
|
||||
|
||||
public interface IFhirValidatorFactory {
|
||||
FhirValidator newFhirValidator(FhirContext theFhirContext);
|
||||
}
|
|
@ -58,11 +58,16 @@ public class FhirValidator {
|
|||
private static final Logger ourLog = LoggerFactory.getLogger(FhirValidator.class);
|
||||
|
||||
private static final String I18N_KEY_NO_PH_ERROR = FhirValidator.class.getName() + ".noPhError";
|
||||
public static final int DEFAULT_BUNDLE_VALIDATION_THREADCOUNT = 1;
|
||||
|
||||
private static volatile Boolean ourPhPresentOnClasspath;
|
||||
private final FhirContext myContext;
|
||||
private List<IValidatorModule> myValidators = new ArrayList<>();
|
||||
private IInterceptorBroadcaster myInterceptorBraodcaster;
|
||||
// FIXME KHS make it clear in the docs that bundle structure is not validated when this is true
|
||||
private boolean myConcurrentBundleValidation;
|
||||
private int myBundleValidationThreadCount = DEFAULT_BUNDLE_VALIDATION_THREADCOUNT;
|
||||
|
||||
private ExecutorService myExecutor;
|
||||
|
||||
/**
|
||||
|
@ -226,7 +231,7 @@ public class FhirValidator {
|
|||
|
||||
applyDefaultValidators();
|
||||
|
||||
if (theResource instanceof IBaseBundle && theOptions.isConcurrentBundleValidation()) {
|
||||
if (theResource instanceof IBaseBundle && myConcurrentBundleValidation) {
|
||||
return validateBundleEntriesConcurrently((IBaseBundle) theResource, theOptions);
|
||||
}
|
||||
|
||||
|
@ -236,7 +241,7 @@ public class FhirValidator {
|
|||
private ValidationResult validateBundleEntriesConcurrently(IBaseBundle theBundle, ValidationOptions theOptions) {
|
||||
List<IBaseResource> entries = BundleUtil.toListOfResources(myContext, theBundle);
|
||||
|
||||
ExecutorService executorService = getExecutorService(theOptions);
|
||||
ExecutorService executorService = getExecutorService();
|
||||
List<Future<ValidationResult>> futures = new ArrayList<>();
|
||||
for (IBaseResource entry : entries) {
|
||||
futures.add(executorService.submit(() -> validateResource(entry, theOptions)));
|
||||
|
@ -255,9 +260,9 @@ public class FhirValidator {
|
|||
return new ValidationResult(myContext, validationMessages.stream().collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
private ExecutorService getExecutorService(ValidationOptions theOptions) {
|
||||
private ExecutorService getExecutorService() {
|
||||
if (myExecutor == null) {
|
||||
int size = theOptions.getBundleValidationThreadCount();
|
||||
int size = myBundleValidationThreadCount;
|
||||
ourLog.info("Creating FhirValidation thread pool with size {}", size);
|
||||
myExecutor = Executors.newFixedThreadPool(size);
|
||||
}
|
||||
|
@ -308,7 +313,7 @@ public class FhirValidator {
|
|||
|
||||
IValidationContext<IBaseResource> ctx = ValidationContext.forText(myContext, theResource, theOptions);
|
||||
|
||||
if (ctx.getResource() instanceof IBaseBundle && theOptions.isConcurrentBundleValidation()) {
|
||||
if (ctx.getResource() instanceof IBaseBundle && myConcurrentBundleValidation) {
|
||||
return validateBundleEntriesConcurrently((IBaseBundle) ctx.getResource(), theOptions);
|
||||
}
|
||||
|
||||
|
@ -335,4 +340,39 @@ public class FhirValidator {
|
|||
myExecutor = theExecutor;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* If this is true, bundles will be validated in parallel threads. The bundle structure itself will not be validated,
|
||||
* only the resources in its entries.
|
||||
*/
|
||||
|
||||
public boolean isConcurrentBundleValidation() {
|
||||
return myConcurrentBundleValidation;
|
||||
}
|
||||
|
||||
/**
|
||||
* If this is true, bundles will be validated in parallel threads. The bundle structure itself will not be validated,
|
||||
* only the resources in its entries.
|
||||
*/
|
||||
public FhirValidator setConcurrentBundleValidation(boolean theConcurrentBundleValidation) {
|
||||
myConcurrentBundleValidation = theConcurrentBundleValidation;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* The number of threads bundle entries will be validated within. This is only used when
|
||||
* {@link #isConcurrentBundleValidation} is true.
|
||||
*/
|
||||
public int getBundleValidationThreadCount() {
|
||||
return myBundleValidationThreadCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* The number of threads bundle entries will be validated within. This is only used when
|
||||
* {@link #isConcurrentBundleValidation} is true.
|
||||
*/
|
||||
public FhirValidator setBundleValidationThreadCount(int theBundleValidationThreadCount) {
|
||||
myBundleValidationThreadCount = theBundleValidationThreadCount;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,13 +30,11 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
|||
|
||||
public class ValidationOptions {
|
||||
|
||||
public static final int DEFAULT_BUNDLE_VALIDATION_THREADCOUNT = 1;
|
||||
private static ValidationOptions ourEmpty;
|
||||
private Set<String> myProfiles;
|
||||
|
||||
// FIXME KHS make it clear in the docs that bundle structure is not validated when this is true
|
||||
private boolean myConcurrentBundleValidation;
|
||||
private int myBundleValidationThreadCount = DEFAULT_BUNDLE_VALIDATION_THREADCOUNT;
|
||||
public ValidationOptions() {
|
||||
}
|
||||
|
||||
public Set<String> getProfiles() {
|
||||
return myProfiles != null ? Collections.unmodifiableSet(myProfiles) : Collections.emptySet();
|
||||
|
@ -59,41 +57,6 @@ public class ValidationOptions {
|
|||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* If this is true, bundles will be validated in parallel threads. The bundle structure itself will not be validated,
|
||||
* only the resources in its entries.
|
||||
*/
|
||||
|
||||
public boolean isConcurrentBundleValidation() {
|
||||
return myConcurrentBundleValidation;
|
||||
}
|
||||
|
||||
/**
|
||||
* If this is true, bundles will be validated in parallel threads. The bundle structure itself will not be validated,
|
||||
* only the resources in its entries.
|
||||
*/
|
||||
public ValidationOptions setConcurrentBundleValidation(boolean theConcurrentBundleValidation) {
|
||||
myConcurrentBundleValidation = theConcurrentBundleValidation;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* The number of threads bundle entries will be validated within. This is only used when
|
||||
* {@link #isConcurrentBundleValidation} is true.
|
||||
*/
|
||||
public int getBundleValidationThreadCount() {
|
||||
return myBundleValidationThreadCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* The number of threads bundle entries will be validated within. This is only used when
|
||||
* {@link #isConcurrentBundleValidation} is true.
|
||||
*/
|
||||
public ValidationOptions setBundleValidationThreadCount(int theBundleValidationThreadCount) {
|
||||
myBundleValidationThreadCount = theBundleValidationThreadCount;
|
||||
return this;
|
||||
}
|
||||
|
||||
public static ValidationOptions empty() {
|
||||
ValidationOptions retVal = ourEmpty;
|
||||
if (retVal == null) {
|
||||
|
|
|
@ -86,7 +86,6 @@ import ca.uhn.fhir.rest.server.IRestfulServerDefaults;
|
|||
import ca.uhn.fhir.rest.server.RestfulServerUtils;
|
||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||
import ca.uhn.fhir.rest.server.exceptions.MethodNotAllowedException;
|
||||
import ca.uhn.fhir.rest.server.exceptions.NotImplementedOperationException;
|
||||
import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException;
|
||||
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||
import ca.uhn.fhir.rest.server.exceptions.ResourceVersionConflictException;
|
||||
|
@ -1776,7 +1775,6 @@ public abstract class BaseHapiFhirResourceDao<T extends IBaseResource> extends B
|
|||
}
|
||||
|
||||
FhirValidator validator = getContext().newValidator();
|
||||
|
||||
validator.setInterceptorBroadcaster(CompositeInterceptorBroadcaster.newCompositeBroadcaster(myInterceptorBroadcaster, theRequest));
|
||||
validator.registerValidatorModule(getInstanceValidator());
|
||||
validator.registerValidatorModule(new IdChecker(theMode));
|
||||
|
|
|
@ -16,7 +16,6 @@ import ca.uhn.fhir.rest.param.TokenParam;
|
|||
import ca.uhn.fhir.rest.param.TokenParamModifier;
|
||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||
import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException;
|
||||
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||
import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
|
||||
import ca.uhn.fhir.validation.FhirValidator;
|
||||
|
|
|
@ -60,7 +60,6 @@ import ca.uhn.fhir.jpa.entity.TermValueSetConcept;
|
|||
import ca.uhn.fhir.jpa.interceptor.PerformanceTracingLoggingInterceptor;
|
||||
import ca.uhn.fhir.jpa.model.config.PartitionSettings;
|
||||
import ca.uhn.fhir.jpa.model.entity.ModelConfig;
|
||||
import ca.uhn.fhir.jpa.model.entity.ResourceTable;
|
||||
import ca.uhn.fhir.jpa.packages.IPackageInstallerSvc;
|
||||
import ca.uhn.fhir.jpa.partition.IPartitionLookupSvc;
|
||||
import ca.uhn.fhir.jpa.provider.r4.JpaSystemProviderR4;
|
||||
|
@ -93,8 +92,6 @@ import ca.uhn.fhir.util.ClasspathUtil;
|
|||
import ca.uhn.fhir.util.UrlUtil;
|
||||
import ca.uhn.fhir.validation.FhirValidator;
|
||||
import ca.uhn.fhir.validation.ValidationResult;
|
||||
import org.hibernate.search.mapper.orm.Search;
|
||||
import org.hibernate.search.mapper.orm.session.SearchSession;
|
||||
import org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport;
|
||||
import org.hl7.fhir.common.hapi.validation.validator.FhirInstanceValidator;
|
||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||
|
|
|
@ -15,7 +15,6 @@ import ca.uhn.fhir.rest.param.TokenParam;
|
|||
import ca.uhn.fhir.rest.param.TokenParamModifier;
|
||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||
import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException;
|
||||
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||
import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
|
||||
import ca.uhn.fhir.validation.FhirValidator;
|
||||
|
|
|
@ -49,7 +49,6 @@ import ca.uhn.fhir.jpa.entity.TermValueSet;
|
|||
import ca.uhn.fhir.jpa.entity.TermValueSetConcept;
|
||||
import ca.uhn.fhir.jpa.interceptor.PerformanceTracingLoggingInterceptor;
|
||||
import ca.uhn.fhir.jpa.model.entity.ModelConfig;
|
||||
import ca.uhn.fhir.jpa.model.entity.ResourceTable;
|
||||
import ca.uhn.fhir.jpa.provider.r5.JpaSystemProviderR5;
|
||||
import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider;
|
||||
import ca.uhn.fhir.jpa.search.IStaleSearchDeletingSvc;
|
||||
|
@ -76,8 +75,6 @@ import ca.uhn.fhir.util.UrlUtil;
|
|||
import ca.uhn.fhir.validation.FhirValidator;
|
||||
import ca.uhn.fhir.validation.ValidationResult;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.hibernate.search.mapper.orm.Search;
|
||||
import org.hibernate.search.mapper.orm.session.SearchSession;
|
||||
import org.hl7.fhir.common.hapi.validation.validator.FhirInstanceValidator;
|
||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||
import org.hl7.fhir.instance.model.api.IIdType;
|
||||
|
|
|
@ -32,7 +32,6 @@ import ca.uhn.fhir.validation.FhirValidator;
|
|||
import ca.uhn.fhir.validation.IValidatorModule;
|
||||
import ca.uhn.fhir.validation.ResultSeverityEnum;
|
||||
import ca.uhn.fhir.validation.SingleValidationMessage;
|
||||
import ca.uhn.fhir.validation.ValidationOptions;
|
||||
import ca.uhn.fhir.validation.ValidationResult;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
import org.apache.commons.lang3.text.StrLookup;
|
||||
|
@ -76,7 +75,6 @@ public abstract class BaseValidatingInterceptor<T> extends ValidationResultEnric
|
|||
|
||||
private List<IValidatorModule> myValidatorModules;
|
||||
private FhirValidator myValidator;
|
||||
private final ValidationOptions myValidationOptions = new ValidationOptions();
|
||||
|
||||
private void addResponseIssueHeader(RequestDetails theRequestDetails, SingleValidationMessage theNext) {
|
||||
// Perform any string substitutions from the message format
|
||||
|
@ -117,7 +115,7 @@ public abstract class BaseValidatingInterceptor<T> extends ValidationResultEnric
|
|||
}
|
||||
|
||||
|
||||
abstract ValidationResult doValidate(FhirValidator theValidator, T theRequest, ValidationOptions theValidationOptions);
|
||||
abstract ValidationResult doValidate(FhirValidator theValidator, T theRequest);
|
||||
|
||||
/**
|
||||
* Fail the request by throwing an {@link UnprocessableEntityException} as a result of a validation failure.
|
||||
|
@ -312,21 +310,22 @@ public abstract class BaseValidatingInterceptor<T> extends ValidationResultEnric
|
|||
return null;
|
||||
}
|
||||
|
||||
FhirValidator validator;
|
||||
FhirValidator fhirValidator;
|
||||
if (myValidator != null) {
|
||||
validator = myValidator;
|
||||
fhirValidator = myValidator;
|
||||
} else {
|
||||
validator = theRequestDetails.getServer().getFhirContext().newValidator();
|
||||
// FIXME KHS this is our validator
|
||||
fhirValidator = theRequestDetails.getServer().getFhirContext().newValidator();
|
||||
if (myValidatorModules != null) {
|
||||
for (IValidatorModule next : myValidatorModules) {
|
||||
validator.registerValidatorModule(next);
|
||||
fhirValidator.registerValidatorModule(next);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ValidationResult validationResult;
|
||||
try {
|
||||
validationResult = doValidate(validator, theRequest, myValidationOptions);
|
||||
validationResult = doValidate(fhirValidator, theRequest);
|
||||
} catch (Exception e) {
|
||||
if (myIgnoreValidatorExceptions) {
|
||||
ourLog.warn("Validator threw an exception during validation", e);
|
||||
|
@ -392,14 +391,6 @@ public abstract class BaseValidatingInterceptor<T> extends ValidationResultEnric
|
|||
return validationResult;
|
||||
}
|
||||
|
||||
protected void setConcurrentBundleValidation(boolean theConcurrentBundleValidation) {
|
||||
myValidationOptions.setConcurrentBundleValidation(theConcurrentBundleValidation);
|
||||
}
|
||||
|
||||
protected void setBundleValidationThreadCount(int theBundleValidationThreadCount) {
|
||||
myValidationOptions.setBundleValidationThreadCount(theBundleValidationThreadCount);
|
||||
}
|
||||
|
||||
private static class MyLookup extends StrLookup<String> {
|
||||
|
||||
private SingleValidationMessage myMessage;
|
||||
|
|
|
@ -30,7 +30,6 @@ import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
|
|||
import ca.uhn.fhir.rest.server.method.ResourceParameter;
|
||||
import ca.uhn.fhir.validation.FhirValidator;
|
||||
import ca.uhn.fhir.validation.ResultSeverityEnum;
|
||||
import ca.uhn.fhir.validation.ValidationOptions;
|
||||
import ca.uhn.fhir.validation.ValidationResult;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
@ -54,8 +53,8 @@ public class RequestValidatingInterceptor extends BaseValidatingInterceptor<Stri
|
|||
private boolean myAddValidationResultsToResponseOperationOutcome = true;
|
||||
|
||||
@Override
|
||||
ValidationResult doValidate(FhirValidator theValidator, String theRequest, ValidationOptions theValidationOptions) {
|
||||
return theValidator.validateWithResult(theRequest, theValidationOptions);
|
||||
ValidationResult doValidate(FhirValidator theValidator, String theRequest) {
|
||||
return theValidator.validateWithResult(theRequest);
|
||||
}
|
||||
|
||||
@Hook(Pointcut.SERVER_INCOMING_REQUEST_POST_PROCESSED)
|
||||
|
|
|
@ -27,7 +27,6 @@ import ca.uhn.fhir.rest.api.server.RequestDetails;
|
|||
import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
|
||||
import ca.uhn.fhir.validation.FhirValidator;
|
||||
import ca.uhn.fhir.validation.ResultSeverityEnum;
|
||||
import ca.uhn.fhir.validation.ValidationOptions;
|
||||
import ca.uhn.fhir.validation.ValidationResult;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||
|
@ -62,8 +61,8 @@ public class ResponseValidatingInterceptor extends BaseValidatingInterceptor<IBa
|
|||
}
|
||||
|
||||
@Override
|
||||
ValidationResult doValidate(FhirValidator theValidator, IBaseResource theRequest, ValidationOptions theValidationOptions) {
|
||||
return theValidator.validateWithResult(theRequest, theValidationOptions);
|
||||
ValidationResult doValidate(FhirValidator theValidator, IBaseResource theRequest) {
|
||||
return theValidator.validateWithResult(theRequest);
|
||||
}
|
||||
|
||||
@Hook(Pointcut.SERVER_OUTGOING_RESPONSE)
|
||||
|
|
|
@ -6,7 +6,7 @@ import ca.uhn.fhir.jpa.model.entity.ModelConfig;
|
|||
import ca.uhn.fhir.jpa.model.entity.ResourceEncodingEnum;
|
||||
import ca.uhn.fhir.rest.api.SearchTotalModeEnum;
|
||||
import ca.uhn.fhir.util.HapiExtensions;
|
||||
import ca.uhn.fhir.validation.ValidationOptions;
|
||||
import ca.uhn.fhir.validation.FhirValidator;
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
import com.google.common.collect.Sets;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
@ -280,13 +280,13 @@ public class DaoConfig {
|
|||
private boolean myAdvancedLuceneIndexing = false;
|
||||
|
||||
/**
|
||||
* @see ValidationOptions#getBundleValidationThreadCount()
|
||||
* @see FhirValidator#getBundleValidationThreadCount()
|
||||
* @since 5.6.0
|
||||
*/
|
||||
private int myBundleValidationThreadCount = ValidationOptions.DEFAULT_BUNDLE_VALIDATION_THREADCOUNT;
|
||||
private int myBundleValidationThreadCount = FhirValidator.DEFAULT_BUNDLE_VALIDATION_THREADCOUNT;
|
||||
|
||||
/**
|
||||
* @see ValidationOptions#isConcurrentBundleValidation()
|
||||
* @see FhirValidator#isConcurrentBundleValidation()
|
||||
* @since 5.6.0
|
||||
*/
|
||||
private boolean myConcurrentBundleValidation;
|
||||
|
@ -2686,7 +2686,7 @@ public class DaoConfig {
|
|||
}
|
||||
|
||||
/**
|
||||
* @see ValidationOptions#getBundleValidationThreadCount()
|
||||
* @see FhirValidator#getBundleValidationThreadCount()
|
||||
* @since 5.6.0
|
||||
*/
|
||||
public int getBundleValidationThreadCount() {
|
||||
|
@ -2694,7 +2694,7 @@ public class DaoConfig {
|
|||
}
|
||||
|
||||
/**
|
||||
* @see ValidationOptions#getBundleValidationThreadCount()
|
||||
* @see FhirValidator#getBundleValidationThreadCount()
|
||||
* @since 5.6.0
|
||||
*/
|
||||
public DaoConfig setBundleValidationThreadCount(int theBundleValidationThreadCount) {
|
||||
|
@ -2703,7 +2703,7 @@ public class DaoConfig {
|
|||
}
|
||||
|
||||
/**
|
||||
* @see ValidationOptions#isConcurrentBundleValidation()
|
||||
* @see FhirValidator#isConcurrentBundleValidation()
|
||||
* @since 5.6.0
|
||||
*/
|
||||
public boolean isConcurrentBundleValidation() {
|
||||
|
@ -2711,7 +2711,7 @@ public class DaoConfig {
|
|||
}
|
||||
|
||||
/**
|
||||
* @see ValidationOptions#isConcurrentBundleValidation()
|
||||
* @see FhirValidator#isConcurrentBundleValidation()
|
||||
* @since 5.6.0
|
||||
*/
|
||||
public DaoConfig setConcurrentBundleValidation(boolean theConcurrentBundleValidation) {
|
||||
|
|
|
@ -15,7 +15,6 @@ import ca.uhn.fhir.util.TestUtil;
|
|||
import ca.uhn.fhir.validation.FhirValidator;
|
||||
import ca.uhn.fhir.validation.ResultSeverityEnum;
|
||||
import ca.uhn.fhir.validation.SingleValidationMessage;
|
||||
import ca.uhn.fhir.validation.ValidationOptions;
|
||||
import ca.uhn.fhir.validation.ValidationResult;
|
||||
import com.google.common.base.Charsets;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
|
@ -66,7 +65,6 @@ import org.hl7.fhir.r4.utils.FHIRPathEngine;
|
|||
import org.hl7.fhir.r5.utils.IResourceValidator;
|
||||
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
||||
import org.hl7.fhir.utilities.xhtml.XhtmlNode;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.junit.jupiter.api.AfterAll;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
|
@ -114,7 +112,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
public LoggingExtension myLoggingExtension = new LoggingExtension();
|
||||
private FhirInstanceValidator myInstanceVal;
|
||||
private Map<String, ValueSetExpansionComponent> mySupportedCodeSystemsForExpansion;
|
||||
private FhirValidator myVal;
|
||||
private FhirValidator myFhirValidator;
|
||||
private ArrayList<String> myValidConcepts;
|
||||
private Set<String> myValidSystems = new HashSet<>();
|
||||
private Map<String, StructureDefinition> myStructureDefinitionMap = new HashMap<>();
|
||||
|
@ -136,7 +134,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
|
||||
resource.setSubject(new Reference("#invalid-ref"));
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(resource);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(resource);
|
||||
List<SingleValidationMessage> nonInfo = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertThat(nonInfo, hasSize(2));
|
||||
}
|
||||
|
@ -144,21 +142,20 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
@SuppressWarnings("unchecked")
|
||||
@BeforeEach
|
||||
public void before() {
|
||||
myVal = ourCtx.newValidator();
|
||||
myVal.setValidateAgainstStandardSchema(false);
|
||||
myVal.setValidateAgainstStandardSchematron(false);
|
||||
myFhirValidator = ourCtx.newValidator();
|
||||
myFhirValidator.setValidateAgainstStandardSchema(false);
|
||||
myFhirValidator.setValidateAgainstStandardSchematron(false);
|
||||
// This is only used if the validation is performed with validationOptions.isConcurrentBundleValidation = true
|
||||
myVal.setExecutor(Executors.newFixedThreadPool(4));
|
||||
myFhirValidator.setExecutor(Executors.newFixedThreadPool(4));
|
||||
|
||||
IValidationSupport mockSupport = mock(IValidationSupport.class);
|
||||
when(mockSupport.getFhirContext()).thenReturn(ourCtx);
|
||||
|
||||
ValidationSupportChain chain = new ValidationSupportChain(myDefaultValidationSupport, mockSupport, new InMemoryTerminologyServerValidationSupport(ourCtx), new CommonCodeSystemsTerminologyService(ourCtx), new SnapshotGeneratingValidationSupport(ourCtx));
|
||||
myValidationSupport = new CachingValidationSupport(chain);
|
||||
ourCtx.setValidationSupport(myValidationSupport);
|
||||
myInstanceVal = new FhirInstanceValidator(myValidationSupport);
|
||||
|
||||
myVal.registerValidatorModule(myInstanceVal);
|
||||
myFhirValidator.registerValidatorModule(myInstanceVal);
|
||||
|
||||
mySupportedCodeSystemsForExpansion = new HashMap<>();
|
||||
|
||||
|
@ -530,7 +527,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
|
||||
ourLog.info("Encoded: {}", encoded);
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(encoded);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(encoded);
|
||||
List<SingleValidationMessage> errors = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertEquals(1, errors.size());
|
||||
assertEquals("The value '%%%2@()()' is not a valid Base64 value", errors.get(0).getMessage());
|
||||
|
@ -541,7 +538,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
public void testValidateBundleWithNoFullUrl() throws IOException {
|
||||
String encoded = loadResource("/r4/r4-caredove-bundle.json");
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(encoded);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(encoded);
|
||||
List<SingleValidationMessage> errors = logResultsAndReturnNonInformationalOnes(output);
|
||||
errors = errors
|
||||
.stream()
|
||||
|
@ -563,7 +560,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
|
||||
ourLog.info("Encoded: {}", encoded);
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(encoded);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(encoded);
|
||||
List<SingleValidationMessage> errors = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertEquals(0, errors.size());
|
||||
|
||||
|
@ -607,7 +604,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
t.setSystem(org.hl7.fhir.r4.model.ContactPoint.ContactPointSystem.URL);
|
||||
t.setValue("http://infoway-inforoute.ca");
|
||||
|
||||
ValidationResult results = myVal.validateWithResult(p);
|
||||
ValidationResult results = myFhirValidator.validateWithResult(p);
|
||||
List<SingleValidationMessage> outcome = logResultsAndReturnNonInformationalOnes(results);
|
||||
assertThat(outcome, empty());
|
||||
|
||||
|
@ -619,7 +616,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
@Test
|
||||
public void testExtensionUrlWithHl7Url() throws IOException {
|
||||
String input = IOUtils.toString(FhirInstanceValidator.class.getResourceAsStream("/bug872-ext-with-hl7-url.json"), Charsets.UTF_8);
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
List<SingleValidationMessage> nonInfo = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertThat(nonInfo, empty());
|
||||
}
|
||||
|
@ -634,7 +631,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
@Test
|
||||
public void testLargeBase64() throws IOException {
|
||||
String input = IOUtils.toString(FhirInstanceValidatorR4Test.class.getResourceAsStream("/r4/diagnosticreport-example-gingival-mass.json"), Constants.CHARSET_UTF8);
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
List<SingleValidationMessage> errors = logResultsAndReturnAll(output);
|
||||
assertEquals(1, errors.size());
|
||||
assertEquals("None of the codings provided are in the value set http://hl7.org/fhir/ValueSet/report-codes (http://hl7.org/fhir/ValueSet/report-codes), and a coding is recommended to come from this value set) (codes = http://loinc.org#1-8)", errors.get(0).getMessage());
|
||||
|
@ -650,7 +647,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
int passes = 1;
|
||||
for (int i = 0; i < passes; i++) {
|
||||
ourLog.info("Pass {}", i + 1);
|
||||
output = myVal.validateWithResult(input);
|
||||
output = myFhirValidator.validateWithResult(input);
|
||||
}
|
||||
|
||||
long delay = System.currentTimeMillis() - start;
|
||||
|
@ -687,7 +684,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
ourLog.info("Validating {}", next.getId());
|
||||
ourLog.trace(ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(next));
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(next);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(next);
|
||||
List<SingleValidationMessage> results = logResultsAndReturnAll(output);
|
||||
|
||||
// This isn't a validator problem but a definition problem.. it should get fixed at some point and
|
||||
|
@ -715,7 +712,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
public void testValidateBundleWithNoType() throws Exception {
|
||||
String vsContents = loadResource("/r4/bundle-with-no-type.json");
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(vsContents);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(vsContents);
|
||||
logResultsAndReturnNonInformationalOnes(output);
|
||||
assertThat(output.getMessages().toString(), containsString("Bundle.type: minimum required = 1, but only found 0"));
|
||||
}
|
||||
|
@ -732,7 +729,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
"\"name\":[ {\"family\":\"bar\"} ]" +
|
||||
"}";
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(patient);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(patient);
|
||||
logResultsAndReturnNonInformationalOnes(output);
|
||||
assertThat(output.getMessages().toString(), containsString("Error parsing JSON source: Duplicated property name"));
|
||||
}
|
||||
|
@ -760,7 +757,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
// bool = (BooleanType) fpOutput.get(0);
|
||||
// assertTrue(bool.getValue());
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(inputString);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(inputString);
|
||||
List<SingleValidationMessage> errors = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertThat(errors, empty());
|
||||
|
||||
|
@ -771,7 +768,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
public void testValidateDocument() throws Exception {
|
||||
String vsContents = loadResource("/sample-document.xml");
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(vsContents);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(vsContents);
|
||||
logResultsAndReturnNonInformationalOnes(output);
|
||||
assertTrue(output.isSuccessful());
|
||||
}
|
||||
|
@ -823,7 +820,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
public void testValidateQuestionnaireResponse() throws IOException {
|
||||
String input = loadResource("/qr_jon.xml");
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
logResultsAndReturnAll(output);
|
||||
|
||||
assertThat(output.getMessages().toString(), containsString("Items not of type group should not have items - Item with linkId 5.1 of type BOOLEAN has 1 item(s)"));
|
||||
|
@ -840,7 +837,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
" \"id\":\"123\"" +
|
||||
"}";
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
assertEquals(0, output.getMessages().size(), output.toString());
|
||||
}
|
||||
|
||||
|
@ -857,7 +854,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
"\"foo\":\"123\"" +
|
||||
"}";
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
assertEquals(1, output.getMessages().size(), output.toString());
|
||||
ourLog.info(output.getMessages().get(0).getLocationString());
|
||||
ourLog.info(output.getMessages().get(0).getMessage());
|
||||
|
@ -876,7 +873,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
public void testValidateRawJsonResourceFromExamples() throws Exception {
|
||||
String input = loadResource("/testscript-search.json");
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
logResultsAndReturnNonInformationalOnes(output);
|
||||
// assertEquals(output.toString(), 1, output.getMessages().size());
|
||||
// ourLog.info(output.getMessages().get(0).getLocationString());
|
||||
|
@ -912,7 +909,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
* }
|
||||
*/
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(encoded);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(encoded);
|
||||
assertEquals(1, output.getMessages().size(), output.toString());
|
||||
|
||||
assertEquals("Unknown extension http://hl7.org/fhir/v3/ethnicity", output.getMessages().get(0).getMessage());
|
||||
|
@ -947,7 +944,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
*/
|
||||
|
||||
myInstanceVal.setAnyExtensionsAllowed(false);
|
||||
ValidationResult output = myVal.validateWithResult(encoded);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(encoded);
|
||||
assertEquals(1, output.getMessages().size(), output.toString());
|
||||
|
||||
assertEquals("The extension http://hl7.org/fhir/v3/ethnicity is unknown, and not allowed here", output.getMessages().get(0).getMessage());
|
||||
|
@ -964,7 +961,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
" </text>" +
|
||||
"</Patient>";
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
assertEquals(0, output.getMessages().size(), output.toString());
|
||||
}
|
||||
|
||||
|
@ -980,7 +977,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
"<foo value=\"222\"/>" +
|
||||
"</Patient>";
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
assertEquals(1, output.getMessages().size(), output.toString());
|
||||
ourLog.info(output.getMessages().get(0).getLocationString());
|
||||
ourLog.info(output.getMessages().get(0).getMessage());
|
||||
|
@ -1000,7 +997,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
"<name><given/></name>" +
|
||||
"</Patient>";
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
List<SingleValidationMessage> messages = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertEquals(3, messages.size(), output.toString());
|
||||
assertThat(messages.get(0).getMessage(), containsString("Element must have some content"));
|
||||
|
@ -1035,7 +1032,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
" </timingTiming>\n" +
|
||||
" </ActivityDefinition>";
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
List<SingleValidationMessage> res = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertEquals(1, res.size(), output.toString());
|
||||
assertEquals("A code with no system has no defined meaning. A system should be provided", output.getMessages().get(0).getMessage());
|
||||
|
@ -1050,7 +1047,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
p.getText().setDiv(new XhtmlNode().setValue("<div>AA</div>")).setStatus(Narrative.NarrativeStatus.GENERATED);
|
||||
p.getManagingOrganization().setDisplay("HELLO");
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(p);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(p);
|
||||
List<SingleValidationMessage> nonInfo = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertThat(nonInfo, empty());
|
||||
}
|
||||
|
@ -1065,7 +1062,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
p.getManagingOrganization().getIdentifier().setSystem("http://acme.org");
|
||||
p.getManagingOrganization().getIdentifier().setValue("foo");
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(p);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(p);
|
||||
List<SingleValidationMessage> nonInfo = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertThat(nonInfo, empty());
|
||||
}
|
||||
|
@ -1085,7 +1082,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
rp.getPatient().setReference("Patient/1");
|
||||
rp.addRelationship().addCoding().setSystem("http://terminology.hl7.org/CodeSystem/v2-0131").setCode("C");
|
||||
|
||||
ValidationResult results = myVal.validateWithResult(rp);
|
||||
ValidationResult results = myFhirValidator.validateWithResult(rp);
|
||||
List<SingleValidationMessage> outcome = logResultsAndReturnNonInformationalOnes(results);
|
||||
assertThat(outcome, empty());
|
||||
|
||||
|
@ -1096,7 +1093,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
rp.getPatient().setReference("Patient/1");
|
||||
rp.addRelationship().addCoding().setSystem("http://terminology.hl7.org/CodeSystem/v2-0131").setCode("GAGAGAGA");
|
||||
|
||||
results = myVal.validateWithResult(rp);
|
||||
results = myFhirValidator.validateWithResult(rp);
|
||||
outcome = logResultsAndReturnNonInformationalOnes(results);
|
||||
assertThat(outcome, not(empty()));
|
||||
|
||||
|
@ -1115,7 +1112,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
input.getCode().addCoding().setSystem("http://loinc.org").setCode("12345");
|
||||
|
||||
myInstanceVal.setValidationSupport(myValidationSupport);
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
List<SingleValidationMessage> errors = logResultsAndReturnAll(output);
|
||||
|
||||
assertEquals(ResultSeverityEnum.ERROR, errors.get(0).getSeverity());
|
||||
|
@ -1136,7 +1133,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
input.getCode().addCoding().setSystem("http://loinc.org").setCode("12345");
|
||||
|
||||
myInstanceVal.setValidationSupport(myValidationSupport);
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
List<SingleValidationMessage> errors = logResultsAndReturnNonInformationalOnes(output);
|
||||
|
||||
assertThat(errors.toString(), containsString("Observation.subject: minimum required = 1, but only found 0"));
|
||||
|
@ -1156,7 +1153,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
input.setStatus(ObservationStatus.FINAL);
|
||||
|
||||
myInstanceVal.setValidationSupport(myValidationSupport);
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
List<SingleValidationMessage> errors = logResultsAndReturnNonInformationalOnes(output);
|
||||
|
||||
assertEquals(1, errors.size());
|
||||
|
@ -1173,7 +1170,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
input.getCode().addCoding().setSystem("http://loinc.org").setCode("12345");
|
||||
input.setValue(new StringType("AAA"));
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
assertThat(output.getMessages().size(), greaterThan(0));
|
||||
assertEquals("Observation.status: minimum required = 1, but only found 0 (from http://hl7.org/fhir/StructureDefinition/Observation)", output.getMessages().get(0).getMessage());
|
||||
|
||||
|
@ -1189,7 +1186,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
|
||||
ourLog.info(ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(input));
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
assertEquals(output.getMessages().size(), 0);
|
||||
}
|
||||
|
||||
|
@ -1206,7 +1203,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
" <text value=\"No code here!\"/>\n" +
|
||||
" </code>\n" +
|
||||
"</Observation>";
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
logResultsAndReturnAll(output);
|
||||
assertEquals(
|
||||
"The value provided ('notvalidcode') is not in the value set http://hl7.org/fhir/ValueSet/observation-status|4.0.1 (http://hl7.org/fhir/ValueSet/observation-status), and a code is required from this value set) (error message = Unknown code 'notvalidcode' for in-memory expansion of ValueSet 'http://hl7.org/fhir/ValueSet/observation-status')",
|
||||
|
@ -1236,7 +1233,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
" ]" +
|
||||
"}";
|
||||
ourLog.info(input);
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
logResultsAndReturnAll(output);
|
||||
assertEquals(
|
||||
"",
|
||||
|
@ -1253,7 +1250,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
input.setStatus(ObservationStatus.FINAL);
|
||||
input.getCode().addCoding().setSystem("http://loinc.org").setCode("12345");
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
List<SingleValidationMessage> errors = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertEquals(0, errors.size(), errors.toString());
|
||||
|
||||
|
@ -1270,7 +1267,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
input.setStatus(ObservationStatus.FINAL);
|
||||
input.getCode().addCoding().setSystem("http://acme.org").setCode("9988877");
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
List<SingleValidationMessage> errors = logResultsAndReturnAll(output);
|
||||
assertThat(errors.toString(), errors.size(), greaterThan(0));
|
||||
assertEquals("Unknown code for 'http://acme.org#9988877'", errors.get(0).getMessage());
|
||||
|
@ -1288,7 +1285,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
input.setStatus(ObservationStatus.FINAL);
|
||||
input.getCode().addCoding().setSystem("http://loinc.org").setCode("12345");
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
List<SingleValidationMessage> errors = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertEquals(0, errors.size(), errors.toString());
|
||||
}
|
||||
|
@ -1308,7 +1305,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
input.setStatus(ObservationStatus.FINAL);
|
||||
input.getCode().addCoding().setSystem("http://loinc.org").setCode("1234");
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
List<SingleValidationMessage> errors = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertEquals(1, errors.size());
|
||||
assertEquals("Unknown code for 'http://loinc.org#1234'", errors.get(0).getMessage());
|
||||
|
@ -1325,7 +1322,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
input.setStatus(ObservationStatus.FINAL);
|
||||
input.getCode().addCoding().setSystem("http://acme.org").setCode("12345");
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
List<SingleValidationMessage> errors = logResultsAndReturnAll(output);
|
||||
assertEquals(0, errors.size(), errors.toString());
|
||||
}
|
||||
|
@ -1337,7 +1334,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
p.getText().setDiv(new XhtmlNode().setValue("<div>AA</div>")).setStatus(Narrative.NarrativeStatus.GENERATED);
|
||||
p.addIdentifier().setSystem("http://example.com/").setValue("12345").getType().addCoding().setSystem("http://example.com/foo/bar").setCode("bar");
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(p);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(p);
|
||||
List<SingleValidationMessage> all = logResultsAndReturnAll(output);
|
||||
assertEquals(1, all.size());
|
||||
assertEquals("Patient.identifier[0].type", all.get(0).getLocationString());
|
||||
|
@ -1352,13 +1349,13 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
addValidConcept("http://loinc.org", "8310-5");
|
||||
|
||||
Observation input = loadResource(ourCtx, Observation.class, "/r4/observation-with-body-temp-ucum.json");
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
List<SingleValidationMessage> all = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertThat(all, empty());
|
||||
|
||||
// Change the unit to something not supported
|
||||
input.getValueQuantity().setCode("Heck");
|
||||
output = myVal.validateWithResult(input);
|
||||
output = myFhirValidator.validateWithResult(input);
|
||||
all = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertEquals(2, all.size());
|
||||
assertThat(all.get(0).getMessage(), containsString("Validation failed for 'http://unitsofmeasure.org#Heck'"));
|
||||
|
@ -1375,7 +1372,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
o.addPerformer(new Reference(p1));
|
||||
o.addPerformer(new Reference(p2));
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(o);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(o);
|
||||
List<SingleValidationMessage> valMessages = logResultsAndReturnAll(output);
|
||||
for (SingleValidationMessage msg : valMessages) {
|
||||
assertThat(msg.getMessage(), not(containsString("have a performer")));
|
||||
|
@ -1395,7 +1392,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
.setSystem("http://terminology.hl7.org/CodeSystem/v2-0203")
|
||||
.setCode("MR");
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(patient);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(patient);
|
||||
List<SingleValidationMessage> all = logResultsAndReturnAll(output);
|
||||
assertEquals(0, all.size());
|
||||
}
|
||||
|
@ -1408,7 +1405,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
IResourceValidator.IValidatorResourceFetcher resourceFetcher = mock(IResourceValidator.IValidatorResourceFetcher.class);
|
||||
when(resourceFetcher.validationPolicy(any(), any(), any(), any())).thenReturn(IResourceValidator.ReferenceValidationPolicy.CHECK_TYPE_IF_EXISTS);
|
||||
myInstanceVal.setValidatorResourceFetcher(resourceFetcher);
|
||||
myVal.validateWithResult(encoded);
|
||||
myFhirValidator.validateWithResult(encoded);
|
||||
|
||||
verify(resourceFetcher, times(15)).resolveURL(any(), any(), anyString(), anyString(), anyString());
|
||||
verify(resourceFetcher, times(12)).validationPolicy(any(), any(), anyString(), anyString());
|
||||
|
@ -1420,7 +1417,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
public void testValidateStructureDefinition() throws IOException {
|
||||
String input = loadResource("/sdc-questionnaire.profile.xml");
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
logResultsAndReturnAll(output);
|
||||
|
||||
assertEquals(3, output.getMessages().size(), output.toString());
|
||||
|
@ -1439,7 +1436,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
" \"currency\": \"USD\"\n" +
|
||||
" }\n" +
|
||||
"}";
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
List<SingleValidationMessage> errors = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertEquals(0, errors.size(), errors.toString());
|
||||
|
||||
|
@ -1457,7 +1454,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
" \"currency\": \"BLAH\"\n" +
|
||||
" }\n" +
|
||||
"}";
|
||||
ValidationResult output = myVal.validateWithResult(input);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(input);
|
||||
List<SingleValidationMessage> errors = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertEquals(1, errors.size(), errors.toString());
|
||||
assertThat(errors.get(0).getMessage(), containsString("The value provided ('BLAH') is not in the value set http://hl7.org/fhir/ValueSet/currencies"));
|
||||
|
@ -1477,7 +1474,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
.setText("This is text")
|
||||
.setAuthor(new Reference("Patient/123"));
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(allergy);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(allergy);
|
||||
List<SingleValidationMessage> errors = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertEquals(0, errors.size(), errors.toString());
|
||||
|
||||
|
@ -1496,7 +1493,7 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
.setText("This is text")
|
||||
.setAuthor(new Reference("CodeSystems/123"));
|
||||
|
||||
ValidationResult output = myVal.validateWithResult(allergy);
|
||||
ValidationResult output = myFhirValidator.validateWithResult(allergy);
|
||||
List<SingleValidationMessage> errors = logResultsAndReturnNonInformationalOnes(output);
|
||||
assertEquals(0, errors.size(), errors.toString());
|
||||
assertThat(errors.get(0).getMessage(), containsString("The value provided ('BLAH') is not in the value set http://hl7.org/fhir/ValueSet/currencies"));
|
||||
|
@ -1516,30 +1513,27 @@ public class FhirInstanceValidatorR4Test extends BaseTest {
|
|||
Bundle bundle = buildBundle(entriesCount, false);
|
||||
assertThat(bundle.getEntry(), hasSize(entriesCount));
|
||||
|
||||
ValidationOptions validationOptions = buildValidationOptions();
|
||||
// Run once to exclude initialization from time
|
||||
myVal.validateWithResult(bundle, validationOptions);
|
||||
try {
|
||||
myFhirValidator.setConcurrentBundleValidation(true);
|
||||
myFhirValidator.setBundleValidationThreadCount(4);
|
||||
// Run once to exclude initialization from time
|
||||
myFhirValidator.validateWithResult(bundle);
|
||||
|
||||
// execute
|
||||
StopWatch stopwatch = new StopWatch();
|
||||
ValidationResult output = myVal.validateWithResult(bundle, validationOptions);
|
||||
ourLog.info("Validation time: {}", stopwatch);
|
||||
|
||||
// validate
|
||||
List<SingleValidationMessage> all = logResultsAndReturnErrorOnes(output);
|
||||
assertThat(output.getMessages(), hasSize(entriesCount * 2));
|
||||
// This assert proves that we did a multi-threaded validation since the outer bundle fails validation
|
||||
// due to lack of unique fullUrl values on the entries. If you setConcurrentBundleValidation(false)
|
||||
// above this test will fail.
|
||||
assertEquals(0, all.size(), all.toString());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private ValidationOptions buildValidationOptions() {
|
||||
ValidationOptions validationOptions = new ValidationOptions();
|
||||
validationOptions.setConcurrentBundleValidation(true);
|
||||
validationOptions.setBundleValidationThreadCount(4);
|
||||
return validationOptions;
|
||||
// execute
|
||||
StopWatch stopwatch = new StopWatch();
|
||||
ValidationResult output = myFhirValidator.validateWithResult(bundle);
|
||||
ourLog.info("Validation time: {}", stopwatch);
|
||||
// validate
|
||||
List<SingleValidationMessage> all = logResultsAndReturnErrorOnes(output);
|
||||
assertThat(output.getMessages(), hasSize(entriesCount * 2));
|
||||
// This assert proves that we did a multi-threaded validation since the outer bundle fails validation
|
||||
// due to lack of unique fullUrl values on the entries. If you setConcurrentBundleValidation(false)
|
||||
// above this test will fail.
|
||||
assertEquals(0, all.size(), all.toString());
|
||||
} finally {
|
||||
myFhirValidator.setConcurrentBundleValidation(false);
|
||||
myFhirValidator.setBundleValidationThreadCount(FhirValidator.DEFAULT_BUNDLE_VALIDATION_THREADCOUNT);
|
||||
}
|
||||
}
|
||||
|
||||
private Bundle buildBundle(int theSize, boolean theValidBundle) throws IOException {
|
||||
|
|
|
@ -4,7 +4,6 @@ import ca.uhn.fhir.context.FhirContext;
|
|||
import ca.uhn.fhir.context.support.DefaultProfileValidationSupport;
|
||||
import ca.uhn.fhir.context.support.IValidationSupport;
|
||||
import ca.uhn.fhir.parser.IParser;
|
||||
import ca.uhn.fhir.util.TestUtil;
|
||||
import ca.uhn.fhir.validation.FhirValidator;
|
||||
import ca.uhn.fhir.validation.ResultSeverityEnum;
|
||||
import ca.uhn.fhir.validation.SingleValidationMessage;
|
||||
|
|
Loading…
Reference in New Issue