mirror of
https://github.com/frosch95/SmartCSV.fx.git
synced 2026-04-11 13:38:23 +02:00
handle validation in own thread
This commit is contained in:
@@ -28,6 +28,8 @@ package ninja.javafx.smartcsv.fx.table.model;
|
|||||||
|
|
||||||
import javafx.collections.FXCollections;
|
import javafx.collections.FXCollections;
|
||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
|
import javafx.concurrent.Service;
|
||||||
|
import javafx.concurrent.Task;
|
||||||
import ninja.javafx.smartcsv.validation.ValidationConfiguration;
|
import ninja.javafx.smartcsv.validation.ValidationConfiguration;
|
||||||
import ninja.javafx.smartcsv.validation.ValidationError;
|
import ninja.javafx.smartcsv.validation.ValidationError;
|
||||||
import ninja.javafx.smartcsv.validation.Validator;
|
import ninja.javafx.smartcsv.validation.Validator;
|
||||||
@@ -49,6 +51,7 @@ public class CSVModel {
|
|||||||
private ObservableList<CSVRow> rows = FXCollections.observableArrayList();
|
private ObservableList<CSVRow> rows = FXCollections.observableArrayList();
|
||||||
private String[] header;
|
private String[] header;
|
||||||
private ObservableList<ValidationError> validationError = FXCollections.observableArrayList();
|
private ObservableList<ValidationError> validationError = FXCollections.observableArrayList();
|
||||||
|
private RevalidationService revalidationService = new RevalidationService();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sets the validator configuration for the data revalidates
|
* sets the validator configuration for the data revalidates
|
||||||
@@ -111,42 +114,75 @@ public class CSVModel {
|
|||||||
|
|
||||||
if (!hasValidator()) return;
|
if (!hasValidator()) return;
|
||||||
|
|
||||||
List<ValidationError> errors = new ArrayList<>();
|
revalidationService.setHeader(header);
|
||||||
|
revalidationService.setRows(rows);
|
||||||
if (header != null) {
|
revalidationService.setValidator(validator);
|
||||||
ValidationError headerError = validator.isHeaderValid(header);
|
revalidationService.setOnSucceeded(t -> validationError.setAll(revalidationService.getValue()));
|
||||||
if (headerError != null) {
|
revalidationService.setOnFailed(t -> logger.error("revalidation service failed!"));
|
||||||
logger.info("revalidate: header error found");
|
revalidationService.restart();
|
||||||
errors.add(headerError);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int lineNumber = 0; lineNumber < rows.size(); lineNumber++) {
|
|
||||||
CSVRow row = rows.get(lineNumber);
|
|
||||||
row.setValidator(validator);
|
|
||||||
for (String column: row.getColumns().keySet()) {
|
|
||||||
CSVValue value = row.getColumns().get(column).getValue();
|
|
||||||
value.setValidator(validator);
|
|
||||||
if (validator != null) {
|
|
||||||
ValidationError validationError = validator.isValid(column, value.getValue(), lineNumber);
|
|
||||||
if (validationError != null) {
|
|
||||||
logger.info("revalidate: {} errors found in line {}", validationError.getMessages().size(), lineNumber);
|
|
||||||
errors.add(validationError);
|
|
||||||
value.setValidationError(validationError);
|
|
||||||
} else {
|
|
||||||
value.setValidationError(null);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
value.setValidationError(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
validationError.setAll(errors);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean hasValidator() {
|
private boolean hasValidator() {
|
||||||
return validator != null && validator.hasConfig();
|
return validator != null && validator.hasConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class RevalidationService extends Service<List<ValidationError>> {
|
||||||
|
|
||||||
|
private Validator validator;
|
||||||
|
private List<CSVRow> rows;
|
||||||
|
private String[] header;
|
||||||
|
|
||||||
|
public void setValidator(Validator validator) {
|
||||||
|
this.validator = validator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRows(List<CSVRow> rows) {
|
||||||
|
this.rows = rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHeader(String[] header) {
|
||||||
|
this.header = header;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Task<List<ValidationError>> createTask() {
|
||||||
|
return new Task<List<ValidationError>>() {
|
||||||
|
@Override
|
||||||
|
protected List<ValidationError> call() throws Exception {
|
||||||
|
List<ValidationError> errors = new ArrayList<>();
|
||||||
|
|
||||||
|
if (header != null) {
|
||||||
|
ValidationError headerError = validator.isHeaderValid(header);
|
||||||
|
if (headerError != null) {
|
||||||
|
logger.info("revalidate: header error found");
|
||||||
|
errors.add(headerError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int lineNumber = 0; lineNumber < rows.size(); lineNumber++) {
|
||||||
|
CSVRow row = rows.get(lineNumber);
|
||||||
|
row.setValidator(validator);
|
||||||
|
for (String column: row.getColumns().keySet()) {
|
||||||
|
CSVValue value = row.getColumns().get(column).getValue();
|
||||||
|
value.setValidator(validator);
|
||||||
|
if (validator != null) {
|
||||||
|
ValidationError validationError = validator.isValid(column, value.getValue(), lineNumber);
|
||||||
|
if (validationError != null) {
|
||||||
|
logger.info("revalidate: {} errors found in line {}", validationError.getMessages().size(), lineNumber);
|
||||||
|
errors.add(validationError);
|
||||||
|
value.setValidationError(validationError);
|
||||||
|
} else {
|
||||||
|
value.setValidationError(null);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
value.setValidationError(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user