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 b8d7b40b..d2c901c2 100644 --- a/src/main/java/io/xlate/edi/internal/stream/StaEDIStreamWriter.java +++ b/src/main/java/io/xlate/edi/internal/stream/StaEDIStreamWriter.java @@ -29,8 +29,8 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.function.Consumer; -import java.util.function.Function; import java.util.function.Supplier; import java.util.logging.Logger; @@ -293,9 +293,17 @@ public Map getDelimiters() { return delimiters; } - private Validator validator() { + private Optional validator() { + Validator validator; + // Do not use the transactionValidator in the period where it may be set/mutated by the user - return transaction && !transactionSchemaAllowed ? transactionValidator : controlValidator; + if (transaction && !transactionSchemaAllowed) { + validator = transactionValidator; + } else { + validator = controlValidator; + } + + return Optional.ofNullable(validator); } private void write(int output) throws EDIStreamException { @@ -833,7 +841,7 @@ public boolean elementData(char[] text, int start, int length) { elementHolder.set(text, start, length); dialect.elementData(elementHolder, location); - withValidator(validator -> { + validator().ifPresent(validator -> { if (!validator.validateElement(dialect, location, elementHolder, null)) { reportElementErrors(validator, elementHolder); } @@ -898,7 +906,7 @@ public void segmentError(CharSequence token, EDIReference typeReference, EDIStre } private void validate(Consumer command) { - withValidator(validator -> { + validator().ifPresent(validator -> { errors.clear(); command.accept(validator); @@ -909,7 +917,7 @@ private void validate(Consumer command) { } private void validateCompositeOccurrence() { - withValidator(validator -> { + validator().ifPresent(validator -> { errors.clear(); if (!validator.validCompositeOccurrences(dialect, location)) { @@ -923,7 +931,7 @@ private void validateCompositeOccurrence() { } private CharSequence validateElement(Runnable setupCommand, CharSequence data) { - return withValidator(validator -> { + return validator().map(validator -> { CharSequence elementData; if (this.formatElements) { @@ -947,28 +955,7 @@ private CharSequence validateElement(Runnable setupCommand, CharSequence data) { 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 = unvalidatedResult.get(); - } - - return result; + }).orElse(data); } void reportElementErrors(Validator validator, CharSequence data) {