Skip to content

Commit

Permalink
Validation wrapper methods
Browse files Browse the repository at this point in the history
  • Loading branch information
MikeEdgar committed Jan 23, 2021
1 parent e110aaa commit 97c1844
Showing 1 changed file with 35 additions and 20 deletions.
55 changes: 35 additions & 20 deletions src/main/java/io/xlate/edi/internal/stream/StaEDIStreamWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -896,22 +898,18 @@ public void segmentError(CharSequence token, EDIReference typeReference, EDIStre
}

private void validate(Consumer<Validator> 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)) {
Expand All @@ -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<Validator> process) {
final Validator validator = validator();

if (validator != null) {
process.accept(validator);
}
}

<T> T withValidator(Function<Validator, T> process, Supplier<T> unvalidatedResult) {
final Validator validator = validator();
final T result;

if (validator != null) {
result = process.apply(validator);
} else {
result = data;
result = unvalidatedResult.get();
}

return result;
Expand Down

0 comments on commit 97c1844

Please sign in to comment.