From ef6f92a21ee24fb5176aec54f2701a6c6ec0b7c3 Mon Sep 17 00:00:00 2001 From: dotasek Date: Thu, 21 Sep 2023 09:50:08 -0400 Subject: [PATCH] WIP return validation fragments --- .../r5/elementmodel/ValidatedFragment.java | 5 ++++- .../hl7/fhir/validation/ValidationEngine.java | 13 +++++++----- .../cli/services/ValidationService.java | 21 +++++++++++++++++++ 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/ValidatedFragment.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/ValidatedFragment.java index 63a78970f..42f6a7d24 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/ValidatedFragment.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/ValidatedFragment.java @@ -50,5 +50,8 @@ public class ValidatedFragment { public String getFilename() { return name+"."+extension; } - + + public String getExtension() { + return extension; + } } \ No newline at end of file diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/ValidationEngine.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/ValidationEngine.java index 5d9da1fac..d1484a4b9 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/ValidationEngine.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/ValidationEngine.java @@ -32,12 +32,8 @@ import org.hl7.fhir.r5.context.IWorkerContext; import org.hl7.fhir.r5.context.IWorkerContextManager; import org.hl7.fhir.r5.context.SimpleWorkerContext; import org.hl7.fhir.r5.context.SystemOutLoggingService; -import org.hl7.fhir.r5.elementmodel.Element; -import org.hl7.fhir.r5.elementmodel.Manager; +import org.hl7.fhir.r5.elementmodel.*; import org.hl7.fhir.r5.elementmodel.Manager.FhirFormat; -import org.hl7.fhir.r5.elementmodel.ObjectConverter; -import org.hl7.fhir.r5.elementmodel.ParserBase; -import org.hl7.fhir.r5.elementmodel.SHCParser; import org.hl7.fhir.r5.formats.FormatUtilities; import org.hl7.fhir.r5.formats.IParser.OutputStyle; import org.hl7.fhir.r5.formats.JsonParser; @@ -635,6 +631,13 @@ public class ValidationEngine implements IValidatorResourceFetcher, IValidationP return results.getEntryFirstRep().getResource(); } + + public List validateAsFragments(byte[] source, FhirFormat cntType, List profiles, List messages) throws FHIRException, IOException, EOperationOutcome { + InstanceValidator validator = getValidator(cntType); + validator.validate(null, messages, new ByteArrayInputStream(source), cntType, asSdList(profiles)); + return validator.validatedContent; + } + public OperationOutcome validate(byte[] source, FhirFormat cntType, List profiles, List messages) throws FHIRException, IOException, EOperationOutcome { InstanceValidator validator = getValidator(cntType); diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/services/ValidationService.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/services/ValidationService.java index f7ef45a47..eda673aa1 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/services/ValidationService.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/services/ValidationService.java @@ -29,6 +29,7 @@ import org.hl7.fhir.r5.elementmodel.Element; import org.hl7.fhir.r5.elementmodel.LanguageUtils; import org.hl7.fhir.r5.elementmodel.Manager; import org.hl7.fhir.r5.elementmodel.Manager.FhirFormat; +import org.hl7.fhir.r5.elementmodel.ValidatedFragment; import org.hl7.fhir.r5.formats.IParser; import org.hl7.fhir.r5.formats.IParser.OutputStyle; import org.hl7.fhir.r5.model.Bundle; @@ -116,11 +117,31 @@ public class ValidationService { for (FileInfo fp : request.getFilesToValidate()) { List messages = new ArrayList<>(); + + List validatedFragments = validator.validateAsFragments(fp.getFileContent().getBytes(), Manager.FhirFormat.getFhirFormat(fp.getFileType()), + request.getCliContext().getProfiles(), messages); + + // TODO this chunk does not work for multi-file validation, as the fileName is overwritten + for (ValidatedFragment validatedFragment : validatedFragments) { + ValidationOutcome outcome = new ValidationOutcome(); + FileInfo fileInfo = new FileInfo( + validatedFragment.getFilename(), + new String(validatedFragment.getContent()), + validatedFragment.getExtension()); + outcome.setMessages(validatedFragment.getErrors()); + outcome.setFileInfo(fileInfo); + response.addOutcome(outcome); + } + + //TODO the code below works correctly for multi-file validation. + /* validator.validate(fp.getFileContent().getBytes(), Manager.FhirFormat.getFhirFormat(fp.getFileType()), request.getCliContext().getProfiles(), messages); + ValidationOutcome outcome = new ValidationOutcome().setFileInfo(fp); messages.forEach(outcome::addMessage); response.addOutcome(outcome); + */ } System.out.println(" Max Memory: "+Runtime.getRuntime().maxMemory()); return response;