diff --git a/service/src/main/java/uk/nhs/adaptors/gp2gp/transformjsontoxmltool/TransformJsonToXml.java b/service/src/main/java/uk/nhs/adaptors/gp2gp/transformjsontoxmltool/TransformJsonToXml.java index 19dde3b36b..739f5d628c 100644 --- a/service/src/main/java/uk/nhs/adaptors/gp2gp/transformjsontoxmltool/TransformJsonToXml.java +++ b/service/src/main/java/uk/nhs/adaptors/gp2gp/transformjsontoxmltool/TransformJsonToXml.java @@ -7,7 +7,6 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -31,6 +30,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import uk.nhs.adaptors.gp2gp.common.service.FhirParseService; +import uk.nhs.adaptors.gp2gp.ehr.exception.EhrValidationException; import uk.nhs.adaptors.gp2gp.ehr.mapper.EhrExtractMapper; import uk.nhs.adaptors.gp2gp.ehr.mapper.MessageContext; import uk.nhs.adaptors.gp2gp.ehr.mapper.OutputMessageWrapperMapper; @@ -44,8 +44,7 @@ @ConditionalOnProperty( prefix = "command.line.runner", value = "enabled", - havingValue = "true", - matchIfMissing = false) + havingValue = "true") @Component public class TransformJsonToXml implements CommandLineRunner { private static final String JSON_FILE_INPUT_PATH = @@ -56,7 +55,6 @@ public class TransformJsonToXml implements CommandLineRunner { private final MessageContext messageContext; private final OutputMessageWrapperMapper outputMessageWrapperMapper; private final EhrExtractMapper ehrExtractMapper; - private final XmlSchemaValidator xmlSchemaValidator; public static void main(String[] args) { SpringApplication.run(TransformJsonToXml.class, args).close(); @@ -68,38 +66,23 @@ public void run(String... args) { getFiles().forEach(file -> { String xmlResult = mapJsonToXml(file.getJsonFileInput()); writeToFile(xmlResult, file.getJsonFileName()); - xmlSchemaValidator.validateOutputToXmlSchema(file.getJsonFileName(), xmlResult); }); } catch (NHSNumberNotFound | UnreadableJsonFileException | NoJsonFileFound | Hl7TranslatedResponseError e) { - LOGGER.error("error: " + e.getMessage()); + LOGGER.error("Failed to parse the provided JSON: {}", e.getMessage()); + } catch (EhrValidationException e) { + LOGGER.error("Failed to validate the produced XML"); } - LOGGER.info("end"); } private List getFiles() throws UnreadableJsonFileException, NoJsonFileFound { File[] files = new File(JSON_FILE_INPUT_PATH).listFiles(); - List jsonStringInputs = new ArrayList<>(); - List fileNames = new ArrayList<>(); if (files == null || files.length == 0) { throw new NoJsonFileFound("No json files found"); } - LOGGER.info("Processing " + files.length + " files from location: " + JSON_FILE_INPUT_PATH); + LOGGER.info("Processing {} files from location: {}", files.length, JSON_FILE_INPUT_PATH); - Arrays.stream(files) - .peek(file -> LOGGER.info("Parsing file: {}", file.getName())) - .filter(file -> FilenameUtils.getExtension(file.getName()).equalsIgnoreCase("json")) - .forEach(file -> { - String jsonAsString; - try { - jsonAsString = readJsonFileAsString(JSON_FILE_INPUT_PATH + file.getName()); - } catch (Exception e) { - throw new UnreadableJsonFileException("Cant read file " + file.getName()); - } - jsonStringInputs.add(jsonAsString); - fileNames.add(file.getName()); - }); return Arrays.stream(files) .filter(file -> FilenameUtils.getExtension(file.getName()).equalsIgnoreCase("json")) .map(file -> { @@ -109,7 +92,6 @@ private List getFiles() throws UnreadableJsonFileException, NoJsonFil } catch (IOException e) { throw new UnreadableJsonFileException("Cannot read Json File as String: " + file.getName()); } - }).collect(Collectors.toList()); } @@ -171,15 +153,16 @@ private String extractNhsNumber(String json) throws NHSNumberNotFound { .filter(resource -> ResourceType.Patient.equals(resource.getResourceType())) .map(Patient.class::cast) .map(resource -> getNhsNumberIdentifier(nhsNumberSystem, resource)) - .map(Identifier.class::cast) .findFirst() .orElseThrow(() -> new NHSNumberNotFound("No Patient identifier was found")) .getValue(); } private Identifier getNhsNumberIdentifier(String nhsNumberSystem, Patient resource) { - return resource.getIdentifier() - .stream().filter(identifier -> identifier.getSystem().equals(nhsNumberSystem)).findFirst().get(); + return resource.getIdentifier().stream() + .filter(identifier -> identifier.getSystem().equals(nhsNumberSystem)) + .findFirst() + .orElseThrow(() -> new NHSNumberNotFound("No Patient identifier was found")); } @Data diff --git a/service/src/main/java/uk/nhs/adaptors/gp2gp/transformjsontoxmltool/XmlSchemaValidator.java b/service/src/main/java/uk/nhs/adaptors/gp2gp/transformjsontoxmltool/XmlSchemaValidator.java deleted file mode 100644 index 096ec7e674..0000000000 --- a/service/src/main/java/uk/nhs/adaptors/gp2gp/transformjsontoxmltool/XmlSchemaValidator.java +++ /dev/null @@ -1,105 +0,0 @@ -package uk.nhs.adaptors.gp2gp.transformjsontoxmltool; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.FilenameUtils; -import org.springframework.stereotype.Component; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; -import uk.nhs.adaptors.gp2gp.common.configuration.RedactionsContext; - -import javax.xml.transform.stream.StreamSource; -import javax.xml.validation.SchemaFactory; -import javax.xml.validation.Validator; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.StringReader; -import java.nio.charset.StandardCharsets; -import java.nio.file.Paths; - -@Component -@Slf4j -@RequiredArgsConstructor() -public class XmlSchemaValidator { - private final RedactionsContext redactionsContext; - - private static final String SCHEMA_PATH = "../service/src/test/resources/mim/Schemas/"; - private static final String RCMR_IN030000UK06_SCHEMA_PATH = SCHEMA_PATH + RedactionsContext.NON_REDACTION_INTERACTION_ID + ".xsd"; - private static final String RCMR_IN030000UK07_SCHEMA_PATH = SCHEMA_PATH + RedactionsContext.REDACTION_INTERACTION_ID + ".xsd"; - private static final String OUTPUT_PATH = - Paths.get("src/").toFile().getAbsoluteFile().getAbsolutePath() + "/../../transformJsonToXml/output/"; - - private static final String VALIDATING_AGAINST_SCHEMA_TEMPLATE = "Validating {} against {} schema"; - private static final String COULD_NOT_LOAD_SCHEMA_FILE_TEMPLATE = "Could not load schema file for {} context."; - private static final String FAILED_TO_VALIDATE_SCHEMA_TEMPLATE = "Failed to validate {} against {} schema"; - private static final String COULD_NOT_READ_FROM_STREAM_SOURCE_TEMPLATE = "Could not read from stream source for produced XML for {}"; - private static final String SUCCESSFULLY_VALIDATED_SCHEMA_TEMPLATE = "Successfully validated {} against {} schema"; - private static final String VALIDATION_ERRORS_WRITTEN_TEMPLATE = "Validation errors written to {}"; - private static final String COULD_NOT_WRITE_VALIDATION_ERRORS_TEMPLATE = "Could not write validation errors to {}"; - - public void validateOutputToXmlSchema(String inputJsonFilename, String xmlResult) { - LOGGER.info(VALIDATING_AGAINST_SCHEMA_TEMPLATE, inputJsonFilename, RedactionsContext.REDACTION_INTERACTION_ID); - - var xsdErrorHandler = new XsdErrorHandler(); - Validator xmlValidator; - - try { - xmlValidator = getXmlValidator(xsdErrorHandler); - } catch (SAXException e) { - LOGGER.error(COULD_NOT_LOAD_SCHEMA_FILE_TEMPLATE, RedactionsContext.REDACTION_INTERACTION_ID); - return; - } - - try { - var xmlResultSource = new StreamSource(new StringReader(xmlResult)); - xmlValidator.validate(xmlResultSource); - } catch (SAXParseException parseException) { - LOGGER.warn(FAILED_TO_VALIDATE_SCHEMA_TEMPLATE, inputJsonFilename, RedactionsContext.REDACTION_INTERACTION_ID); - writeValidationExceptionsToFile(xsdErrorHandler, inputJsonFilename); - } catch (IOException e) { - LOGGER.error(COULD_NOT_READ_FROM_STREAM_SOURCE_TEMPLATE, inputJsonFilename); - return; - } catch (Exception e) { - throw new RuntimeException(e); - } - - if (!xsdErrorHandler.isValid()) { - LOGGER.warn(FAILED_TO_VALIDATE_SCHEMA_TEMPLATE, inputJsonFilename, RedactionsContext.REDACTION_INTERACTION_ID); - writeValidationExceptionsToFile(xsdErrorHandler, inputJsonFilename); - return; - } - - LOGGER.info(SUCCESSFULLY_VALIDATED_SCHEMA_TEMPLATE, inputJsonFilename, RedactionsContext.REDACTION_INTERACTION_ID); - } - - private void writeValidationExceptionsToFile(XsdErrorHandler xsdErrorHandler, String fileName) { - String outputFileName = FilenameUtils.removeExtension(fileName) + ".validation-errors.log"; - try (BufferedWriter writer = new BufferedWriter(new FileWriter(OUTPUT_PATH + outputFileName, StandardCharsets.UTF_8))) { - for (SAXParseException e : xsdErrorHandler.getExceptions()) { - var message = String.format("[%d:%d] %s", e.getLineNumber(), e.getColumnNumber(), e.getMessage()); - writer.write(message); - writer.newLine(); - } - LOGGER.info(VALIDATION_ERRORS_WRITTEN_TEMPLATE, outputFileName); - } catch (IOException e) { - LOGGER.error(COULD_NOT_WRITE_VALIDATION_ERRORS_TEMPLATE, outputFileName, e); - } - } - - private Validator getXmlValidator(XsdErrorHandler xsdErrorHandler) throws SAXException { - var schemaPath = RedactionsContext.REDACTION_INTERACTION_ID.equals(redactionsContext.ehrExtractInteractionId()) - ? RCMR_IN030000UK07_SCHEMA_PATH - : RCMR_IN030000UK06_SCHEMA_PATH; - - var schemaFactory = SchemaFactory.newDefaultInstance(); - var schemaFileStream = new StreamSource(new File(schemaPath)); - var schema = schemaFactory.newSchema(schemaFileStream); - var validator = schema.newValidator(); - - validator.setErrorHandler(xsdErrorHandler); - - return validator; - } -} \ No newline at end of file diff --git a/service/src/main/java/uk/nhs/adaptors/gp2gp/transformjsontoxmltool/XsdErrorHandler.java b/service/src/main/java/uk/nhs/adaptors/gp2gp/transformjsontoxmltool/XsdErrorHandler.java deleted file mode 100644 index aaedc9ecdb..0000000000 --- a/service/src/main/java/uk/nhs/adaptors/gp2gp/transformjsontoxmltool/XsdErrorHandler.java +++ /dev/null @@ -1,36 +0,0 @@ -package uk.nhs.adaptors.gp2gp.transformjsontoxmltool; - -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import org.xml.sax.ErrorHandler; -import org.xml.sax.SAXParseException; - -import java.util.ArrayList; -import java.util.List; - -@Slf4j -@Getter -public class XsdErrorHandler implements ErrorHandler { - - private final List exceptions = new ArrayList<>(); - - public boolean isValid() { - return exceptions.isEmpty(); - } - - @Override - public void warning(SAXParseException exception) { - exceptions.add(exception); - } - - @Override - public void error(SAXParseException exception) { - exceptions.add(exception); - } - - @Override - public void fatalError(SAXParseException exception) throws SAXParseException { - exceptions.add(exception); - throw exception; - } -} diff --git a/service/src/main/resources/logback.xml b/service/src/main/resources/logback.xml index b9b882fdf4..07eb7c8620 100644 --- a/service/src/main/resources/logback.xml +++ b/service/src/main/resources/logback.xml @@ -1,7 +1,7 @@ - ${GP2GP_LOGGING_FORMAT:-%d{yyyy-MM-dd HH:mm:ss.SSS} Level=%-5level Logger=%logger{36} ConversationId=%X{ConversationId} TaskId=%X{TaskId} Thread="%thread" Message="%msg"%n} + ${GP2GP_LOGGING_FORMAT:-%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) Level=%-5level Logger=%logger{36} ConversationId=%X{ConversationId} TaskId=%X{TaskId} Thread="%thread" Message="%msg"%n}