diff --git a/src/main/java/io/xlate/edi/internal/stream/StaEDIStreamWriter.java b/src/main/java/io/xlate/edi/internal/stream/StaEDIStreamWriter.java index a8d1d9e9..b8d7b40b 100644 --- a/src/main/java/io/xlate/edi/internal/stream/StaEDIStreamWriter.java +++ b/src/main/java/io/xlate/edi/internal/stream/StaEDIStreamWriter.java @@ -30,6 +30,7 @@ import java.util.Map; import java.util.Objects; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Supplier; import java.util.logging.Logger; @@ -831,11 +832,12 @@ public boolean binaryData(InputStream binary) { public boolean elementData(char[] text, int start, int length) { elementHolder.set(text, start, length); dialect.elementData(elementHolder, location); - Validator validator = validator(); - if (validator != null && !validator.validateElement(dialect, location, elementHolder, null)) { - reportElementErrors(validator, elementHolder); - } + withValidator(validator -> { + if (!validator.validateElement(dialect, location, elementHolder, null)) { + reportElementErrors(validator, elementHolder); + } + }); return true; } @@ -896,22 +898,18 @@ public void segmentError(CharSequence token, EDIReference typeReference, EDIStre } private void validate(Consumer command) { - Validator validator = validator(); - - if (validator != null) { + withValidator(validator -> { errors.clear(); command.accept(validator); if (!errors.isEmpty()) { throw validationExceptionChain(errors); } - } + }); } private void validateCompositeOccurrence() { - final Validator validator = validator(); - - if (validator != null) { + withValidator(validator -> { errors.clear(); if (!validator.validCompositeOccurrences(dialect, location)) { @@ -921,36 +919,53 @@ private void validateCompositeOccurrence() { if (!errors.isEmpty()) { throw validationExceptionChain(errors); } - } + }); } private CharSequence validateElement(Runnable setupCommand, CharSequence data) { - final Validator validator = validator(); - final CharSequence result; + return withValidator(validator -> { + CharSequence elementData; - if (validator != null) { if (this.formatElements) { - result = this.formattedElement; + elementData = this.formattedElement; this.formattedElement.setLength(0); this.formattedElement.append(data); // Validator will clear and re-format if configured } else { - result = data; + elementData = data; } errors.clear(); setupCommand.run(); if (!validator.validateElement(dialect, location, data, this.formattedElement)) { - reportElementErrors(validator, result); + reportElementErrors(validator, elementData); } if (!errors.isEmpty()) { throw validationExceptionChain(errors); } - dialect.elementData(result, location); + dialect.elementData(elementData, location); + return elementData; + }, () -> data); + } + + void withValidator(Consumer process) { + final Validator validator = validator(); + + if (validator != null) { + process.accept(validator); + } + } + + T withValidator(Function process, Supplier unvalidatedResult) { + final Validator validator = validator(); + final T result; + + if (validator != null) { + result = process.apply(validator); } else { - result = data; + result = unvalidatedResult.get(); } return result;