-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathValidateController.java
More file actions
112 lines (93 loc) · 4.75 KB
/
ValidateController.java
File metadata and controls
112 lines (93 loc) · 4.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package software.nhs.fhirvalidator.controller;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import com.google.gson.JsonSyntaxException;
import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.r4.model.Bundle;
import org.hl7.fhir.r4.model.OperationOutcome;
import org.hl7.fhir.r4.model.OperationOutcome.OperationOutcomeIssueComponent;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.parser.DataFormatException;
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
import ca.uhn.fhir.validation.FhirValidator;
import software.nhs.fhirvalidator.configuration.ValidatorConfiguration;
import software.nhs.fhirvalidator.service.CapabilityStatementApplier;
import software.nhs.fhirvalidator.service.ImplementationGuideParser;
import software.nhs.fhirvalidator.service.MessageDefinitionApplier;
import software.nhs.fhirvalidator.util.OperationOutcomeUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* This class is a wrapper around the HAPI FhirValidator.
* The FhirValidator is built using default settings and the available
* implementation guides are loaded into it.
*/
public class ValidateController {
private ValidatorConfiguration validatorConfiguration;
private FhirValidator validator;
private FhirContext fhirContext;
private ImplementationGuideParser implementationGuideParser;
private CapabilityStatementApplier capabilityStatementApplier;
private MessageDefinitionApplier messageDefinitionApplier;
Logger log = LogManager.getLogger(ValidateController.class);
public ValidateController(String PROFILE_MANIFEST_FILE) {
validatorConfiguration = new ValidatorConfiguration(PROFILE_MANIFEST_FILE);
validator = validatorConfiguration.validator;
fhirContext = validatorConfiguration.fhirContext;
implementationGuideParser = new ImplementationGuideParser(
fhirContext);
capabilityStatementApplier = new CapabilityStatementApplier(
implementationGuideParser,
validatorConfiguration.npmPackages);
messageDefinitionApplier = new MessageDefinitionApplier(
implementationGuideParser, validatorConfiguration.npmPackages);
}
public String validate(String input) {
OperationOutcome result = parseAndValidateResource(input);
return fhirContext.newJsonParser().encodeResourceToString(result);
}
public OperationOutcome parseAndValidateResource(String input) {
try {
IBaseResource inputResource = fhirContext.newJsonParser().parseResource(input);
List<IBaseResource> resources = getResourcesToValidate(inputResource);
List<OperationOutcome> operationOutcomeList = resources.stream()
.map(this::validateResource)
.collect(Collectors.toList());
List<OperationOutcomeIssueComponent> operationOutcomeIssues = operationOutcomeList.stream()
.filter(Objects::nonNull)
.flatMap(operationOutcome -> operationOutcome.getIssue().stream())
.collect(Collectors.toList());
return OperationOutcomeUtils.createOperationOutcome(operationOutcomeIssues);
} catch (JsonSyntaxException | NullPointerException | IllegalArgumentException | InvalidRequestException
| DataFormatException e) {
log.error(e.toString());
return OperationOutcomeUtils
.createOperationOutcome((e.getMessage() != null && !(e instanceof NullPointerException))
? e.getMessage() : "Invalid JSON", null);
}
}
private OperationOutcome validateResource(IBaseResource resource) {
capabilityStatementApplier.applyCapabilityStatementProfiles(resource);
OperationOutcome messageDefinitionErrors = messageDefinitionApplier.applyMessageDefinition(resource);
if (messageDefinitionErrors != null) {
return messageDefinitionErrors;
}
return (OperationOutcome) validator.validateWithResult(resource).toOperationOutcome();
}
private List<IBaseResource> getResourcesToValidate(IBaseResource inputResource) {
if (inputResource == null) {
return new ArrayList<>();
}
if (inputResource instanceof Bundle _inputResource && (_inputResource.getType() == Bundle.BundleType.SEARCHSET)) {
List<IBaseResource> bundleResources = new ArrayList<>();
for (Bundle.BundleEntryComponent entry : ((Bundle) inputResource).getEntry()) {
bundleResources.add(entry.getResource());
}
return bundleResources;
}
return Arrays.asList(inputResource);
}
}