From 0c391e292e2f451c8358e7477d6dc8922e816538 Mon Sep 17 00:00:00 2001 From: Andreas Billmann Date: Thu, 1 Sep 2016 00:01:13 +0200 Subject: [PATCH 01/14] first quick implementation of to support json table schema --- .../ValidationEditorController.java | 250 +++++++++--------- .../validation/AlphaNumericValidation.java | 47 ---- .../smartcsv/validation/DateFormatHelper.java | 38 +++ .../validation/FieldConfiguration.java | 74 ++++++ .../validation/HeaderConfiguration.java | 46 ---- .../validation/ValidationConfiguration.java | 153 ++--------- .../validation/ValidationFileReader.java | 1 + .../javafx/smartcsv/validation/Validator.java | 119 +++++---- 8 files changed, 336 insertions(+), 392 deletions(-) delete mode 100644 src/main/java/ninja/javafx/smartcsv/validation/AlphaNumericValidation.java create mode 100644 src/main/java/ninja/javafx/smartcsv/validation/DateFormatHelper.java create mode 100644 src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java delete mode 100644 src/main/java/ninja/javafx/smartcsv/validation/HeaderConfiguration.java diff --git a/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java b/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java index aaae261..085707e 100644 --- a/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java +++ b/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java @@ -228,71 +228,71 @@ public class ValidationEditorController extends FXMLController { public void updateConfiguration() { - if (enableIntegerRule.isSelected()) { - validationConfiguration.setIntegerRuleFor(selectedColumn.getValue(), enableIntegerRule.isSelected()); - } else { - validationConfiguration.setIntegerRuleFor(selectedColumn.getValue(), null); - } - - if (enableNotEmptyRule.isSelected()) { - validationConfiguration.setNotEmptyRuleFor(selectedColumn.getValue(), enableNotEmptyRule.isSelected()); - } else { - validationConfiguration.setNotEmptyRuleFor(selectedColumn.getValue(), null); - } - - if (enableUniqueRule.isSelected()) { - validationConfiguration.setUniqueRuleFor(selectedColumn.getValue(), enableUniqueRule.isSelected()); - } else { - validationConfiguration.setUniqueRuleFor(selectedColumn.getValue(), null); - } - - if (enableDoubleRule.isSelected()) { - validationConfiguration.setDoubleRuleFor(selectedColumn.getValue(), enableDoubleRule.isSelected()); - } else { - validationConfiguration.setDoubleRuleFor(selectedColumn.getValue(), null); - } - - if (enableAlphanumericRule.isSelected()) { - validationConfiguration.setAlphanumericRuleFor(selectedColumn.getValue(), enableAlphanumericRule.isSelected()); - } else { - validationConfiguration.setAlphanumericRuleFor(selectedColumn.getValue(), null); - } - - if (enableDateRule.isSelected()) { - validationConfiguration.setDateRuleFor(selectedColumn.getValue(), dateformatRuleTextField.getText()); - } else { - validationConfiguration.setDateRuleFor(selectedColumn.getValue(), null); - } - - if (enableGroovyRule.isSelected()) { - validationConfiguration.setGroovyRuleFor(selectedColumn.getValue(), groovyRuleTextArea.getText()); - } else { - validationConfiguration.setGroovyRuleFor(selectedColumn.getValue(), null); - } - - if (enableMinLengthRule.isSelected()) { - validationConfiguration.setMinLengthRuleFor(selectedColumn.getValue(), minLengthSpinner.getValue()); - } else { - validationConfiguration.setMinLengthRuleFor(selectedColumn.getValue(), null); - } - - if (enableMaxLengthRule.isSelected()) { - validationConfiguration.setMaxLengthRuleFor(selectedColumn.getValue(), maxLengthSpinner.getValue()); - } else { - validationConfiguration.setMaxLengthRuleFor(selectedColumn.getValue(), null); - } - - if (enableRegexpRule.isSelected()) { - validationConfiguration.setRegexpRuleFor(selectedColumn.getValue(), regexpRuleTextField.getText()); - } else { - validationConfiguration.setRegexpRuleFor(selectedColumn.getValue(), null); - } - - if (enableValueOfRule.isSelected()) { - validationConfiguration.setValueOfRuleFor(selectedColumn.getValue(), asList(valueOfRuleTextField.getText().split(", "))); - } else { - validationConfiguration.setValueOfRuleFor(selectedColumn.getValue(), null); - } +// if (enableIntegerRule.isSelected()) { +// validationConfiguration.setIntegerRuleFor(selectedColumn.getValue(), enableIntegerRule.isSelected()); +// } else { +// validationConfiguration.setIntegerRuleFor(selectedColumn.getValue(), null); +// } +// +// if (enableNotEmptyRule.isSelected()) { +// validationConfiguration.setNotEmptyRuleFor(selectedColumn.getValue(), enableNotEmptyRule.isSelected()); +// } else { +// validationConfiguration.setNotEmptyRuleFor(selectedColumn.getValue(), null); +// } +// +// if (enableUniqueRule.isSelected()) { +// validationConfiguration.setUniqueRuleFor(selectedColumn.getValue(), enableUniqueRule.isSelected()); +// } else { +// validationConfiguration.setUniqueRuleFor(selectedColumn.getValue(), null); +// } +// +// if (enableDoubleRule.isSelected()) { +// validationConfiguration.setDoubleRuleFor(selectedColumn.getValue(), enableDoubleRule.isSelected()); +// } else { +// validationConfiguration.setDoubleRuleFor(selectedColumn.getValue(), null); +// } +// +// if (enableAlphanumericRule.isSelected()) { +// validationConfiguration.setAlphanumericRuleFor(selectedColumn.getValue(), enableAlphanumericRule.isSelected()); +// } else { +// validationConfiguration.setAlphanumericRuleFor(selectedColumn.getValue(), null); +// } +// +// if (enableDateRule.isSelected()) { +// validationConfiguration.setDateRuleFor(selectedColumn.getValue(), dateformatRuleTextField.getText()); +// } else { +// validationConfiguration.setDateRuleFor(selectedColumn.getValue(), null); +// } +// +// if (enableGroovyRule.isSelected()) { +// validationConfiguration.setGroovyRuleFor(selectedColumn.getValue(), groovyRuleTextArea.getText()); +// } else { +// validationConfiguration.setGroovyRuleFor(selectedColumn.getValue(), null); +// } +// +// if (enableMinLengthRule.isSelected()) { +// validationConfiguration.setMinLengthRuleFor(selectedColumn.getValue(), minLengthSpinner.getValue()); +// } else { +// validationConfiguration.setMinLengthRuleFor(selectedColumn.getValue(), null); +// } +// +// if (enableMaxLengthRule.isSelected()) { +// validationConfiguration.setMaxLengthRuleFor(selectedColumn.getValue(), maxLengthSpinner.getValue()); +// } else { +// validationConfiguration.setMaxLengthRuleFor(selectedColumn.getValue(), null); +// } +// +// if (enableRegexpRule.isSelected()) { +// validationConfiguration.setRegexpRuleFor(selectedColumn.getValue(), regexpRuleTextField.getText()); +// } else { +// validationConfiguration.setRegexpRuleFor(selectedColumn.getValue(), null); +// } +// +// if (enableValueOfRule.isSelected()) { +// validationConfiguration.setValueOfRuleFor(selectedColumn.getValue(), asList(valueOfRuleTextField.getText().split(", "))); +// } else { +// validationConfiguration.setValueOfRuleFor(selectedColumn.getValue(), null); +// } } @@ -315,66 +315,66 @@ public class ValidationEditorController extends FXMLController { private void updateForm() { - updateCheckBox( - validationConfiguration.getNotEmptyRuleFor(getSelectedColumn()), - enableNotEmptyRule - ); - - updateCheckBox( - validationConfiguration.getIntegerRuleFor(getSelectedColumn()), - enableIntegerRule - ); - - updateCheckBox( - validationConfiguration.getDoubleRuleFor(getSelectedColumn()), - enableDoubleRule - ); - - updateCheckBox( - validationConfiguration.getAlphanumericRuleFor(getSelectedColumn()), - enableAlphanumericRule - ); - - updateCheckBox( - validationConfiguration.getUniqueRuleFor(getSelectedColumn()), - enableUniqueRule - ); - - updateSpinner( - minLengthSpinner, - validationConfiguration.getMinLengthRuleFor(getSelectedColumn()), - enableMinLengthRule - ); - - updateSpinner( - maxLengthSpinner, - validationConfiguration.getMaxLengthRuleFor(getSelectedColumn()), - enableMaxLengthRule - ); - - updateTextInputControl( - dateformatRuleTextField, - validationConfiguration.getDateRuleFor(getSelectedColumn()), - enableDateRule - ); - - updateTextInputControl( - regexpRuleTextField, - validationConfiguration.getRegexpRuleFor(getSelectedColumn()), - enableRegexpRule - ); - - updateTextInputControl( - valueOfRuleTextField, - validationConfiguration.getValueOfRuleFor(getSelectedColumn()), - enableValueOfRule - ); - - updateCodeAreaControl( - groovyRuleTextArea, - validationConfiguration.getGroovyRuleFor(getSelectedColumn()), - enableGroovyRule - ); +// updateCheckBox( +// validationConfiguration.getNotEmptyRuleFor(getSelectedColumn()), +// enableNotEmptyRule +// ); +// +// updateCheckBox( +// validationConfiguration.getIntegerRuleFor(getSelectedColumn()), +// enableIntegerRule +// ); +// +// updateCheckBox( +// validationConfiguration.getDoubleRuleFor(getSelectedColumn()), +// enableDoubleRule +// ); +// +// updateCheckBox( +// validationConfiguration.getAlphanumericRuleFor(getSelectedColumn()), +// enableAlphanumericRule +// ); +// +// updateCheckBox( +// validationConfiguration.getUniqueRuleFor(getSelectedColumn()), +// enableUniqueRule +// ); +// +// updateSpinner( +// minLengthSpinner, +// validationConfiguration.getMinLengthRuleFor(getSelectedColumn()), +// enableMinLengthRule +// ); +// +// updateSpinner( +// maxLengthSpinner, +// validationConfiguration.getMaxLengthRuleFor(getSelectedColumn()), +// enableMaxLengthRule +// ); +// +// updateTextInputControl( +// dateformatRuleTextField, +// validationConfiguration.getDateRuleFor(getSelectedColumn()), +// enableDateRule +// ); +// +// updateTextInputControl( +// regexpRuleTextField, +// validationConfiguration.getRegexpRuleFor(getSelectedColumn()), +// enableRegexpRule +// ); +// +// updateTextInputControl( +// valueOfRuleTextField, +// validationConfiguration.getValueOfRuleFor(getSelectedColumn()), +// enableValueOfRule +// ); +// +// updateCodeAreaControl( +// groovyRuleTextArea, +// validationConfiguration.getGroovyRuleFor(getSelectedColumn()), +// enableGroovyRule +// ); } private void updateCheckBox(Boolean value, CheckBox ruleEnabled) { diff --git a/src/main/java/ninja/javafx/smartcsv/validation/AlphaNumericValidation.java b/src/main/java/ninja/javafx/smartcsv/validation/AlphaNumericValidation.java deleted file mode 100644 index 84650dd..0000000 --- a/src/main/java/ninja/javafx/smartcsv/validation/AlphaNumericValidation.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - The MIT License (MIT) - ----------------------------------------------------------------------------- - - Copyright (c) 2015 javafx.ninja - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - -*/ -package ninja.javafx.smartcsv.validation; - -import static org.apache.commons.validator.GenericValidator.matchRegexp; - -/** - * Checks if the value is alpha numeric - */ -public class AlphaNumericValidation extends EmptyValueIsValid { - @Override - public void check(int row, String value, ValidationError error) { - if (!matchRegexp(value, "[0-9a-zA-Z]*")) { - error.add("validation.message.alphanumeric"); - } - } - - @Override - public Type getType() { - return Type.ALPHANUMERIC; - } - - -} diff --git a/src/main/java/ninja/javafx/smartcsv/validation/DateFormatHelper.java b/src/main/java/ninja/javafx/smartcsv/validation/DateFormatHelper.java new file mode 100644 index 0000000..f80fc7a --- /dev/null +++ b/src/main/java/ninja/javafx/smartcsv/validation/DateFormatHelper.java @@ -0,0 +1,38 @@ +package ninja.javafx.smartcsv.validation; + +/** + * @author abi + */ +public class DateFormatHelper { + + + public static String dateFormat(String format, String defaultFormat) { + + if (format != null && !format.trim().isEmpty()) { + format = format.trim(); + if (format.startsWith("fmt:")) { + format = format.substring(4); + format = format.replace("%Y", "yyyy"); + format = format.replace("%y", "yy"); + format = format.replace("%m", "MM"); + format = format.replace("%d", "dd"); + format = format.replace("%a", "E"); + format = format.replace("%A", "EEEE"); + format = format.replace("%w", "F"); + format = format.replace("%b", "MMM"); + format = format.replace("%B", "MMMMM"); + format = format.replace("%H", "HH"); + format = format.replace("%I", "hh"); + format = format.replace("%p", "a"); + format = format.replace("%M", "mm"); + format = format.replace("%S", "ss"); + format = format.replace("%z", "Z"); + format = format.replace("%Z", "z"); + format = format.replace("%j", "DDD"); + format = format.replace("%U", "ww"); + return format; + } + } + return defaultFormat; + } +} diff --git a/src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java b/src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java new file mode 100644 index 0000000..5937a7d --- /dev/null +++ b/src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java @@ -0,0 +1,74 @@ +package ninja.javafx.smartcsv.validation; + +import java.util.List; +import java.util.Map; + +/** + * @author abi + */ +public class FieldConfiguration { + + private String name; + private String title; + private String type; + private String description; + private String format; + private Object missingValue; + private Map constraints; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public Object getMissingValue() { + return missingValue; + } + + public void setMissingValue(Object missingValue) { + this.missingValue = missingValue; + } + + public Map getConstraints() { + return constraints; + } + + public void setConstraints(Map constraints) { + this.constraints = constraints; + } +} diff --git a/src/main/java/ninja/javafx/smartcsv/validation/HeaderConfiguration.java b/src/main/java/ninja/javafx/smartcsv/validation/HeaderConfiguration.java deleted file mode 100644 index 1bcabea..0000000 --- a/src/main/java/ninja/javafx/smartcsv/validation/HeaderConfiguration.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - The MIT License (MIT) - ----------------------------------------------------------------------------- - - Copyright (c) 2015 javafx.ninja - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - -*/ - -package ninja.javafx.smartcsv.validation; - -import com.google.gson.annotations.SerializedName; - -/** - * header configuration for the validation - */ -public class HeaderConfiguration { - - @SerializedName("list") - private String[] names ; - - public String[] getNames() { - return names; - } - - public void setNames(String[] names) { - this.names = names; - } -} diff --git a/src/main/java/ninja/javafx/smartcsv/validation/ValidationConfiguration.java b/src/main/java/ninja/javafx/smartcsv/validation/ValidationConfiguration.java index 848c42c..0eddd14 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/ValidationConfiguration.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/ValidationConfiguration.java @@ -28,149 +28,44 @@ package ninja.javafx.smartcsv.validation; import com.google.gson.annotations.SerializedName; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; -import java.util.Map; /** * validation configuration */ public class ValidationConfiguration { - @SerializedName("headers") - private HeaderConfiguration headerConfiguration = new HeaderConfiguration(); + @SerializedName("fields") + private FieldConfiguration[] fieldConfigurations; - @SerializedName("columns") - private Map> columnConfigurations = new HashMap<>(); + public FieldConfiguration[] getFieldConfigurations() { + return fieldConfigurations; + } + + public void setFieldConfigurations(FieldConfiguration[] fieldConfigurations) { + this.fieldConfigurations = fieldConfigurations; + } public String[] headerNames() { - if (noHeader()) return null; - return headerConfiguration.getNames(); - } - - public void setHeaderNames(String[] headerNames) { - headerConfiguration.setNames(headerNames); - } - - public Boolean getUniqueRuleFor(String column) { - return (Boolean)getValue(column, "unique"); - } - - public Boolean getIntegerRuleFor(String column) { - return (Boolean)getValue(column, "integer"); - } - - public Boolean getDoubleRuleFor(String column) { - return (Boolean)getValue(column, "double"); - } - - public Boolean getNotEmptyRuleFor(String column) { - return (Boolean)getValue(column, "not empty"); - } - - public Integer getMinLengthRuleFor(String column) { - return doubleToInteger((Double)getValue(column, "minlength")); - } - - public Integer getMaxLengthRuleFor(String column) { - Double value = (Double)getValue(column, "maxlength"); - return value != null ? doubleToInteger(value) : null; - } - - public String getDateRuleFor(String column) { - return (String)getValue(column, "date"); - } - - public Boolean getAlphanumericRuleFor(String column) { - return (Boolean)getValue(column, "alphanumeric"); - } - - public String getRegexpRuleFor(String column) { - return (String)getValue(column, "regexp"); - } - - public List getValueOfRuleFor(String column) { - return (List)getValue(column, "value of"); - } - - public String getGroovyRuleFor(String column) { - return (String)getValue(column, "groovy"); - } - - public void setIntegerRuleFor(String column, Boolean value) { - setValue(column, value, "integer"); - } - - public void setDoubleRuleFor(String column, Boolean value) { - setValue(column, value, "double"); - } - - public void setNotEmptyRuleFor(String column, Boolean value) { - setValue(column, value, "not empty"); - } - - public void setUniqueRuleFor(String column, Boolean value) { - setValue(column, value, "unique"); - } - - - public void setMinLengthRuleFor(String column, Integer value) { - setValue(column, value == null ? null : value.doubleValue(), "minlength"); - } - - public void setMaxLengthRuleFor(String column, Integer value) { - setValue(column, value == null ? null : value.doubleValue(), "maxlength"); - } - - public void setDateRuleFor(String column, String value) { - setValue(column, value, "date"); - } - - public void setAlphanumericRuleFor(String column, Boolean value) { - setValue(column, value, "alphanumeric"); - } - - public void setRegexpRuleFor(String column, String value) { - setValue(column, value, "regexp"); - } - - public void setValueOfRuleFor(String column, List value) { - setValue(column, value, "value of"); - } - - public void setGroovyRuleFor(String column, String value) { - setValue(column, value, "groovy"); - } - - private void setValue(String column, Object value, String key) { - if (!columnConfigurations.containsKey(column)) { - columnConfigurations.put(column, new HashMap<>()); - } - - if (value == null && columnConfigurations.get(column).containsKey(key)) { - columnConfigurations.get(column).remove(key); - } else { - columnConfigurations.get(column).put(key, value); - } - } - - private Object getValue(String column, String key) { - if (columnConfigurations != null) { - Map rulesForColumn = columnConfigurations.get(column); - if (rulesForColumn != null) { - return columnConfigurations.get(column).get(key); + if (fieldConfigurations != null) { + List headerNames = new ArrayList<>(); + for (FieldConfiguration fieldConfiguration: fieldConfigurations) { + headerNames.add(fieldConfiguration.getName()); } + return headerNames.toArray(new String[headerNames.size()]); } + return null; } - private boolean noHeader() { - return headerConfiguration == null; + public void setHeaderNames(String[] header) { + fieldConfigurations = new FieldConfiguration[header.length]; + int i = 0; + for (String headerName: header) { + fieldConfigurations[i] = new FieldConfiguration(); + fieldConfigurations[i].setName(headerName); + i++; + } } - - private Integer doubleToInteger(Double value) { - if (value == null) return null; - return (int)Math.round(value); - } - } diff --git a/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileReader.java b/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileReader.java index 45e8a60..c51e256 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileReader.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileReader.java @@ -42,6 +42,7 @@ public class ValidationFileReader implements FileReader @Override public void read(File file) throws IOException { config = new GsonBuilder().create().fromJson(new java.io.FileReader(file), ValidationConfiguration.class); + System.out.println("brechpunkt"); } public ValidationConfiguration getContent() { diff --git a/src/main/java/ninja/javafx/smartcsv/validation/Validator.java b/src/main/java/ninja/javafx/smartcsv/validation/Validator.java index cd620f4..8dada75 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/Validator.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/Validator.java @@ -32,6 +32,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static ninja.javafx.smartcsv.validation.DateFormatHelper.dateFormat; + /** * This class checks all the validations defined in the * Config against a given value @@ -134,70 +136,92 @@ public class Validator { private void initColumnValidations() { if (hasConfig()) { - String[] columns = validationConfig.headerNames(); - for (String column : columns) { + for (FieldConfiguration column : validationConfig.getFieldConfigurations()) { initializeColumnWithRules(column); } } } - private void initializeColumnWithRules(String column) { - Boolean alphaNumeric = validationConfig.getAlphanumericRuleFor(column); - if (alphaNumeric != null && alphaNumeric) { - add(column, new AlphaNumericValidation()); + private void initializeColumnWithRules(String columnName) { + if (hasConfig()) { + for (FieldConfiguration column : validationConfig.getFieldConfigurations()) { + if (column.getName().equals(columnName)) { + initializeColumnWithRules(column); + break; + } + } } - Boolean doubleRule = validationConfig.getDoubleRuleFor(column); - if (doubleRule != null && doubleRule) { - add(column, new DoubleValidation()); + } + + private void initializeColumnWithRules(FieldConfiguration column) { + + if (column.getType() != null) { + if (column.getType().equals("number")) { + add(column.getName(), new DoubleValidation()); + } + + if (column.getType().equals("integer")) { + add(column.getName(), new IntegerValidation()); + } + + if (column.getType().equals("date")) { + String format = dateFormat(column.getFormat(), "YYYY-MM-DD"); + add(column.getName(), new DateValidation(format)); + } + + if (column.getType().equals("datetime")) { + String format = dateFormat(column.getFormat(), "YYYY-MM-DDThh:mm:ssZ"); + add(column.getName(), new DateValidation(format)); + } + + if (column.getType().equals("time")) { + String format = dateFormat(column.getFormat(), "hh:mm:ss"); + add(column.getName(), new DateValidation(format)); + } } - Boolean integerRule = validationConfig.getIntegerRuleFor(column); - if (integerRule != null && integerRule) { - add(column, new IntegerValidation()); - } + if (column.getConstraints() != null) { + Boolean notEmptyRule = (Boolean)column.getConstraints().get("required"); + if (notEmptyRule != null && notEmptyRule) { + add(column.getName(), new NotEmptyValidation()); + } - Boolean notEmptyRule = validationConfig.getNotEmptyRuleFor(column); - if (notEmptyRule != null && notEmptyRule) { - add(column, new NotEmptyValidation()); - } + Boolean uniqueRule = (Boolean)column.getConstraints().get("unique"); + if (uniqueRule != null && uniqueRule) { + add(column.getName(), new UniqueValidation(columnValueProvider, column.getName())); + } - Boolean uniqueRule = validationConfig.getUniqueRuleFor(column); - if (uniqueRule != null && uniqueRule) { - add(column, new UniqueValidation(columnValueProvider, column)); - } + Integer minLength = doubleToInteger((Double)column.getConstraints().get("minLength")); + if (minLength != null) { + add(column.getName(), new MinLengthValidation(minLength)); + } - String dateRule = validationConfig.getDateRuleFor(column); - if (dateRule != null && !dateRule.trim().isEmpty()) { - add(column, new DateValidation(dateRule)); - } + Integer maxLength = doubleToInteger((Double)column.getConstraints().get("maxLength")); + if (maxLength != null) { + add(column.getName(), new MaxLengthValidation(maxLength)); + } - Integer minLength = validationConfig.getMinLengthRuleFor(column); - if (minLength != null) { - add(column, new MinLengthValidation(minLength)); - } + String regexp = (String)column.getConstraints().get("pattern"); + if (regexp != null && !regexp.trim().isEmpty()) { + add(column.getName(), new RegExpValidation(regexp)); + } - Integer maxLength = validationConfig.getMaxLengthRuleFor(column); - if (maxLength != null) { - add(column, new MaxLengthValidation(maxLength)); - } + String groovy = (String)column.getConstraints().get("groovy"); + if (groovy != null && !groovy.trim().isEmpty()) { + add(column.getName(), new GroovyValidation(groovy)); + } - String regexp = validationConfig.getRegexpRuleFor(column); - if (regexp != null && !regexp.trim().isEmpty()) { - add(column, new RegExpValidation(regexp)); - } - - String groovy = validationConfig.getGroovyRuleFor(column); - if (groovy != null && !groovy.trim().isEmpty()) { - add(column, new GroovyValidation(groovy)); - } - List valueOfRule = validationConfig.getValueOfRuleFor(column); - if (valueOfRule != null && !valueOfRule.isEmpty()) { - add(column, new ValueOfValidation(valueOfRule)); + List valueOfRule = (List)column.getConstraints().get("enum"); + if (valueOfRule != null && !valueOfRule.isEmpty()) { + add(column.getName(), new ValueOfValidation(valueOfRule)); + } } } + + public ValidationError isHeaderValid(String[] headerNames) { ValidationError result = null; if (validationConfig != null) { @@ -227,4 +251,9 @@ public class Validator { } return result; } + + private Integer doubleToInteger(Double value) { + if (value == null) return null; + return (int)Math.round(value); + } } From 742f129ea9e5003a4d75e939ed593ffde2936df6 Mon Sep 17 00:00:00 2001 From: Andreas Billmann Date: Thu, 1 Sep 2016 08:12:26 +0200 Subject: [PATCH 02/14] change editor to the new config The editor should handle the new configuration --- .../ValidationEditorController.java | 41 +++++-------------- .../validation/FieldConfiguration.java | 17 ++++++-- .../smartcsv/validation/Validation.java | 2 +- .../javafx/smartcsv/validation/Validator.java | 10 ++--- .../fx/validation/validationEditor.fxml | 25 +++++------ 5 files changed, 43 insertions(+), 52 deletions(-) diff --git a/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java b/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java index 085707e..e99cd2a 100644 --- a/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java +++ b/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java @@ -35,6 +35,7 @@ import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory; import ninja.javafx.smartcsv.fx.FXMLController; +import ninja.javafx.smartcsv.validation.FieldConfiguration; import ninja.javafx.smartcsv.validation.ValidationConfiguration; import org.fxmisc.richtext.CodeArea; import org.fxmisc.richtext.LineNumberFactory; @@ -100,20 +101,8 @@ public class ValidationEditorController extends FXMLController { + "|(?" + COMMENT_PATTERN + ")" ); -// @FXML -// private CheckBox notEmptyRuleCheckBox; -// -// @FXML -// private CheckBox integerRuleCheckBox; -// -// @FXML -// private CheckBox doublerRuleCheckBox; -// -// @FXML -// private CheckBox alphanumericRuleCheckBox; -// -// @FXML -// private CheckBox uniqueRuleCheckBox; + @FXML + private ComboBox typeComboBox; @FXML private Spinner minLengthSpinner; @@ -136,15 +125,6 @@ public class ValidationEditorController extends FXMLController { @FXML private CheckBox enableNotEmptyRule; - @FXML - private CheckBox enableIntegerRule; - - @FXML - private CheckBox enableDoubleRule; - - @FXML - private CheckBox enableAlphanumericRule; - @FXML private CheckBox enableMinLengthRule; @@ -176,6 +156,13 @@ public class ValidationEditorController extends FXMLController { @Override public void initialize(URL location, ResourceBundle resources) { + typeComboBox.getItems().addAll(FieldConfiguration.Type.STRING, + FieldConfiguration.Type.INTEGER, + FieldConfiguration.Type.NUMBER, + FieldConfiguration.Type.DATE, + FieldConfiguration.Type.DATETIME, + FieldConfiguration.Type.TIME); + initMinMaxSpinner(); initSpinner(minLengthSpinner, enableMinLengthRule); @@ -185,7 +172,6 @@ public class ValidationEditorController extends FXMLController { initTextInputControl(valueOfRuleTextField, enableValueOfRule); initCodeAreaControl(groovyRuleTextArea, enableGroovyRule); - listenToExcludingRuleCombinations(); selectedColumn.addListener(observable -> { updateForm(); @@ -296,13 +282,6 @@ public class ValidationEditorController extends FXMLController { } - private void listenToExcludingRuleCombinations() { - addDependencyListener(enableIntegerRule, enableDoubleRule, enableAlphanumericRule, enableDateRule); - addDependencyListener(enableDoubleRule, enableIntegerRule, enableAlphanumericRule, enableDateRule); - addDependencyListener(enableAlphanumericRule, enableIntegerRule, enableDoubleRule, enableDateRule); - addDependencyListener(enableDateRule, enableIntegerRule, enableDoubleRule, enableAlphanumericRule); - } - private void addDependencyListener(CheckBox rule, CheckBox... dependentRules) { rule.selectedProperty().addListener((observable, oldValue, newValue) -> { if (newValue) { diff --git a/src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java b/src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java index 5937a7d..39af161 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java @@ -1,5 +1,7 @@ package ninja.javafx.smartcsv.validation; +import com.google.gson.annotations.SerializedName; + import java.util.List; import java.util.Map; @@ -8,9 +10,18 @@ import java.util.Map; */ public class FieldConfiguration { + public enum Type { + @SerializedName("string") STRING, + @SerializedName("integer") INTEGER, + @SerializedName("number") NUMBER, + @SerializedName("date") DATE, + @SerializedName("datetime") DATETIME, + @SerializedName("time") TIME + } + private String name; private String title; - private String type; + private Type type; private String description; private String format; private Object missingValue; @@ -32,11 +43,11 @@ public class FieldConfiguration { this.title = title; } - public String getType() { + public Type getType() { return type; } - public void setType(String type) { + public void setType(Type type) { this.type = type; } diff --git a/src/main/java/ninja/javafx/smartcsv/validation/Validation.java b/src/main/java/ninja/javafx/smartcsv/validation/Validation.java index 931b0ad..957d3bb 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/Validation.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/Validation.java @@ -30,7 +30,7 @@ package ninja.javafx.smartcsv.validation; */ public interface Validation { - enum Type { NOT_EMPTY, UNIQUE, DOUBLE, INTEGER, MIN_LENGTH, MAX_LENGTH, DATE, ALPHANUMERIC, REGEXP, VALUE_OF, GROOVY } + enum Type { NOT_EMPTY, UNIQUE, DOUBLE, INTEGER, MIN_LENGTH, MAX_LENGTH, DATE, REGEXP, VALUE_OF, GROOVY } void check(int row, String value, ValidationError error); Type getType(); boolean canBeChecked(String value); diff --git a/src/main/java/ninja/javafx/smartcsv/validation/Validator.java b/src/main/java/ninja/javafx/smartcsv/validation/Validator.java index 8dada75..3774c13 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/Validator.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/Validator.java @@ -157,25 +157,25 @@ public class Validator { private void initializeColumnWithRules(FieldConfiguration column) { if (column.getType() != null) { - if (column.getType().equals("number")) { + if (column.getType() == FieldConfiguration.Type.NUMBER) { add(column.getName(), new DoubleValidation()); } - if (column.getType().equals("integer")) { + if (column.getType() == FieldConfiguration.Type.INTEGER) { add(column.getName(), new IntegerValidation()); } - if (column.getType().equals("date")) { + if (column.getType() == FieldConfiguration.Type.DATE) { String format = dateFormat(column.getFormat(), "YYYY-MM-DD"); add(column.getName(), new DateValidation(format)); } - if (column.getType().equals("datetime")) { + if (column.getType() == FieldConfiguration.Type.DATETIME) { String format = dateFormat(column.getFormat(), "YYYY-MM-DDThh:mm:ssZ"); add(column.getName(), new DateValidation(format)); } - if (column.getType().equals("time")) { + if (column.getType() == FieldConfiguration.Type.TIME) { String format = dateFormat(column.getFormat(), "hh:mm:ss"); add(column.getName(), new DateValidation(format)); } diff --git a/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml b/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml index b38c287..1b2518e 100644 --- a/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml +++ b/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml @@ -3,6 +3,7 @@ + @@ -11,7 +12,7 @@ - + @@ -33,21 +34,15 @@ - From 6f635f5e757a2b9a670147e4930ffda9252a5476 Mon Sep 17 00:00:00 2001 From: Andreas Billmann Date: Thu, 1 Sep 2016 08:12:53 +0200 Subject: [PATCH 03/14] ignore log file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index fd2d5e0..763c2b1 100644 --- a/.gitignore +++ b/.gitignore @@ -74,3 +74,4 @@ crashlytics.properties crashlytics-build.properties +smartcsv.log From 04a54da7987245288e452823bb66d3f1e5fab23c Mon Sep 17 00:00:00 2001 From: Andreas Billmann Date: Thu, 1 Sep 2016 22:05:31 +0200 Subject: [PATCH 04/14] editor should support new config ... first steps --- .../ValidationEditorController.java | 107 +++++++----------- .../validation/ValidationConfiguration.java | 9 ++ ...elper.java => ValidationFormatHelper.java} | 7 +- .../javafx/smartcsv/validation/Validator.java | 8 +- .../ninja/javafx/smartcsv/fx/smartcsv.css | 8 +- .../javafx/smartcsv/fx/smartcsv.properties | 2 + .../javafx/smartcsv/fx/smartcsv_de.properties | 2 + .../fx/validation/validationEditor.fxml | 98 +++++++--------- 8 files changed, 109 insertions(+), 132 deletions(-) rename src/main/java/ninja/javafx/smartcsv/validation/{DateFormatHelper.java => ValidationFormatHelper.java} (88%) diff --git a/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java b/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java index e99cd2a..c9bb88b 100644 --- a/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java +++ b/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java @@ -55,6 +55,7 @@ import java.util.regex.Pattern; import static java.util.Arrays.asList; import static java.util.stream.Collectors.joining; import static javafx.beans.binding.Bindings.when; +import static ninja.javafx.smartcsv.validation.ValidationFormatHelper.doubleToInteger; /** * controller for editing column validations @@ -110,9 +111,6 @@ public class ValidationEditorController extends FXMLController { @FXML private Spinner maxLengthSpinner; - @FXML - private TextField dateformatRuleTextField; - @FXML private TextField regexpRuleTextField; @@ -131,9 +129,6 @@ public class ValidationEditorController extends FXMLController { @FXML private CheckBox enableMaxLengthRule; - @FXML - private CheckBox enableDateRule; - @FXML private CheckBox enableRegexpRule; @@ -167,7 +162,6 @@ public class ValidationEditorController extends FXMLController { initSpinner(minLengthSpinner, enableMinLengthRule); initSpinner(maxLengthSpinner, enableMaxLengthRule); - initTextInputControl(dateformatRuleTextField, enableDateRule); initTextInputControl(regexpRuleTextField, enableRegexpRule); initTextInputControl(valueOfRuleTextField, enableValueOfRule); initCodeAreaControl(groovyRuleTextArea, enableGroovyRule); @@ -294,66 +288,45 @@ public class ValidationEditorController extends FXMLController { private void updateForm() { -// updateCheckBox( -// validationConfiguration.getNotEmptyRuleFor(getSelectedColumn()), -// enableNotEmptyRule -// ); -// -// updateCheckBox( -// validationConfiguration.getIntegerRuleFor(getSelectedColumn()), -// enableIntegerRule -// ); -// -// updateCheckBox( -// validationConfiguration.getDoubleRuleFor(getSelectedColumn()), -// enableDoubleRule -// ); -// -// updateCheckBox( -// validationConfiguration.getAlphanumericRuleFor(getSelectedColumn()), -// enableAlphanumericRule -// ); -// -// updateCheckBox( -// validationConfiguration.getUniqueRuleFor(getSelectedColumn()), -// enableUniqueRule -// ); -// -// updateSpinner( -// minLengthSpinner, -// validationConfiguration.getMinLengthRuleFor(getSelectedColumn()), -// enableMinLengthRule -// ); -// -// updateSpinner( -// maxLengthSpinner, -// validationConfiguration.getMaxLengthRuleFor(getSelectedColumn()), -// enableMaxLengthRule -// ); -// -// updateTextInputControl( -// dateformatRuleTextField, -// validationConfiguration.getDateRuleFor(getSelectedColumn()), -// enableDateRule -// ); -// -// updateTextInputControl( -// regexpRuleTextField, -// validationConfiguration.getRegexpRuleFor(getSelectedColumn()), -// enableRegexpRule -// ); -// -// updateTextInputControl( -// valueOfRuleTextField, -// validationConfiguration.getValueOfRuleFor(getSelectedColumn()), -// enableValueOfRule -// ); -// -// updateCodeAreaControl( -// groovyRuleTextArea, -// validationConfiguration.getGroovyRuleFor(getSelectedColumn()), -// enableGroovyRule -// ); + updateCheckBox( + (Boolean)validationConfiguration.getFieldConfiguration(getSelectedColumn()).getConstraints().get("required"), + enableNotEmptyRule + ); + + updateCheckBox( + (Boolean)validationConfiguration.getFieldConfiguration(getSelectedColumn()).getConstraints().get("unique"), + enableUniqueRule + ); + + updateSpinner( + minLengthSpinner, + doubleToInteger((Double)validationConfiguration.getFieldConfiguration(getSelectedColumn()).getConstraints().get("minLength")), + enableMinLengthRule + ); + + updateSpinner( + maxLengthSpinner, + doubleToInteger((Double)validationConfiguration.getFieldConfiguration(getSelectedColumn()).getConstraints().get("maxLength")), + enableMaxLengthRule + ); + + updateTextInputControl( + regexpRuleTextField, + (String)validationConfiguration.getFieldConfiguration(getSelectedColumn()).getConstraints().get("pattern"), + enableRegexpRule + ); + + updateTextInputControl( + valueOfRuleTextField, + (String)validationConfiguration.getFieldConfiguration(getSelectedColumn()).getConstraints().get("enum"), + enableValueOfRule + ); + + updateCodeAreaControl( + groovyRuleTextArea, + (String)validationConfiguration.getFieldConfiguration(getSelectedColumn()).getConstraints().get("groovy"), + enableGroovyRule + ); } private void updateCheckBox(Boolean value, CheckBox ruleEnabled) { diff --git a/src/main/java/ninja/javafx/smartcsv/validation/ValidationConfiguration.java b/src/main/java/ninja/javafx/smartcsv/validation/ValidationConfiguration.java index 0eddd14..08dc1b6 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/ValidationConfiguration.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/ValidationConfiguration.java @@ -47,6 +47,15 @@ public class ValidationConfiguration { this.fieldConfigurations = fieldConfigurations; } + public FieldConfiguration getFieldConfiguration(String column) { + for (FieldConfiguration fieldConfiguration: fieldConfigurations) { + if (fieldConfiguration.getName().equals(column)) { + return fieldConfiguration; + } + } + return null; + } + public String[] headerNames() { if (fieldConfigurations != null) { List headerNames = new ArrayList<>(); diff --git a/src/main/java/ninja/javafx/smartcsv/validation/DateFormatHelper.java b/src/main/java/ninja/javafx/smartcsv/validation/ValidationFormatHelper.java similarity index 88% rename from src/main/java/ninja/javafx/smartcsv/validation/DateFormatHelper.java rename to src/main/java/ninja/javafx/smartcsv/validation/ValidationFormatHelper.java index f80fc7a..90ade1b 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/DateFormatHelper.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/ValidationFormatHelper.java @@ -3,7 +3,7 @@ package ninja.javafx.smartcsv.validation; /** * @author abi */ -public class DateFormatHelper { +public class ValidationFormatHelper { public static String dateFormat(String format, String defaultFormat) { @@ -35,4 +35,9 @@ public class DateFormatHelper { } return defaultFormat; } + + public static Integer doubleToInteger(Double value) { + if (value == null) return null; + return (int)Math.round(value); + } } diff --git a/src/main/java/ninja/javafx/smartcsv/validation/Validator.java b/src/main/java/ninja/javafx/smartcsv/validation/Validator.java index 3774c13..a2a2a1a 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/Validator.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/Validator.java @@ -32,7 +32,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import static ninja.javafx.smartcsv.validation.DateFormatHelper.dateFormat; +import static ninja.javafx.smartcsv.validation.ValidationFormatHelper.dateFormat; +import static ninja.javafx.smartcsv.validation.ValidationFormatHelper.doubleToInteger; /** * This class checks all the validations defined in the @@ -252,8 +253,5 @@ public class Validator { return result; } - private Integer doubleToInteger(Double value) { - if (value == null) return null; - return (int)Math.round(value); - } + } diff --git a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.css b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.css index 2042b66..d15dfa5 100644 --- a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.css +++ b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.css @@ -1,16 +1,16 @@ -.list-view { +.table-view .list-view { -fx-background-color: -fx-background; -fx-padding: 1; } -.list-cell { +.table-view .list-cell { -fx-padding: 1.0em 1.0em 1.0em 1.0em; } -.list-cell:odd { +.table-view .list-cell:odd { -fx-background: -fx-control-inner-background-alt; } -.list-cell:even { +.table-view .list-cell:even { -fx-background: -fx-control-inner-background; } diff --git a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.properties b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.properties index 5cc9ef6..027bf1c 100644 --- a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.properties +++ b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.properties @@ -74,6 +74,8 @@ validation.rules.active = active validation.rules.name = rule validation.rules.value = value validation.rule.label.unique = Unique in column +validation.rule.format = Format: +validation.rule.type = Type: dialog.validation.rules.title = Validation rules dialog.validation.rules.header = Validation rules of column "{0}" diff --git a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv_de.properties b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv_de.properties index ce2dcc3..16f75c0 100644 --- a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv_de.properties +++ b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv_de.properties @@ -83,6 +83,8 @@ validation.rules.active = Aktiv validation.rules.name = Regel validation.rules.value = Wert validation.rule.label.unique = Einmalig in Spalte +validation.rule.format = Format: +validation.rule.type = Typ: dialog.validation.rules.title = Pr\u00fcfregeln dialog.validation.rules.header = Pr\u00fcfregeln f\u00fcr die Spalte "{0}" diff --git a/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml b/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml index 1b2518e..e85fc6c 100644 --- a/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml +++ b/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml @@ -5,6 +5,7 @@ + @@ -12,64 +13,51 @@ - - - - - - - + + + + + + + + + - - - + + + + - - - - - - - - - - - + + + From 5694273c516d4535342b879923fa8461ed343837 Mon Sep 17 00:00:00 2001 From: Andreas Billmann Date: Mon, 5 Sep 2016 22:49:49 +0200 Subject: [PATCH 05/14] read constraints into an object instead of some map structure and change form init of validation editor --- .../ValidationEditorController.java | 45 +++++----- .../validation/ConstraintsConfiguration.java | 69 ++++++++++++++ .../validation/FieldConfiguration.java | 20 +++-- .../javafx/smartcsv/validation/Validator.java | 25 +++--- .../fx/validation/validationEditor.fxml | 89 +++++++++++-------- 5 files changed, 171 insertions(+), 77 deletions(-) create mode 100644 src/main/java/ninja/javafx/smartcsv/validation/ConstraintsConfiguration.java diff --git a/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java b/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java index c9bb88b..87da18f 100644 --- a/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java +++ b/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java @@ -26,15 +26,13 @@ package ninja.javafx.smartcsv.fx.validation; -import javafx.beans.binding.Bindings; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; -import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory; import ninja.javafx.smartcsv.fx.FXMLController; +import ninja.javafx.smartcsv.validation.ConstraintsConfiguration; import ninja.javafx.smartcsv.validation.FieldConfiguration; import ninja.javafx.smartcsv.validation.ValidationConfiguration; import org.fxmisc.richtext.CodeArea; @@ -52,10 +50,8 @@ import java.util.ResourceBundle; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static java.util.Arrays.asList; import static java.util.stream.Collectors.joining; import static javafx.beans.binding.Bindings.when; -import static ninja.javafx.smartcsv.validation.ValidationFormatHelper.doubleToInteger; /** * controller for editing column validations @@ -82,7 +78,7 @@ public class ValidationEditorController extends FXMLController { "transient", "true", "try", "void", "volatile", "while" }; - private static final String KEYWORD_PATTERN = "\\b(" + String.join("|", KEYWORDS) + ")\\b"; + private static final String KEYWORD_PATTERN = "\\b(" + String.join("|", (CharSequence[]) KEYWORDS) + ")\\b"; private static final String PAREN_PATTERN = "\\(|\\)"; private static final String BRACE_PATTERN = "\\{|\\}"; private static final String BRACKET_PATTERN = "\\[|\\]"; @@ -157,6 +153,7 @@ public class ValidationEditorController extends FXMLController { FieldConfiguration.Type.DATE, FieldConfiguration.Type.DATETIME, FieldConfiguration.Type.TIME); + typeComboBox.setValue(FieldConfiguration.Type.STRING); initMinMaxSpinner(); @@ -288,45 +285,49 @@ public class ValidationEditorController extends FXMLController { private void updateForm() { - updateCheckBox( - (Boolean)validationConfiguration.getFieldConfiguration(getSelectedColumn()).getConstraints().get("required"), - enableNotEmptyRule + FieldConfiguration config = validationConfiguration.getFieldConfiguration(getSelectedColumn()); + + if (config.getType() != null) { + typeComboBox.setValue(config.getType()); + } else { + typeComboBox.setValue(FieldConfiguration.Type.STRING); + } + + updateCodeAreaControl( + groovyRuleTextArea, + config.getGroovy(), + enableGroovyRule ); - updateCheckBox( - (Boolean)validationConfiguration.getFieldConfiguration(getSelectedColumn()).getConstraints().get("unique"), - enableUniqueRule - ); + ConstraintsConfiguration constraints = config.getConstraints(); + updateCheckBox(constraints != null ? constraints.getRequired() : false, enableNotEmptyRule); + updateCheckBox(constraints != null ? constraints.getUnique() : false, enableUniqueRule); updateSpinner( minLengthSpinner, - doubleToInteger((Double)validationConfiguration.getFieldConfiguration(getSelectedColumn()).getConstraints().get("minLength")), + constraints != null ? constraints.getMinLength() : null, enableMinLengthRule ); updateSpinner( maxLengthSpinner, - doubleToInteger((Double)validationConfiguration.getFieldConfiguration(getSelectedColumn()).getConstraints().get("maxLength")), + constraints != null ? constraints.getMaxLength() : null, enableMaxLengthRule ); updateTextInputControl( regexpRuleTextField, - (String)validationConfiguration.getFieldConfiguration(getSelectedColumn()).getConstraints().get("pattern"), + constraints != null ? constraints.getPattern() : null, enableRegexpRule ); updateTextInputControl( valueOfRuleTextField, - (String)validationConfiguration.getFieldConfiguration(getSelectedColumn()).getConstraints().get("enum"), + constraints != null ? constraints.getEnumeration() : null, enableValueOfRule ); - updateCodeAreaControl( - groovyRuleTextArea, - (String)validationConfiguration.getFieldConfiguration(getSelectedColumn()).getConstraints().get("groovy"), - enableGroovyRule - ); + } private void updateCheckBox(Boolean value, CheckBox ruleEnabled) { diff --git a/src/main/java/ninja/javafx/smartcsv/validation/ConstraintsConfiguration.java b/src/main/java/ninja/javafx/smartcsv/validation/ConstraintsConfiguration.java new file mode 100644 index 0000000..be6e7cb --- /dev/null +++ b/src/main/java/ninja/javafx/smartcsv/validation/ConstraintsConfiguration.java @@ -0,0 +1,69 @@ +package ninja.javafx.smartcsv.validation; + +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +/** + * Created by PC on 04.09.2016. + */ +public class ConstraintsConfiguration { + private Boolean required; + private Boolean unique; + private Integer minLength; + private Integer maxLength; + + private String pattern; + + @SerializedName("enum") + private List enumeration; + + public Boolean getRequired() { + return required; + } + + public void setRequired(Boolean required) { + this.required = required; + } + + public Boolean getUnique() { + return unique; + } + + public void setUnique(Boolean unique) { + this.unique = unique; + } + + public Integer getMinLength() { + return minLength; + } + + public void setMinLength(Integer minLength) { + this.minLength = minLength; + } + + public Integer getMaxLength() { + return maxLength; + } + + public void setMaxLength(Integer maxLength) { + this.maxLength = maxLength; + } + + public String getPattern() { + return pattern; + } + + public void setPattern(String pattern) { + this.pattern = pattern; + } + + public List getEnumeration() { + return enumeration; + } + + public void setEnumeration(List enumeration) { + this.enumeration = enumeration; + } + +} diff --git a/src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java b/src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java index 39af161..2497a99 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java @@ -2,9 +2,6 @@ package ninja.javafx.smartcsv.validation; import com.google.gson.annotations.SerializedName; -import java.util.List; -import java.util.Map; - /** * @author abi */ @@ -25,7 +22,9 @@ public class FieldConfiguration { private String description; private String format; private Object missingValue; - private Map constraints; + private ConstraintsConfiguration constraints; + private String groovy; + public String getName() { return name; @@ -75,11 +74,20 @@ public class FieldConfiguration { this.missingValue = missingValue; } - public Map getConstraints() { + public ConstraintsConfiguration getConstraints() { return constraints; } - public void setConstraints(Map constraints) { + public void setConstraints(ConstraintsConfiguration constraints) { this.constraints = constraints; } + + public String getGroovy() { + return groovy; + } + + public void setGroovy(String groovy) { + this.groovy = groovy; + } + } diff --git a/src/main/java/ninja/javafx/smartcsv/validation/Validator.java b/src/main/java/ninja/javafx/smartcsv/validation/Validator.java index a2a2a1a..dbca6c9 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/Validator.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/Validator.java @@ -182,38 +182,41 @@ public class Validator { } } - if (column.getConstraints() != null) { - Boolean notEmptyRule = (Boolean)column.getConstraints().get("required"); + String groovy = column.getGroovy(); + if (groovy != null && !groovy.trim().isEmpty()) { + add(column.getName(), new GroovyValidation(groovy)); + } + + ConstraintsConfiguration constraints = column.getConstraints(); + if (constraints != null) { + Boolean notEmptyRule = constraints.getRequired(); if (notEmptyRule != null && notEmptyRule) { add(column.getName(), new NotEmptyValidation()); } - Boolean uniqueRule = (Boolean)column.getConstraints().get("unique"); + Boolean uniqueRule = constraints.getUnique(); if (uniqueRule != null && uniqueRule) { add(column.getName(), new UniqueValidation(columnValueProvider, column.getName())); } - Integer minLength = doubleToInteger((Double)column.getConstraints().get("minLength")); + Integer minLength = constraints.getMinLength(); if (minLength != null) { add(column.getName(), new MinLengthValidation(minLength)); } - Integer maxLength = doubleToInteger((Double)column.getConstraints().get("maxLength")); + Integer maxLength = constraints.getMaxLength(); if (maxLength != null) { add(column.getName(), new MaxLengthValidation(maxLength)); } - String regexp = (String)column.getConstraints().get("pattern"); + String regexp = constraints.getPattern(); if (regexp != null && !regexp.trim().isEmpty()) { add(column.getName(), new RegExpValidation(regexp)); } - String groovy = (String)column.getConstraints().get("groovy"); - if (groovy != null && !groovy.trim().isEmpty()) { - add(column.getName(), new GroovyValidation(groovy)); - } - List valueOfRule = (List)column.getConstraints().get("enum"); + + List valueOfRule = constraints.getEnumeration(); if (valueOfRule != null && !valueOfRule.isEmpty()) { add(column.getName(), new ValueOfValidation(valueOfRule)); } diff --git a/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml b/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml index e85fc6c..9699436 100644 --- a/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml +++ b/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml @@ -13,52 +13,65 @@ - + - - - - + + + + - - - - - - - - - + + + + + + + + + - - + - + From 7723906935e1fd33873341d06023062b7c7ee258 Mon Sep 17 00:00:00 2001 From: Andreas Billmann Date: Wed, 7 Sep 2016 17:27:50 +0200 Subject: [PATCH 06/14] write values back to config --- .../ValidationEditorController.java | 187 ++++++++++++------ .../validation/FieldConfiguration.java | 6 + 2 files changed, 128 insertions(+), 65 deletions(-) diff --git a/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java b/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java index 87da18f..6882648 100644 --- a/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java +++ b/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java @@ -50,6 +50,7 @@ import java.util.ResourceBundle; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static java.util.Arrays.asList; import static java.util.stream.Collectors.joining; import static javafx.beans.binding.Bindings.when; @@ -203,73 +204,129 @@ public class ValidationEditorController extends FXMLController { this.validationConfiguration = validationConfiguration; } + private void changeFormatInput() { + switch (typeComboBox.getValue()) { + case STRING: + /* + default: any valid string. + email: A valid email address. + uri: A valid URI. + binary: A base64 encoded string representing binary data. + uuid: A string that is a uuid + */ + break; + case NUMBER: + /* + decimalChar: A string whose value is used to represent a decimal point within the number. The default value is ".". + groupChar: A string whose value is used to group digits within the number. The default value is null. A common value is "," e.g. "100,000". + currency + */ + break; + case DATE: + /* + default: An ISO8601 format string. + This MUST be in ISO8601 format YYYY-MM-DD + any: Any parsable representation of the type. The implementing library can attempt to parse the datetime via a range of strategies. + An example is dateutil.parser.parse from the python-dateutils library. + fmt:PATTERN: date/time values in this field conform to PATTERN where [PATTERN] follows the syntax of standard Python / C strptime. + */ + break; + case DATETIME: + /* + default: An ISO8601 format string. + datetime: a date-time. This MUST be in ISO 8601 format of YYYY-MM-DDThhssZ in UTC time + any: Any parsable representation of the type. The implementing library can attempt to parse the datetime via a range of strategies. + An example is dateutil.parser.parse from the python-dateutils library. + fmt:PATTERN: date/time values in this field conform to PATTERN where [PATTERN] follows the syntax of standard Python / C strptime. + */ + break; + case TIME: + /* + default: An ISO8601 format string. + time: a time without a date + any: Any parsable representation of the type. The implementing library can attempt to parse the datetime via a range of strategies. + An example is dateutil.parser.parse from the python-dateutils library. + fmt:PATTERN: date/time values in this field conform to PATTERN where [PATTERN] follows the syntax of standard Python / C strptime. + */ + break; +// case GEOPOINT: +// /* +// default: A string of the pattern "lon, lat", where lon is the longitude and lat is the latitude. +// array: An array of exactly two items, where each item is either a number, or a string parsable as a number, and the first item is lon and the second item is lat. +// object: A JSON object with exactly two keys, lat and lon +// */ +// break; +// case GEOJSON: +// /* +// default: A geojson object as per the GeoJSON spec. +// topojson: A topojson object as per the TopoJSON spec +// */ +// case DURATION: +// case OBJECT: +// case ARRAY: + case INTEGER: + default: + // format: no options + break; + } + } + + + public void updateConfiguration() { -// if (enableIntegerRule.isSelected()) { -// validationConfiguration.setIntegerRuleFor(selectedColumn.getValue(), enableIntegerRule.isSelected()); -// } else { -// validationConfiguration.setIntegerRuleFor(selectedColumn.getValue(), null); -// } -// -// if (enableNotEmptyRule.isSelected()) { -// validationConfiguration.setNotEmptyRuleFor(selectedColumn.getValue(), enableNotEmptyRule.isSelected()); -// } else { -// validationConfiguration.setNotEmptyRuleFor(selectedColumn.getValue(), null); -// } -// -// if (enableUniqueRule.isSelected()) { -// validationConfiguration.setUniqueRuleFor(selectedColumn.getValue(), enableUniqueRule.isSelected()); -// } else { -// validationConfiguration.setUniqueRuleFor(selectedColumn.getValue(), null); -// } -// -// if (enableDoubleRule.isSelected()) { -// validationConfiguration.setDoubleRuleFor(selectedColumn.getValue(), enableDoubleRule.isSelected()); -// } else { -// validationConfiguration.setDoubleRuleFor(selectedColumn.getValue(), null); -// } -// -// if (enableAlphanumericRule.isSelected()) { -// validationConfiguration.setAlphanumericRuleFor(selectedColumn.getValue(), enableAlphanumericRule.isSelected()); -// } else { -// validationConfiguration.setAlphanumericRuleFor(selectedColumn.getValue(), null); -// } -// -// if (enableDateRule.isSelected()) { -// validationConfiguration.setDateRuleFor(selectedColumn.getValue(), dateformatRuleTextField.getText()); -// } else { -// validationConfiguration.setDateRuleFor(selectedColumn.getValue(), null); -// } -// -// if (enableGroovyRule.isSelected()) { -// validationConfiguration.setGroovyRuleFor(selectedColumn.getValue(), groovyRuleTextArea.getText()); -// } else { -// validationConfiguration.setGroovyRuleFor(selectedColumn.getValue(), null); -// } -// -// if (enableMinLengthRule.isSelected()) { -// validationConfiguration.setMinLengthRuleFor(selectedColumn.getValue(), minLengthSpinner.getValue()); -// } else { -// validationConfiguration.setMinLengthRuleFor(selectedColumn.getValue(), null); -// } -// -// if (enableMaxLengthRule.isSelected()) { -// validationConfiguration.setMaxLengthRuleFor(selectedColumn.getValue(), maxLengthSpinner.getValue()); -// } else { -// validationConfiguration.setMaxLengthRuleFor(selectedColumn.getValue(), null); -// } -// -// if (enableRegexpRule.isSelected()) { -// validationConfiguration.setRegexpRuleFor(selectedColumn.getValue(), regexpRuleTextField.getText()); -// } else { -// validationConfiguration.setRegexpRuleFor(selectedColumn.getValue(), null); -// } -// -// if (enableValueOfRule.isSelected()) { -// validationConfiguration.setValueOfRuleFor(selectedColumn.getValue(), asList(valueOfRuleTextField.getText().split(", "))); -// } else { -// validationConfiguration.setValueOfRuleFor(selectedColumn.getValue(), null); -// } + FieldConfiguration config = validationConfiguration.getFieldConfiguration(getSelectedColumn()); + config.setType(typeComboBox.getValue()); + + if (enableGroovyRule.isSelected()) { + config.setGroovy(groovyRuleTextArea.getText()); + } else { + config.setGroovy(null); + } + + ConstraintsConfiguration constraints = config.getConstraints(); + if (constraints == null) { + constraints = new ConstraintsConfiguration(); + } + + + + + if (enableNotEmptyRule.isSelected()) { + constraints.setRequired(enableNotEmptyRule.isSelected()); + } else { + constraints.setRequired(null); + } + + if (enableUniqueRule.isSelected()) { + constraints.setUnique(enableUniqueRule.isSelected()); + } else { + constraints.setUnique(null); + } + + if (enableMinLengthRule.isSelected()) { + constraints.setMinLength(minLengthSpinner.getValue()); + } else { + constraints.setMinLength(null); + } + + if (enableMaxLengthRule.isSelected()) { + constraints.setMaxLength(maxLengthSpinner.getValue()); + } else { + constraints.setMaxLength(null); + } + + if (enableRegexpRule.isSelected()) { + constraints.setPattern(regexpRuleTextField.getText()); + } else { + constraints.setPattern(null); + } + + if (enableValueOfRule.isSelected()) { + constraints.setEnumeration(asList(valueOfRuleTextField.getText().split(", "))); + } else { + constraints.setEnumeration(null); + } } diff --git a/src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java b/src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java index 2497a99..521133f 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java @@ -14,6 +14,12 @@ public class FieldConfiguration { @SerializedName("date") DATE, @SerializedName("datetime") DATETIME, @SerializedName("time") TIME +// TODO: currently not supported +// @SerializedName("object") OBJECT, +// @SerializedName("array") ARRAY, +// @SerializedName("duration") DURATION, +// @SerializedName("geopoint") GEOPOINT, +// @SerializedName("geojson") GEOJSON } private String name; From 4002219dfee07bb25a98bb123a3192a7f3791212 Mon Sep 17 00:00:00 2001 From: Andreas Billmann Date: Mon, 12 Sep 2016 04:48:22 +0200 Subject: [PATCH 07/14] reorganize validation package --- .../javafx/smartcsv/export/ErrorExport.java | 6 +- .../smartcsv/fx/SmartCSVController.java | 3 +- .../javafx/smartcsv/fx/list/ErrorSideBar.java | 4 +- .../smartcsv/fx/table/model/CSVModel.java | 2 +- .../smartcsv/fx/util/I18nValidationUtil.java | 9 +- .../ValidationEditorController.java | 232 +++++++++++------- .../validation/ValidationFileReader.java | 2 +- .../validation/ValidationFileWriter.java | 1 + .../javafx/smartcsv/validation/Validator.java | 5 +- .../{ => checker}/DateValidation.java | 4 +- .../{ => checker}/DoubleValidation.java | 4 +- .../{ => checker}/EmptyValueIsValid.java | 2 +- .../{ => checker}/GroovyValidation.java | 3 +- .../{ => checker}/IntegerValidation.java | 4 +- .../{ => checker}/MaxLengthValidation.java | 4 +- .../{ => checker}/MinLengthValidation.java | 4 +- .../{ => checker}/NotEmptyValidation.java | 4 +- .../{ => checker}/RegExpValidation.java | 4 +- .../{ => checker}/UniqueValidation.java | 3 +- .../validation/{ => checker}/Validation.java | 4 +- .../{ => checker}/ValueOfValidation.java | 4 +- .../ConstraintsConfiguration.java | 2 +- .../FieldConfiguration.java | 45 +++- .../ValidationConfiguration.java | 2 +- .../fx/validation/validationEditor.fxml | 82 +++---- .../validation/HeaderValidationTest.java | 1 + .../smartcsv/validation/ValidatorTest.java | 1 + 27 files changed, 274 insertions(+), 167 deletions(-) rename src/main/java/ninja/javafx/smartcsv/validation/{ => checker}/DateValidation.java (94%) rename src/main/java/ninja/javafx/smartcsv/validation/{ => checker}/DoubleValidation.java (93%) rename src/main/java/ninja/javafx/smartcsv/validation/{ => checker}/EmptyValueIsValid.java (84%) rename src/main/java/ninja/javafx/smartcsv/validation/{ => checker}/GroovyValidation.java (96%) rename src/main/java/ninja/javafx/smartcsv/validation/{ => checker}/IntegerValidation.java (93%) rename src/main/java/ninja/javafx/smartcsv/validation/{ => checker}/MaxLengthValidation.java (94%) rename src/main/java/ninja/javafx/smartcsv/validation/{ => checker}/MinLengthValidation.java (94%) rename src/main/java/ninja/javafx/smartcsv/validation/{ => checker}/NotEmptyValidation.java (94%) rename src/main/java/ninja/javafx/smartcsv/validation/{ => checker}/RegExpValidation.java (94%) rename src/main/java/ninja/javafx/smartcsv/validation/{ => checker}/UniqueValidation.java (96%) rename src/main/java/ninja/javafx/smartcsv/validation/{ => checker}/Validation.java (93%) rename src/main/java/ninja/javafx/smartcsv/validation/{ => checker}/ValueOfValidation.java (94%) rename src/main/java/ninja/javafx/smartcsv/validation/{ => configuration}/ConstraintsConfiguration.java (95%) rename src/main/java/ninja/javafx/smartcsv/validation/{ => configuration}/FieldConfiguration.java (61%) rename src/main/java/ninja/javafx/smartcsv/validation/{ => configuration}/ValidationConfiguration.java (98%) diff --git a/src/main/java/ninja/javafx/smartcsv/export/ErrorExport.java b/src/main/java/ninja/javafx/smartcsv/export/ErrorExport.java index 6ec2107..6837a52 100644 --- a/src/main/java/ninja/javafx/smartcsv/export/ErrorExport.java +++ b/src/main/java/ninja/javafx/smartcsv/export/ErrorExport.java @@ -51,13 +51,13 @@ public class ErrorExport extends Service { format(resourceBundle.getString("log.header.message"), csvFilename, Integer.toString(model.getValidationError().size()))).append("\n\n"); - for (ValidationError error:model.getValidationError()) { + model.getValidationError().forEach(error -> log.append( format(resourceBundle.getString("log.message"), error.getLineNumber().toString(), error.getColumn(), - getI18nValidatioMessage(resourceBundle, error))).append("\n"); - } + getI18nValidatioMessage(resourceBundle, error))).append("\n") + ); Files.write(file.toPath(), log.toString().getBytes()); } catch (Throwable ex) { diff --git a/src/main/java/ninja/javafx/smartcsv/fx/SmartCSVController.java b/src/main/java/ninja/javafx/smartcsv/fx/SmartCSVController.java index 30af0ff..9f46d26 100644 --- a/src/main/java/ninja/javafx/smartcsv/fx/SmartCSVController.java +++ b/src/main/java/ninja/javafx/smartcsv/fx/SmartCSVController.java @@ -56,7 +56,7 @@ import ninja.javafx.smartcsv.fx.util.SaveFileService; import ninja.javafx.smartcsv.fx.validation.ValidationEditorController; import ninja.javafx.smartcsv.preferences.PreferencesFileReader; import ninja.javafx.smartcsv.preferences.PreferencesFileWriter; -import ninja.javafx.smartcsv.validation.ValidationConfiguration; +import ninja.javafx.smartcsv.validation.configuration.ValidationConfiguration; import ninja.javafx.smartcsv.validation.ValidationError; import ninja.javafx.smartcsv.validation.ValidationFileReader; import ninja.javafx.smartcsv.validation.ValidationFileWriter; @@ -425,6 +425,7 @@ public class SmartCSVController extends FXMLController { public void showValidationEditor(String column) { validationEditorController.setSelectedColumn(column); + validationEditorController.updateForm(); Alert alert = new Alert(Alert.AlertType.CONFIRMATION); alert.setGraphic(null); diff --git a/src/main/java/ninja/javafx/smartcsv/fx/list/ErrorSideBar.java b/src/main/java/ninja/javafx/smartcsv/fx/list/ErrorSideBar.java index 9d89011..5bbcb7f 100644 --- a/src/main/java/ninja/javafx/smartcsv/fx/list/ErrorSideBar.java +++ b/src/main/java/ninja/javafx/smartcsv/fx/list/ErrorSideBar.java @@ -137,9 +137,7 @@ public class ErrorSideBar extends Region { int rows = model.get().getRows().size(); double space = (double)heightWithoutStatusBlock() / rows; - for (ValidationError error : errorList) { - errorMarkerList.add(generateErrorMarker(space, error)); - } + errorList.forEach(error -> errorMarkerList.add(generateErrorMarker(space, error))); } } getChildren().setAll(errorMarkerList); diff --git a/src/main/java/ninja/javafx/smartcsv/fx/table/model/CSVModel.java b/src/main/java/ninja/javafx/smartcsv/fx/table/model/CSVModel.java index 9f15502..0ef5be8 100644 --- a/src/main/java/ninja/javafx/smartcsv/fx/table/model/CSVModel.java +++ b/src/main/java/ninja/javafx/smartcsv/fx/table/model/CSVModel.java @@ -29,7 +29,7 @@ package ninja.javafx.smartcsv.fx.table.model; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import ninja.javafx.smartcsv.validation.RevalidationService; -import ninja.javafx.smartcsv.validation.ValidationConfiguration; +import ninja.javafx.smartcsv.validation.configuration.ValidationConfiguration; import ninja.javafx.smartcsv.validation.ValidationError; import ninja.javafx.smartcsv.validation.Validator; import org.apache.logging.log4j.LogManager; diff --git a/src/main/java/ninja/javafx/smartcsv/fx/util/I18nValidationUtil.java b/src/main/java/ninja/javafx/smartcsv/fx/util/I18nValidationUtil.java index 5fa81fe..9ee425e 100644 --- a/src/main/java/ninja/javafx/smartcsv/fx/util/I18nValidationUtil.java +++ b/src/main/java/ninja/javafx/smartcsv/fx/util/I18nValidationUtil.java @@ -43,9 +43,8 @@ public class I18nValidationUtil { public static String getI18nValidatioMessage(ResourceBundle resourceBundle, List errors) { StringWriter message = new StringWriter(); - for (ValidationError validationError: errors) { - message.append(getI18nValidatioMessage(resourceBundle, validationError)).append("\n"); - } + errors.forEach(error -> message.append(getI18nValidatioMessage(resourceBundle, error)).append("\n")); + if (message.toString().length() != 0) { return cutOffLastLineBreak(message.toString()); @@ -66,7 +65,7 @@ public class I18nValidationUtil { List validationMessages = error.getMessages(); StringWriter message = new StringWriter(); - for (ValidationMessage validationMessage: validationMessages) { + validationMessages.forEach(validationMessage -> { message.append(prefix); if (resourceBundle.containsKey(validationMessage.getKey())) { String resourceText = resourceBundle.getString(validationMessage.getKey()); @@ -78,7 +77,7 @@ public class I18nValidationUtil { } else { message.append(validationMessage.getKey()).append("\n"); } - } + }); if (!validationMessages.isEmpty()) { return cutOffLastLineBreak(message.toString()); diff --git a/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java b/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java index 6882648..2df9405 100644 --- a/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java +++ b/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java @@ -32,9 +32,9 @@ import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory; import ninja.javafx.smartcsv.fx.FXMLController; -import ninja.javafx.smartcsv.validation.ConstraintsConfiguration; -import ninja.javafx.smartcsv.validation.FieldConfiguration; -import ninja.javafx.smartcsv.validation.ValidationConfiguration; +import ninja.javafx.smartcsv.validation.configuration.ConstraintsConfiguration; +import ninja.javafx.smartcsv.validation.configuration.FieldConfiguration; +import ninja.javafx.smartcsv.validation.configuration.ValidationConfiguration; import org.fxmisc.richtext.CodeArea; import org.fxmisc.richtext.LineNumberFactory; import org.fxmisc.richtext.StyleSpans; @@ -50,9 +50,12 @@ import java.util.ResourceBundle; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static java.lang.Boolean.FALSE; import static java.util.Arrays.asList; import static java.util.stream.Collectors.joining; import static javafx.beans.binding.Bindings.when; +import static javafx.collections.FXCollections.observableList; +import static ninja.javafx.smartcsv.validation.configuration.FieldConfiguration.*; /** * controller for editing column validations @@ -102,6 +105,12 @@ public class ValidationEditorController extends FXMLController { @FXML private ComboBox typeComboBox; + @FXML + private ComboBox formatComboBox; + + @FXML + private TextField formatTextField; + @FXML private Spinner minLengthSpinner; @@ -147,27 +156,112 @@ public class ValidationEditorController extends FXMLController { @Override public void initialize(URL location, ResourceBundle resources) { - - typeComboBox.getItems().addAll(FieldConfiguration.Type.STRING, - FieldConfiguration.Type.INTEGER, - FieldConfiguration.Type.NUMBER, - FieldConfiguration.Type.DATE, - FieldConfiguration.Type.DATETIME, - FieldConfiguration.Type.TIME); - typeComboBox.setValue(FieldConfiguration.Type.STRING); - + initTypeAndFormatInput(); initMinMaxSpinner(); - initSpinner(minLengthSpinner, enableMinLengthRule); initSpinner(maxLengthSpinner, enableMaxLengthRule); initTextInputControl(regexpRuleTextField, enableRegexpRule); initTextInputControl(valueOfRuleTextField, enableValueOfRule); initCodeAreaControl(groovyRuleTextArea, enableGroovyRule); + } + public String getSelectedColumn() { + return selectedColumn.get(); + } - selectedColumn.addListener(observable -> { - updateForm(); - }); + public StringProperty selectedColumnProperty() { + return selectedColumn; + } + + public void setSelectedColumn(String selectedColumn) { + this.selectedColumn.set(selectedColumn); + } + + public void setValidationConfiguration(ValidationConfiguration validationConfiguration) { + this.validationConfiguration = validationConfiguration; + } + + private void initTypeAndFormatInput() { + typeComboBox.getItems().addAll(Type.STRING, + Type.INTEGER, + Type.NUMBER, + Type.DATE, + Type.DATETIME, + Type.TIME); + formatComboBox.setDisable(true); + formatTextField.setDisable(true); + typeComboBox.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> clearFormatComboBox()); + formatComboBox.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> clearFormatTextField()); + } + + private void updateFormatTextField() { + FieldConfiguration config = getCurrentFieldConfig(); + switch (config.getType()) { + case DATE: + case DATETIME: + case TIME: + if (config.getFormat().startsWith("fmt:")) { + formatTextField.setText(config.getFormat().substring(4)); + } else { + formatTextField.setText(config.getFormat()); + } + break; + default: + formatTextField.setText(null); + break; + } + } + + private void clearFormatTextField() { + FieldConfiguration config = getCurrentFieldConfig(); + formatTextField.setText(null); + switch (config.getType()) { + case DATE: + case DATETIME: + case TIME: + formatTextField.setDisable(false); + break; + default: + formatTextField.setDisable(true); + break; + } + } + + private void clearFormatComboBox() { + formatTextField.setText(null); + formatTextField.setDisable(true); + changeFormat(); + + if (!formatComboBox.isDisable()) { + formatComboBox.getSelectionModel().selectFirst(); + } else { + formatComboBox.getSelectionModel().clearSelection(); + } + } + + private void updateFormInput() { + FieldConfiguration config = getCurrentFieldConfig(); + if (!formatComboBox.isDisable()) { + if (config.getFormat() == null) { + formatComboBox.getSelectionModel().selectFirst(); + } else { + switch (config.getType()) { + case STRING: + case NUMBER: + formatComboBox.getSelectionModel().select(config.getFormat()); + break; + case DATE: + case DATETIME: + case TIME: + if (config.getFormat().startsWith("fmt:")) { + formatComboBox.getSelectionModel().select(DateFormat.FMT_PATTERN.toString()); + } else { + formatComboBox.getSelectionModel().select(DateFormat.ANY.toString()); + } + break; + } + } + } } private void initMinMaxSpinner() { @@ -188,94 +282,44 @@ public class ValidationEditorController extends FXMLController { } - public String getSelectedColumn() { - return selectedColumn.get(); - } - - public StringProperty selectedColumnProperty() { - return selectedColumn; - } - - public void setSelectedColumn(String selectedColumn) { - this.selectedColumn.set(selectedColumn); - } - - public void setValidationConfiguration(ValidationConfiguration validationConfiguration) { - this.validationConfiguration = validationConfiguration; - } - - private void changeFormatInput() { + private void changeFormat() { + formatComboBox.getItems().clear(); + formatComboBox.getSelectionModel().clearSelection(); switch (typeComboBox.getValue()) { case STRING: - /* - default: any valid string. - email: A valid email address. - uri: A valid URI. - binary: A base64 encoded string representing binary data. - uuid: A string that is a uuid - */ + updateFormatComboBox(getStringFormats()); break; case NUMBER: - /* - decimalChar: A string whose value is used to represent a decimal point within the number. The default value is ".". - groupChar: A string whose value is used to group digits within the number. The default value is null. A common value is "," e.g. "100,000". - currency - */ - break; + updateFormatComboBox(getNumberFormats()); + break; case DATE: - /* - default: An ISO8601 format string. - This MUST be in ISO8601 format YYYY-MM-DD - any: Any parsable representation of the type. The implementing library can attempt to parse the datetime via a range of strategies. - An example is dateutil.parser.parse from the python-dateutils library. - fmt:PATTERN: date/time values in this field conform to PATTERN where [PATTERN] follows the syntax of standard Python / C strptime. - */ - break; case DATETIME: - /* - default: An ISO8601 format string. - datetime: a date-time. This MUST be in ISO 8601 format of YYYY-MM-DDThhssZ in UTC time - any: Any parsable representation of the type. The implementing library can attempt to parse the datetime via a range of strategies. - An example is dateutil.parser.parse from the python-dateutils library. - fmt:PATTERN: date/time values in this field conform to PATTERN where [PATTERN] follows the syntax of standard Python / C strptime. - */ - break; case TIME: - /* - default: An ISO8601 format string. - time: a time without a date - any: Any parsable representation of the type. The implementing library can attempt to parse the datetime via a range of strategies. - An example is dateutil.parser.parse from the python-dateutils library. - fmt:PATTERN: date/time values in this field conform to PATTERN where [PATTERN] follows the syntax of standard Python / C strptime. - */ + updateFormatComboBox(getDateFormats()); break; -// case GEOPOINT: -// /* -// default: A string of the pattern "lon, lat", where lon is the longitude and lat is the latitude. -// array: An array of exactly two items, where each item is either a number, or a string parsable as a number, and the first item is lon and the second item is lat. -// object: A JSON object with exactly two keys, lat and lon -// */ -// break; -// case GEOJSON: -// /* -// default: A geojson object as per the GeoJSON spec. -// topojson: A topojson object as per the TopoJSON spec -// */ -// case DURATION: -// case OBJECT: -// case ARRAY: case INTEGER: default: // format: no options + formatComboBox.setDisable(true); + formatTextField.setDisable(true); + formatTextField.setText(null); break; } + updateFormInput(); } + private void updateFormatComboBox(List values) { + formatComboBox.getItems().setAll(observableList(values)); + formatComboBox.setEditable(false); + formatComboBox.setDisable(false); + formatTextField.setDisable(true); + formatTextField.setText(null); + } public void updateConfiguration() { - FieldConfiguration config = validationConfiguration.getFieldConfiguration(getSelectedColumn()); + FieldConfiguration config = getCurrentFieldConfig(); config.setType(typeComboBox.getValue()); if (enableGroovyRule.isSelected()) { @@ -289,9 +333,6 @@ public class ValidationEditorController extends FXMLController { constraints = new ConstraintsConfiguration(); } - - - if (enableNotEmptyRule.isSelected()) { constraints.setRequired(enableNotEmptyRule.isSelected()); } else { @@ -330,6 +371,10 @@ public class ValidationEditorController extends FXMLController { } + private FieldConfiguration getCurrentFieldConfig() { + return validationConfiguration.getFieldConfiguration(getSelectedColumn()); + } + private void addDependencyListener(CheckBox rule, CheckBox... dependentRules) { rule.selectedProperty().addListener((observable, oldValue, newValue) -> { if (newValue) { @@ -340,9 +385,9 @@ public class ValidationEditorController extends FXMLController { }); } - private void updateForm() { + public void updateForm() { - FieldConfiguration config = validationConfiguration.getFieldConfiguration(getSelectedColumn()); + FieldConfiguration config = getCurrentFieldConfig(); if (config.getType() != null) { typeComboBox.setValue(config.getType()); @@ -350,6 +395,9 @@ public class ValidationEditorController extends FXMLController { typeComboBox.setValue(FieldConfiguration.Type.STRING); } + updateFormInput(); + updateFormatTextField(); + updateCodeAreaControl( groovyRuleTextArea, config.getGroovy(), @@ -357,8 +405,8 @@ public class ValidationEditorController extends FXMLController { ); ConstraintsConfiguration constraints = config.getConstraints(); - updateCheckBox(constraints != null ? constraints.getRequired() : false, enableNotEmptyRule); - updateCheckBox(constraints != null ? constraints.getUnique() : false, enableUniqueRule); + updateCheckBox(constraints != null ? constraints.getRequired() : FALSE, enableNotEmptyRule); + updateCheckBox(constraints != null ? constraints.getUnique() : FALSE, enableUniqueRule); updateSpinner( minLengthSpinner, diff --git a/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileReader.java b/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileReader.java index c51e256..b81f1cc 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileReader.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileReader.java @@ -28,6 +28,7 @@ package ninja.javafx.smartcsv.validation; import com.google.gson.GsonBuilder; import ninja.javafx.smartcsv.FileReader; +import ninja.javafx.smartcsv.validation.configuration.ValidationConfiguration; import java.io.File; import java.io.IOException; @@ -42,7 +43,6 @@ public class ValidationFileReader implements FileReader @Override public void read(File file) throws IOException { config = new GsonBuilder().create().fromJson(new java.io.FileReader(file), ValidationConfiguration.class); - System.out.println("brechpunkt"); } public ValidationConfiguration getContent() { diff --git a/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileWriter.java b/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileWriter.java index 328fcb9..d6efea7 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileWriter.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileWriter.java @@ -29,6 +29,7 @@ package ninja.javafx.smartcsv.validation; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import ninja.javafx.smartcsv.FileWriter; +import ninja.javafx.smartcsv.validation.configuration.ValidationConfiguration; import java.io.File; import java.io.IOException; diff --git a/src/main/java/ninja/javafx/smartcsv/validation/Validator.java b/src/main/java/ninja/javafx/smartcsv/validation/Validator.java index dbca6c9..9f32adb 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/Validator.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/Validator.java @@ -27,13 +27,16 @@ package ninja.javafx.smartcsv.validation; import ninja.javafx.smartcsv.fx.table.model.ColumnValueProvider; +import ninja.javafx.smartcsv.validation.checker.*; +import ninja.javafx.smartcsv.validation.configuration.ConstraintsConfiguration; +import ninja.javafx.smartcsv.validation.configuration.FieldConfiguration; +import ninja.javafx.smartcsv.validation.configuration.ValidationConfiguration; import java.util.HashMap; import java.util.List; import java.util.Map; import static ninja.javafx.smartcsv.validation.ValidationFormatHelper.dateFormat; -import static ninja.javafx.smartcsv.validation.ValidationFormatHelper.doubleToInteger; /** * This class checks all the validations defined in the diff --git a/src/main/java/ninja/javafx/smartcsv/validation/DateValidation.java b/src/main/java/ninja/javafx/smartcsv/validation/checker/DateValidation.java similarity index 94% rename from src/main/java/ninja/javafx/smartcsv/validation/DateValidation.java rename to src/main/java/ninja/javafx/smartcsv/validation/checker/DateValidation.java index eae88e9..342c3e9 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/DateValidation.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/checker/DateValidation.java @@ -23,7 +23,9 @@ THE SOFTWARE. */ -package ninja.javafx.smartcsv.validation; +package ninja.javafx.smartcsv.validation.checker; + +import ninja.javafx.smartcsv.validation.ValidationError; import static org.apache.commons.validator.GenericValidator.isDate; diff --git a/src/main/java/ninja/javafx/smartcsv/validation/DoubleValidation.java b/src/main/java/ninja/javafx/smartcsv/validation/checker/DoubleValidation.java similarity index 93% rename from src/main/java/ninja/javafx/smartcsv/validation/DoubleValidation.java rename to src/main/java/ninja/javafx/smartcsv/validation/checker/DoubleValidation.java index 39864b9..13a879e 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/DoubleValidation.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/checker/DoubleValidation.java @@ -23,7 +23,9 @@ THE SOFTWARE. */ -package ninja.javafx.smartcsv.validation; +package ninja.javafx.smartcsv.validation.checker; + +import ninja.javafx.smartcsv.validation.ValidationError; import static org.apache.commons.validator.GenericValidator.isDouble; diff --git a/src/main/java/ninja/javafx/smartcsv/validation/EmptyValueIsValid.java b/src/main/java/ninja/javafx/smartcsv/validation/checker/EmptyValueIsValid.java similarity index 84% rename from src/main/java/ninja/javafx/smartcsv/validation/EmptyValueIsValid.java rename to src/main/java/ninja/javafx/smartcsv/validation/checker/EmptyValueIsValid.java index 3757a05..f7e0420 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/EmptyValueIsValid.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/checker/EmptyValueIsValid.java @@ -1,4 +1,4 @@ -package ninja.javafx.smartcsv.validation; +package ninja.javafx.smartcsv.validation.checker; /** * validations based on this are not validated when the value is null or empty diff --git a/src/main/java/ninja/javafx/smartcsv/validation/GroovyValidation.java b/src/main/java/ninja/javafx/smartcsv/validation/checker/GroovyValidation.java similarity index 96% rename from src/main/java/ninja/javafx/smartcsv/validation/GroovyValidation.java rename to src/main/java/ninja/javafx/smartcsv/validation/checker/GroovyValidation.java index f169f0a..f806f5d 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/GroovyValidation.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/checker/GroovyValidation.java @@ -23,11 +23,12 @@ THE SOFTWARE. */ -package ninja.javafx.smartcsv.validation; +package ninja.javafx.smartcsv.validation.checker; import groovy.lang.Binding; import groovy.lang.GroovyShell; import groovy.lang.Script; +import ninja.javafx.smartcsv.validation.ValidationError; import org.codehaus.groovy.control.CompilationFailedException; /** diff --git a/src/main/java/ninja/javafx/smartcsv/validation/IntegerValidation.java b/src/main/java/ninja/javafx/smartcsv/validation/checker/IntegerValidation.java similarity index 93% rename from src/main/java/ninja/javafx/smartcsv/validation/IntegerValidation.java rename to src/main/java/ninja/javafx/smartcsv/validation/checker/IntegerValidation.java index 83ef7f9..84f0aff 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/IntegerValidation.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/checker/IntegerValidation.java @@ -23,7 +23,9 @@ THE SOFTWARE. */ -package ninja.javafx.smartcsv.validation; +package ninja.javafx.smartcsv.validation.checker; + +import ninja.javafx.smartcsv.validation.ValidationError; import static org.apache.commons.validator.GenericValidator.isInt; diff --git a/src/main/java/ninja/javafx/smartcsv/validation/MaxLengthValidation.java b/src/main/java/ninja/javafx/smartcsv/validation/checker/MaxLengthValidation.java similarity index 94% rename from src/main/java/ninja/javafx/smartcsv/validation/MaxLengthValidation.java rename to src/main/java/ninja/javafx/smartcsv/validation/checker/MaxLengthValidation.java index 8e97eb3..32924e2 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/MaxLengthValidation.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/checker/MaxLengthValidation.java @@ -23,7 +23,9 @@ THE SOFTWARE. */ -package ninja.javafx.smartcsv.validation; +package ninja.javafx.smartcsv.validation.checker; + +import ninja.javafx.smartcsv.validation.ValidationError; import static org.apache.commons.validator.GenericValidator.maxLength; diff --git a/src/main/java/ninja/javafx/smartcsv/validation/MinLengthValidation.java b/src/main/java/ninja/javafx/smartcsv/validation/checker/MinLengthValidation.java similarity index 94% rename from src/main/java/ninja/javafx/smartcsv/validation/MinLengthValidation.java rename to src/main/java/ninja/javafx/smartcsv/validation/checker/MinLengthValidation.java index 2cbf4b0..dde032f 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/MinLengthValidation.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/checker/MinLengthValidation.java @@ -23,7 +23,9 @@ THE SOFTWARE. */ -package ninja.javafx.smartcsv.validation; +package ninja.javafx.smartcsv.validation.checker; + +import ninja.javafx.smartcsv.validation.ValidationError; import static org.apache.commons.validator.GenericValidator.minLength; diff --git a/src/main/java/ninja/javafx/smartcsv/validation/NotEmptyValidation.java b/src/main/java/ninja/javafx/smartcsv/validation/checker/NotEmptyValidation.java similarity index 94% rename from src/main/java/ninja/javafx/smartcsv/validation/NotEmptyValidation.java rename to src/main/java/ninja/javafx/smartcsv/validation/checker/NotEmptyValidation.java index 809fbb2..c17aa87 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/NotEmptyValidation.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/checker/NotEmptyValidation.java @@ -23,7 +23,9 @@ THE SOFTWARE. */ -package ninja.javafx.smartcsv.validation; +package ninja.javafx.smartcsv.validation.checker; + +import ninja.javafx.smartcsv.validation.ValidationError; import static org.apache.commons.validator.GenericValidator.isBlankOrNull; diff --git a/src/main/java/ninja/javafx/smartcsv/validation/RegExpValidation.java b/src/main/java/ninja/javafx/smartcsv/validation/checker/RegExpValidation.java similarity index 94% rename from src/main/java/ninja/javafx/smartcsv/validation/RegExpValidation.java rename to src/main/java/ninja/javafx/smartcsv/validation/checker/RegExpValidation.java index aa9bb27..0557708 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/RegExpValidation.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/checker/RegExpValidation.java @@ -23,7 +23,9 @@ THE SOFTWARE. */ -package ninja.javafx.smartcsv.validation; +package ninja.javafx.smartcsv.validation.checker; + +import ninja.javafx.smartcsv.validation.ValidationError; import static org.apache.commons.validator.GenericValidator.matchRegexp; diff --git a/src/main/java/ninja/javafx/smartcsv/validation/UniqueValidation.java b/src/main/java/ninja/javafx/smartcsv/validation/checker/UniqueValidation.java similarity index 96% rename from src/main/java/ninja/javafx/smartcsv/validation/UniqueValidation.java rename to src/main/java/ninja/javafx/smartcsv/validation/checker/UniqueValidation.java index 3a62d19..5af91a6 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/UniqueValidation.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/checker/UniqueValidation.java @@ -23,9 +23,10 @@ THE SOFTWARE. */ -package ninja.javafx.smartcsv.validation; +package ninja.javafx.smartcsv.validation.checker; import ninja.javafx.smartcsv.fx.table.model.ColumnValueProvider; +import ninja.javafx.smartcsv.validation.ValidationError; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/ninja/javafx/smartcsv/validation/Validation.java b/src/main/java/ninja/javafx/smartcsv/validation/checker/Validation.java similarity index 93% rename from src/main/java/ninja/javafx/smartcsv/validation/Validation.java rename to src/main/java/ninja/javafx/smartcsv/validation/checker/Validation.java index 957d3bb..a37fddf 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/Validation.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/checker/Validation.java @@ -23,7 +23,9 @@ THE SOFTWARE. */ -package ninja.javafx.smartcsv.validation; +package ninja.javafx.smartcsv.validation.checker; + +import ninja.javafx.smartcsv.validation.ValidationError; /** * Interface for all validations diff --git a/src/main/java/ninja/javafx/smartcsv/validation/ValueOfValidation.java b/src/main/java/ninja/javafx/smartcsv/validation/checker/ValueOfValidation.java similarity index 94% rename from src/main/java/ninja/javafx/smartcsv/validation/ValueOfValidation.java rename to src/main/java/ninja/javafx/smartcsv/validation/checker/ValueOfValidation.java index cf5edb4..80a88ec 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/ValueOfValidation.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/checker/ValueOfValidation.java @@ -23,7 +23,9 @@ THE SOFTWARE. */ -package ninja.javafx.smartcsv.validation; +package ninja.javafx.smartcsv.validation.checker; + +import ninja.javafx.smartcsv.validation.ValidationError; import java.util.List; diff --git a/src/main/java/ninja/javafx/smartcsv/validation/ConstraintsConfiguration.java b/src/main/java/ninja/javafx/smartcsv/validation/configuration/ConstraintsConfiguration.java similarity index 95% rename from src/main/java/ninja/javafx/smartcsv/validation/ConstraintsConfiguration.java rename to src/main/java/ninja/javafx/smartcsv/validation/configuration/ConstraintsConfiguration.java index be6e7cb..0007ba7 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/ConstraintsConfiguration.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/configuration/ConstraintsConfiguration.java @@ -1,4 +1,4 @@ -package ninja.javafx.smartcsv.validation; +package ninja.javafx.smartcsv.validation.configuration; import com.google.gson.annotations.SerializedName; diff --git a/src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java b/src/main/java/ninja/javafx/smartcsv/validation/configuration/FieldConfiguration.java similarity index 61% rename from src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java rename to src/main/java/ninja/javafx/smartcsv/validation/configuration/FieldConfiguration.java index 521133f..3ebedff 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/FieldConfiguration.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/configuration/FieldConfiguration.java @@ -1,7 +1,11 @@ -package ninja.javafx.smartcsv.validation; +package ninja.javafx.smartcsv.validation.configuration; import com.google.gson.annotations.SerializedName; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + /** * @author abi */ @@ -22,6 +26,45 @@ public class FieldConfiguration { // @SerializedName("geojson") GEOJSON } + public enum StringFormat { + @SerializedName("default") DEFAULT, + @SerializedName("email") EMAIL, + @SerializedName("uri") URI, + @SerializedName("binary") BINARY, + @SerializedName("uuid") UUID + } + + public static List getStringFormats() { + return Stream.of(StringFormat.values()) + .map(StringFormat::name) + .collect(Collectors.toList()); + } + + public enum NumberFormat { + @SerializedName("decimalChar") DECIMAL_CHAR, + @SerializedName("groupChar") GROUP_CHAR, + @SerializedName("currency") CURRENCY + } + + public static List getNumberFormats() { + return Stream.of(NumberFormat.values()) + .map(NumberFormat::name) + .collect(Collectors.toList()); + } + + + public enum DateFormat { + @SerializedName("default") DEFAULT, + @SerializedName("any") ANY, + @SerializedName("fmtPattern") FMT_PATTERN + } + + public static List getDateFormats() { + return Stream.of(DateFormat.values()) + .map(DateFormat::name) + .collect(Collectors.toList()); + } + private String name; private String title; private Type type; diff --git a/src/main/java/ninja/javafx/smartcsv/validation/ValidationConfiguration.java b/src/main/java/ninja/javafx/smartcsv/validation/configuration/ValidationConfiguration.java similarity index 98% rename from src/main/java/ninja/javafx/smartcsv/validation/ValidationConfiguration.java rename to src/main/java/ninja/javafx/smartcsv/validation/configuration/ValidationConfiguration.java index 08dc1b6..31895c6 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/ValidationConfiguration.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/configuration/ValidationConfiguration.java @@ -24,7 +24,7 @@ */ -package ninja.javafx.smartcsv.validation; +package ninja.javafx.smartcsv.validation.configuration; import com.google.gson.annotations.SerializedName; diff --git a/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml b/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml index 9699436..b8fa926 100644 --- a/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml +++ b/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml @@ -13,65 +13,57 @@ - + - - - - + + + + - - - - - - - - - + + + + + + + + + - - + - + diff --git a/src/test/java/ninja/javafx/smartcsv/validation/HeaderValidationTest.java b/src/test/java/ninja/javafx/smartcsv/validation/HeaderValidationTest.java index 7a0c673..7d42588 100644 --- a/src/test/java/ninja/javafx/smartcsv/validation/HeaderValidationTest.java +++ b/src/test/java/ninja/javafx/smartcsv/validation/HeaderValidationTest.java @@ -28,6 +28,7 @@ package ninja.javafx.smartcsv.validation; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import ninja.javafx.smartcsv.validation.configuration.ValidationConfiguration; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/src/test/java/ninja/javafx/smartcsv/validation/ValidatorTest.java b/src/test/java/ninja/javafx/smartcsv/validation/ValidatorTest.java index 0a833f6..521c3d4 100644 --- a/src/test/java/ninja/javafx/smartcsv/validation/ValidatorTest.java +++ b/src/test/java/ninja/javafx/smartcsv/validation/ValidatorTest.java @@ -2,6 +2,7 @@ package ninja.javafx.smartcsv.validation; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import ninja.javafx.smartcsv.validation.configuration.ValidationConfiguration; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; From 4354afdf1d10cb13999c23bd5090001a454c0b85 Mon Sep 17 00:00:00 2001 From: Andreas Billmann Date: Mon, 12 Sep 2016 05:02:43 +0200 Subject: [PATCH 08/14] handle defaults --- .../ValidationEditorController.java | 4 +-- .../validation/ValidationFileReader.java | 25 +++++++++++++++++++ .../configuration/FieldConfiguration.java | 13 ---------- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java b/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java index 2df9405..9842395 100644 --- a/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java +++ b/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java @@ -289,15 +289,13 @@ public class ValidationEditorController extends FXMLController { case STRING: updateFormatComboBox(getStringFormats()); break; - case NUMBER: - updateFormatComboBox(getNumberFormats()); - break; case DATE: case DATETIME: case TIME: updateFormatComboBox(getDateFormats()); break; case INTEGER: + case NUMBER: default: // format: no options formatComboBox.setDisable(true); diff --git a/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileReader.java b/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileReader.java index b81f1cc..0f735e1 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileReader.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileReader.java @@ -28,6 +28,7 @@ package ninja.javafx.smartcsv.validation; import com.google.gson.GsonBuilder; import ninja.javafx.smartcsv.FileReader; +import ninja.javafx.smartcsv.validation.configuration.FieldConfiguration; import ninja.javafx.smartcsv.validation.configuration.ValidationConfiguration; import java.io.File; @@ -43,6 +44,30 @@ public class ValidationFileReader implements FileReader @Override public void read(File file) throws IOException { config = new GsonBuilder().create().fromJson(new java.io.FileReader(file), ValidationConfiguration.class); + setDefaults(); + } + + private void setDefaults() { + for (FieldConfiguration fieldConfiguration: config.getFieldConfigurations()) { + if (fieldConfiguration.getType() == null) { + fieldConfiguration.setType(FieldConfiguration.Type.STRING); + } + if (fieldConfiguration.getType() == FieldConfiguration.Type.DATE) { + if (fieldConfiguration.getFormat() == null) { + fieldConfiguration.setFormat("yyyy-MM-dd"); + } + } + if (fieldConfiguration.getType() == FieldConfiguration.Type.DATETIME) { + if (fieldConfiguration.getFormat() == null) { + fieldConfiguration.setFormat("yyyy-MM-ddThh:mm:ssZ"); + } + } + if (fieldConfiguration.getType() == FieldConfiguration.Type.TIME) { + if (fieldConfiguration.getFormat() == null) { + fieldConfiguration.setFormat("hh:mm:ss"); + } + } + } } public ValidationConfiguration getContent() { diff --git a/src/main/java/ninja/javafx/smartcsv/validation/configuration/FieldConfiguration.java b/src/main/java/ninja/javafx/smartcsv/validation/configuration/FieldConfiguration.java index 3ebedff..7801788 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/configuration/FieldConfiguration.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/configuration/FieldConfiguration.java @@ -40,19 +40,6 @@ public class FieldConfiguration { .collect(Collectors.toList()); } - public enum NumberFormat { - @SerializedName("decimalChar") DECIMAL_CHAR, - @SerializedName("groupChar") GROUP_CHAR, - @SerializedName("currency") CURRENCY - } - - public static List getNumberFormats() { - return Stream.of(NumberFormat.values()) - .map(NumberFormat::name) - .collect(Collectors.toList()); - } - - public enum DateFormat { @SerializedName("default") DEFAULT, @SerializedName("any") ANY, From 70855e614af5e4688e4c471a06b2e401eb584b97 Mon Sep 17 00:00:00 2001 From: Andreas Billmann Date: Sun, 18 Sep 2016 14:17:39 +0200 Subject: [PATCH 09/14] the editor can handle the support subset of JSON Table Schema --- .../StringFormatEditorCellFactory.java | 61 +++++++ .../StringFormatStringConverter.java | 54 +++++++ .../ValidationEditorController.java | 153 +++++++----------- .../validation/ValidationFileReader.java | 28 ++-- .../javafx/smartcsv/validation/Validator.java | 23 +-- .../validation/configuration/Constraints.java | 96 +++++++++++ .../ConstraintsConfiguration.java | 69 -------- .../validation/configuration/Field.java | 109 +++++++++++++ .../configuration/FieldConfiguration.java | 129 --------------- .../configuration/StringFormat.java | 58 +++++++ .../validation/configuration/Type.java | 48 ++++++ .../ValidationConfiguration.java | 33 ++-- .../javafx/smartcsv/fx/smartcsv.properties | 8 +- .../javafx/smartcsv/fx/smartcsv_de.properties | 8 +- .../fx/validation/validationEditor.fxml | 4 +- 15 files changed, 547 insertions(+), 334 deletions(-) create mode 100644 src/main/java/ninja/javafx/smartcsv/fx/validation/StringFormatEditorCellFactory.java create mode 100644 src/main/java/ninja/javafx/smartcsv/fx/validation/StringFormatStringConverter.java create mode 100644 src/main/java/ninja/javafx/smartcsv/validation/configuration/Constraints.java delete mode 100644 src/main/java/ninja/javafx/smartcsv/validation/configuration/ConstraintsConfiguration.java create mode 100644 src/main/java/ninja/javafx/smartcsv/validation/configuration/Field.java delete mode 100644 src/main/java/ninja/javafx/smartcsv/validation/configuration/FieldConfiguration.java create mode 100644 src/main/java/ninja/javafx/smartcsv/validation/configuration/StringFormat.java create mode 100644 src/main/java/ninja/javafx/smartcsv/validation/configuration/Type.java diff --git a/src/main/java/ninja/javafx/smartcsv/fx/validation/StringFormatEditorCellFactory.java b/src/main/java/ninja/javafx/smartcsv/fx/validation/StringFormatEditorCellFactory.java new file mode 100644 index 0000000..1d10e14 --- /dev/null +++ b/src/main/java/ninja/javafx/smartcsv/fx/validation/StringFormatEditorCellFactory.java @@ -0,0 +1,61 @@ +/* + The MIT License (MIT) + ----------------------------------------------------------------------------- + + Copyright (c) 2015 javafx.ninja + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +package ninja.javafx.smartcsv.fx.validation; + +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.util.Callback; +import ninja.javafx.smartcsv.validation.configuration.StringFormat; + +import java.util.ResourceBundle; + +/** + * cell factory for string formats + */ +public class StringFormatEditorCellFactory implements Callback, ListCell> { + + private ResourceBundle resourceBundle; + + public StringFormatEditorCellFactory(ResourceBundle resourceBundle) { + this.resourceBundle = resourceBundle; + } + + @Override + public ListCell call(ListView param) { + return new ListCell(){ + @Override + protected void updateItem(StringFormat item, boolean empty) { + super.updateItem(item, empty); + if (item == null || empty) { + setGraphic(null); + } else { + setText(resourceBundle.getString("format.type."+item)); + } + } + } ; + } +} diff --git a/src/main/java/ninja/javafx/smartcsv/fx/validation/StringFormatStringConverter.java b/src/main/java/ninja/javafx/smartcsv/fx/validation/StringFormatStringConverter.java new file mode 100644 index 0000000..87adf94 --- /dev/null +++ b/src/main/java/ninja/javafx/smartcsv/fx/validation/StringFormatStringConverter.java @@ -0,0 +1,54 @@ +/* + The MIT License (MIT) + ----------------------------------------------------------------------------- + + Copyright (c) 2015 javafx.ninja + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +package ninja.javafx.smartcsv.fx.validation; + +import javafx.util.StringConverter; +import ninja.javafx.smartcsv.validation.configuration.StringFormat; + +import java.util.ResourceBundle; + +/** + * converter for string formats + */ +public class StringFormatStringConverter extends StringConverter { + + private ResourceBundle resourceBundle; + + public StringFormatStringConverter(ResourceBundle resourceBundle) { + this.resourceBundle = resourceBundle; + } + + @Override + public String toString(StringFormat item) { + return resourceBundle.getString("format.type."+item); + } + + @Override + public StringFormat fromString(String string) { + return StringFormat.fromExternalValue(string); + } +} diff --git a/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java b/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java index 9842395..4a7fec9 100644 --- a/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java +++ b/src/main/java/ninja/javafx/smartcsv/fx/validation/ValidationEditorController.java @@ -32,9 +32,7 @@ import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory; import ninja.javafx.smartcsv.fx.FXMLController; -import ninja.javafx.smartcsv.validation.configuration.ConstraintsConfiguration; -import ninja.javafx.smartcsv.validation.configuration.FieldConfiguration; -import ninja.javafx.smartcsv.validation.configuration.ValidationConfiguration; +import ninja.javafx.smartcsv.validation.configuration.*; import org.fxmisc.richtext.CodeArea; import org.fxmisc.richtext.LineNumberFactory; import org.fxmisc.richtext.StyleSpans; @@ -54,8 +52,7 @@ import static java.lang.Boolean.FALSE; import static java.util.Arrays.asList; import static java.util.stream.Collectors.joining; import static javafx.beans.binding.Bindings.when; -import static javafx.collections.FXCollections.observableList; -import static ninja.javafx.smartcsv.validation.configuration.FieldConfiguration.*; +import static ninja.javafx.smartcsv.validation.configuration.Type.STRING; /** * controller for editing column validations @@ -103,10 +100,10 @@ public class ValidationEditorController extends FXMLController { ); @FXML - private ComboBox typeComboBox; + private ComboBox typeComboBox; @FXML - private ComboBox formatComboBox; + private ComboBox formatComboBox; @FXML private TextField formatTextField; @@ -156,7 +153,7 @@ public class ValidationEditorController extends FXMLController { @Override public void initialize(URL location, ResourceBundle resources) { - initTypeAndFormatInput(); + initTypeAndFormatInput(resources); initMinMaxSpinner(); initSpinner(minLengthSpinner, enableMinLengthRule); initSpinner(maxLengthSpinner, enableMaxLengthRule); @@ -181,89 +178,52 @@ public class ValidationEditorController extends FXMLController { this.validationConfiguration = validationConfiguration; } - private void initTypeAndFormatInput() { - typeComboBox.getItems().addAll(Type.STRING, + private void initTypeAndFormatInput(ResourceBundle resources) { + typeComboBox.getItems().addAll(STRING, Type.INTEGER, Type.NUMBER, Type.DATE, Type.DATETIME, Type.TIME); - formatComboBox.setDisable(true); - formatTextField.setDisable(true); - typeComboBox.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> clearFormatComboBox()); - formatComboBox.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> clearFormatTextField()); + formatComboBox.setCellFactory(new StringFormatEditorCellFactory(resources)); + formatComboBox.setConverter(new StringFormatStringConverter(resources)); + formatComboBox.getItems().addAll( + StringFormat.DEFAULT, + StringFormat.EMAIL, + StringFormat.URI, + StringFormat.BINARY, + StringFormat.UUID + ); + typeComboBox.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> changeFormat()); } private void updateFormatTextField() { - FieldConfiguration config = getCurrentFieldConfig(); - switch (config.getType()) { + switch (typeComboBox.getValue()) { case DATE: case DATETIME: case TIME: - if (config.getFormat().startsWith("fmt:")) { - formatTextField.setText(config.getFormat().substring(4)); - } else { - formatTextField.setText(config.getFormat()); - } + formatTextField.setVisible(true); + formatTextField.setText(getCurrentFieldConfig().getFormat()); break; default: + formatTextField.setVisible(false); formatTextField.setText(null); break; } } - private void clearFormatTextField() { - FieldConfiguration config = getCurrentFieldConfig(); - formatTextField.setText(null); - switch (config.getType()) { - case DATE: - case DATETIME: - case TIME: - formatTextField.setDisable(false); + private void updateFormatComboBox() { + switch (typeComboBox.getValue()) { + case STRING: + formatComboBox.setVisible(true); + formatComboBox.getSelectionModel().select(StringFormat.fromExternalValue(getCurrentFieldConfig().getFormat())); break; default: - formatTextField.setDisable(true); + formatComboBox.setVisible(false); break; } } - private void clearFormatComboBox() { - formatTextField.setText(null); - formatTextField.setDisable(true); - changeFormat(); - - if (!formatComboBox.isDisable()) { - formatComboBox.getSelectionModel().selectFirst(); - } else { - formatComboBox.getSelectionModel().clearSelection(); - } - } - - private void updateFormInput() { - FieldConfiguration config = getCurrentFieldConfig(); - if (!formatComboBox.isDisable()) { - if (config.getFormat() == null) { - formatComboBox.getSelectionModel().selectFirst(); - } else { - switch (config.getType()) { - case STRING: - case NUMBER: - formatComboBox.getSelectionModel().select(config.getFormat()); - break; - case DATE: - case DATETIME: - case TIME: - if (config.getFormat().startsWith("fmt:")) { - formatComboBox.getSelectionModel().select(DateFormat.FMT_PATTERN.toString()); - } else { - formatComboBox.getSelectionModel().select(DateFormat.ANY.toString()); - } - break; - } - } - } - } - private void initMinMaxSpinner() { IntegerSpinnerValueFactory minValueFactory = new IntegerSpinnerValueFactory(0, Integer.MAX_VALUE, 0); minLengthSpinner.setValueFactory(minValueFactory); @@ -283,52 +243,61 @@ public class ValidationEditorController extends FXMLController { private void changeFormat() { - formatComboBox.getItems().clear(); - formatComboBox.getSelectionModel().clearSelection(); switch (typeComboBox.getValue()) { case STRING: - updateFormatComboBox(getStringFormats()); + updateFormatComboBox(); break; case DATE: case DATETIME: case TIME: - updateFormatComboBox(getDateFormats()); + updateFormatTextField(); break; case INTEGER: case NUMBER: default: // format: no options - formatComboBox.setDisable(true); - formatTextField.setDisable(true); - formatTextField.setText(null); + formatComboBox.setVisible(false); + formatTextField.setVisible(false); break; } - updateFormInput(); } - private void updateFormatComboBox(List values) { - formatComboBox.getItems().setAll(observableList(values)); - formatComboBox.setEditable(false); - formatComboBox.setDisable(false); - formatTextField.setDisable(true); - formatTextField.setText(null); - } - - public void updateConfiguration() { - FieldConfiguration config = getCurrentFieldConfig(); + Field config = getCurrentFieldConfig(); config.setType(typeComboBox.getValue()); + switch (typeComboBox.getValue()) { + case STRING: + config.setFormat(formatComboBox.getValue().getExternalValue()); + break; + case DATE: + case DATETIME: + case TIME: + if (formatTextField.getText().trim().isEmpty()) { + config.setFormat(null); + } else { + // TODO: validate input + config.setFormat(formatTextField.getText()); + } + break; + case INTEGER: + case NUMBER: + default: + // format: no options + config.setFormat(null); + break; + } + if (enableGroovyRule.isSelected()) { config.setGroovy(groovyRuleTextArea.getText()); } else { config.setGroovy(null); } - ConstraintsConfiguration constraints = config.getConstraints(); + Constraints constraints = config.getConstraints(); if (constraints == null) { - constraints = new ConstraintsConfiguration(); + constraints = new Constraints(); } if (enableNotEmptyRule.isSelected()) { @@ -369,7 +338,7 @@ public class ValidationEditorController extends FXMLController { } - private FieldConfiguration getCurrentFieldConfig() { + private Field getCurrentFieldConfig() { return validationConfiguration.getFieldConfiguration(getSelectedColumn()); } @@ -385,15 +354,15 @@ public class ValidationEditorController extends FXMLController { public void updateForm() { - FieldConfiguration config = getCurrentFieldConfig(); + Field config = getCurrentFieldConfig(); if (config.getType() != null) { typeComboBox.setValue(config.getType()); } else { - typeComboBox.setValue(FieldConfiguration.Type.STRING); + typeComboBox.setValue(STRING); } - updateFormInput(); + updateFormatComboBox(); updateFormatTextField(); updateCodeAreaControl( @@ -402,7 +371,7 @@ public class ValidationEditorController extends FXMLController { enableGroovyRule ); - ConstraintsConfiguration constraints = config.getConstraints(); + Constraints constraints = config.getConstraints(); updateCheckBox(constraints != null ? constraints.getRequired() : FALSE, enableNotEmptyRule); updateCheckBox(constraints != null ? constraints.getUnique() : FALSE, enableUniqueRule); diff --git a/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileReader.java b/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileReader.java index 0f735e1..aec5815 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileReader.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/ValidationFileReader.java @@ -28,12 +28,14 @@ package ninja.javafx.smartcsv.validation; import com.google.gson.GsonBuilder; import ninja.javafx.smartcsv.FileReader; -import ninja.javafx.smartcsv.validation.configuration.FieldConfiguration; +import ninja.javafx.smartcsv.validation.configuration.Field; import ninja.javafx.smartcsv.validation.configuration.ValidationConfiguration; import java.io.File; import java.io.IOException; +import static ninja.javafx.smartcsv.validation.configuration.Type.*; + /** * This class loads the constraints as json config */ @@ -48,23 +50,23 @@ public class ValidationFileReader implements FileReader } private void setDefaults() { - for (FieldConfiguration fieldConfiguration: config.getFieldConfigurations()) { - if (fieldConfiguration.getType() == null) { - fieldConfiguration.setType(FieldConfiguration.Type.STRING); + for (Field field : config.getFields()) { + if (field.getType() == null) { + field.setType(STRING); } - if (fieldConfiguration.getType() == FieldConfiguration.Type.DATE) { - if (fieldConfiguration.getFormat() == null) { - fieldConfiguration.setFormat("yyyy-MM-dd"); + if (field.getType() == DATE) { + if (field.getFormat() == null) { + field.setFormat("yyyy-MM-dd"); } } - if (fieldConfiguration.getType() == FieldConfiguration.Type.DATETIME) { - if (fieldConfiguration.getFormat() == null) { - fieldConfiguration.setFormat("yyyy-MM-ddThh:mm:ssZ"); + if (field.getType() == DATETIME) { + if (field.getFormat() == null) { + field.setFormat("yyyy-MM-ddThh:mm:ssZ"); } } - if (fieldConfiguration.getType() == FieldConfiguration.Type.TIME) { - if (fieldConfiguration.getFormat() == null) { - fieldConfiguration.setFormat("hh:mm:ss"); + if (field.getType() == TIME) { + if (field.getFormat() == null) { + field.setFormat("hh:mm:ss"); } } } diff --git a/src/main/java/ninja/javafx/smartcsv/validation/Validator.java b/src/main/java/ninja/javafx/smartcsv/validation/Validator.java index 9f32adb..b182442 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/Validator.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/Validator.java @@ -28,8 +28,8 @@ package ninja.javafx.smartcsv.validation; import ninja.javafx.smartcsv.fx.table.model.ColumnValueProvider; import ninja.javafx.smartcsv.validation.checker.*; -import ninja.javafx.smartcsv.validation.configuration.ConstraintsConfiguration; -import ninja.javafx.smartcsv.validation.configuration.FieldConfiguration; +import ninja.javafx.smartcsv.validation.configuration.Constraints; +import ninja.javafx.smartcsv.validation.configuration.Field; import ninja.javafx.smartcsv.validation.configuration.ValidationConfiguration; import java.util.HashMap; @@ -37,6 +37,7 @@ import java.util.List; import java.util.Map; import static ninja.javafx.smartcsv.validation.ValidationFormatHelper.dateFormat; +import static ninja.javafx.smartcsv.validation.configuration.Type.*; /** * This class checks all the validations defined in the @@ -140,7 +141,7 @@ public class Validator { private void initColumnValidations() { if (hasConfig()) { - for (FieldConfiguration column : validationConfig.getFieldConfigurations()) { + for (Field column : validationConfig.getFields()) { initializeColumnWithRules(column); } } @@ -148,7 +149,7 @@ public class Validator { private void initializeColumnWithRules(String columnName) { if (hasConfig()) { - for (FieldConfiguration column : validationConfig.getFieldConfigurations()) { + for (Field column : validationConfig.getFields()) { if (column.getName().equals(columnName)) { initializeColumnWithRules(column); break; @@ -158,28 +159,28 @@ public class Validator { } - private void initializeColumnWithRules(FieldConfiguration column) { + private void initializeColumnWithRules(Field column) { if (column.getType() != null) { - if (column.getType() == FieldConfiguration.Type.NUMBER) { + if (column.getType() == NUMBER) { add(column.getName(), new DoubleValidation()); } - if (column.getType() == FieldConfiguration.Type.INTEGER) { + if (column.getType() == INTEGER) { add(column.getName(), new IntegerValidation()); } - if (column.getType() == FieldConfiguration.Type.DATE) { + if (column.getType() == DATE) { String format = dateFormat(column.getFormat(), "YYYY-MM-DD"); add(column.getName(), new DateValidation(format)); } - if (column.getType() == FieldConfiguration.Type.DATETIME) { + if (column.getType() == DATETIME) { String format = dateFormat(column.getFormat(), "YYYY-MM-DDThh:mm:ssZ"); add(column.getName(), new DateValidation(format)); } - if (column.getType() == FieldConfiguration.Type.TIME) { + if (column.getType() == TIME) { String format = dateFormat(column.getFormat(), "hh:mm:ss"); add(column.getName(), new DateValidation(format)); } @@ -190,7 +191,7 @@ public class Validator { add(column.getName(), new GroovyValidation(groovy)); } - ConstraintsConfiguration constraints = column.getConstraints(); + Constraints constraints = column.getConstraints(); if (constraints != null) { Boolean notEmptyRule = constraints.getRequired(); if (notEmptyRule != null && notEmptyRule) { diff --git a/src/main/java/ninja/javafx/smartcsv/validation/configuration/Constraints.java b/src/main/java/ninja/javafx/smartcsv/validation/configuration/Constraints.java new file mode 100644 index 0000000..fa533a5 --- /dev/null +++ b/src/main/java/ninja/javafx/smartcsv/validation/configuration/Constraints.java @@ -0,0 +1,96 @@ +/* + The MIT License (MIT) + ----------------------------------------------------------------------------- + + Copyright (c) 2015 javafx.ninja + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +package ninja.javafx.smartcsv.validation.configuration; + +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +/** + * contraints defined in JSON Table Schema + * @see JSON Table Schema + */ +public class Constraints { + private Boolean required; + private Boolean unique; + private Integer minLength; + private Integer maxLength; + + private String pattern; + + @SerializedName("enum") + private List enumeration; + + public Boolean getRequired() { + return required; + } + + public void setRequired(Boolean required) { + this.required = required; + } + + public Boolean getUnique() { + return unique; + } + + public void setUnique(Boolean unique) { + this.unique = unique; + } + + public Integer getMinLength() { + return minLength; + } + + public void setMinLength(Integer minLength) { + this.minLength = minLength; + } + + public Integer getMaxLength() { + return maxLength; + } + + public void setMaxLength(Integer maxLength) { + this.maxLength = maxLength; + } + + public String getPattern() { + return pattern; + } + + public void setPattern(String pattern) { + this.pattern = pattern; + } + + public List getEnumeration() { + return enumeration; + } + + public void setEnumeration(List enumeration) { + this.enumeration = enumeration; + } + +} diff --git a/src/main/java/ninja/javafx/smartcsv/validation/configuration/ConstraintsConfiguration.java b/src/main/java/ninja/javafx/smartcsv/validation/configuration/ConstraintsConfiguration.java deleted file mode 100644 index 0007ba7..0000000 --- a/src/main/java/ninja/javafx/smartcsv/validation/configuration/ConstraintsConfiguration.java +++ /dev/null @@ -1,69 +0,0 @@ -package ninja.javafx.smartcsv.validation.configuration; - -import com.google.gson.annotations.SerializedName; - -import java.util.List; - -/** - * Created by PC on 04.09.2016. - */ -public class ConstraintsConfiguration { - private Boolean required; - private Boolean unique; - private Integer minLength; - private Integer maxLength; - - private String pattern; - - @SerializedName("enum") - private List enumeration; - - public Boolean getRequired() { - return required; - } - - public void setRequired(Boolean required) { - this.required = required; - } - - public Boolean getUnique() { - return unique; - } - - public void setUnique(Boolean unique) { - this.unique = unique; - } - - public Integer getMinLength() { - return minLength; - } - - public void setMinLength(Integer minLength) { - this.minLength = minLength; - } - - public Integer getMaxLength() { - return maxLength; - } - - public void setMaxLength(Integer maxLength) { - this.maxLength = maxLength; - } - - public String getPattern() { - return pattern; - } - - public void setPattern(String pattern) { - this.pattern = pattern; - } - - public List getEnumeration() { - return enumeration; - } - - public void setEnumeration(List enumeration) { - this.enumeration = enumeration; - } - -} diff --git a/src/main/java/ninja/javafx/smartcsv/validation/configuration/Field.java b/src/main/java/ninja/javafx/smartcsv/validation/configuration/Field.java new file mode 100644 index 0000000..811ab29 --- /dev/null +++ b/src/main/java/ninja/javafx/smartcsv/validation/configuration/Field.java @@ -0,0 +1,109 @@ +/* + The MIT License (MIT) + ----------------------------------------------------------------------------- + + Copyright (c) 2015 javafx.ninja + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +package ninja.javafx.smartcsv.validation.configuration; + +/** + * this class represents a field in the configuration + * @see JSON Table Schema + */ +public class Field { + + private String name; + private String title; + private Type type; + private String description; + private String format; + private Object missingValue; + private Constraints constraints; + private String groovy; + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public Object getMissingValue() { + return missingValue; + } + + public void setMissingValue(Object missingValue) { + this.missingValue = missingValue; + } + + public Constraints getConstraints() { + return constraints; + } + + public void setConstraints(Constraints constraints) { + this.constraints = constraints; + } + + public String getGroovy() { + return groovy; + } + + public void setGroovy(String groovy) { + this.groovy = groovy; + } + +} diff --git a/src/main/java/ninja/javafx/smartcsv/validation/configuration/FieldConfiguration.java b/src/main/java/ninja/javafx/smartcsv/validation/configuration/FieldConfiguration.java deleted file mode 100644 index 7801788..0000000 --- a/src/main/java/ninja/javafx/smartcsv/validation/configuration/FieldConfiguration.java +++ /dev/null @@ -1,129 +0,0 @@ -package ninja.javafx.smartcsv.validation.configuration; - -import com.google.gson.annotations.SerializedName; - -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * @author abi - */ -public class FieldConfiguration { - - public enum Type { - @SerializedName("string") STRING, - @SerializedName("integer") INTEGER, - @SerializedName("number") NUMBER, - @SerializedName("date") DATE, - @SerializedName("datetime") DATETIME, - @SerializedName("time") TIME -// TODO: currently not supported -// @SerializedName("object") OBJECT, -// @SerializedName("array") ARRAY, -// @SerializedName("duration") DURATION, -// @SerializedName("geopoint") GEOPOINT, -// @SerializedName("geojson") GEOJSON - } - - public enum StringFormat { - @SerializedName("default") DEFAULT, - @SerializedName("email") EMAIL, - @SerializedName("uri") URI, - @SerializedName("binary") BINARY, - @SerializedName("uuid") UUID - } - - public static List getStringFormats() { - return Stream.of(StringFormat.values()) - .map(StringFormat::name) - .collect(Collectors.toList()); - } - - public enum DateFormat { - @SerializedName("default") DEFAULT, - @SerializedName("any") ANY, - @SerializedName("fmtPattern") FMT_PATTERN - } - - public static List getDateFormats() { - return Stream.of(DateFormat.values()) - .map(DateFormat::name) - .collect(Collectors.toList()); - } - - private String name; - private String title; - private Type type; - private String description; - private String format; - private Object missingValue; - private ConstraintsConfiguration constraints; - private String groovy; - - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public Type getType() { - return type; - } - - public void setType(Type type) { - this.type = type; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getFormat() { - return format; - } - - public void setFormat(String format) { - this.format = format; - } - - public Object getMissingValue() { - return missingValue; - } - - public void setMissingValue(Object missingValue) { - this.missingValue = missingValue; - } - - public ConstraintsConfiguration getConstraints() { - return constraints; - } - - public void setConstraints(ConstraintsConfiguration constraints) { - this.constraints = constraints; - } - - public String getGroovy() { - return groovy; - } - - public void setGroovy(String groovy) { - this.groovy = groovy; - } - -} diff --git a/src/main/java/ninja/javafx/smartcsv/validation/configuration/StringFormat.java b/src/main/java/ninja/javafx/smartcsv/validation/configuration/StringFormat.java new file mode 100644 index 0000000..579f63f --- /dev/null +++ b/src/main/java/ninja/javafx/smartcsv/validation/configuration/StringFormat.java @@ -0,0 +1,58 @@ +/* + The MIT License (MIT) + ----------------------------------------------------------------------------- + + Copyright (c) 2015 javafx.ninja + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +package ninja.javafx.smartcsv.validation.configuration; + +/** + * Enumeration for format values for type string in JSON Table Schema + * @see JSON Table Schema + */ +public enum StringFormat { + DEFAULT(null), + EMAIL("email"), + URI("uri"), + BINARY("binary"), + UUID("uuid"); + + private String externalValue; + + StringFormat(String externalValue) { + this.externalValue = externalValue; + } + + public String getExternalValue() { + return externalValue; + } + + public static StringFormat fromExternalValue(String externalValue) { + for (StringFormat value: StringFormat.values()) { + if (value.name().equals(externalValue)) { + return value; + } + } + return DEFAULT; + } +} diff --git a/src/main/java/ninja/javafx/smartcsv/validation/configuration/Type.java b/src/main/java/ninja/javafx/smartcsv/validation/configuration/Type.java new file mode 100644 index 0000000..4dfa2d8 --- /dev/null +++ b/src/main/java/ninja/javafx/smartcsv/validation/configuration/Type.java @@ -0,0 +1,48 @@ +/* + The MIT License (MIT) + ----------------------------------------------------------------------------- + + Copyright (c) 2015 javafx.ninja + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +package ninja.javafx.smartcsv.validation.configuration; + +import com.google.gson.annotations.SerializedName; + +/** + * Types of JSON Table Schema + * @see JSON Table Schema + */ +public enum Type { + @SerializedName("string")STRING, + @SerializedName("integer")INTEGER, + @SerializedName("number")NUMBER, + @SerializedName("date")DATE, + @SerializedName("datetime")DATETIME, + @SerializedName("time")TIME +// TODO: currently not supported +// @SerializedName("object") OBJECT, +// @SerializedName("array") ARRAY, +// @SerializedName("duration") DURATION, +// @SerializedName("geopoint") GEOPOINT, +// @SerializedName("geojson") GEOJSON +} diff --git a/src/main/java/ninja/javafx/smartcsv/validation/configuration/ValidationConfiguration.java b/src/main/java/ninja/javafx/smartcsv/validation/configuration/ValidationConfiguration.java index 31895c6..6d36ef5 100644 --- a/src/main/java/ninja/javafx/smartcsv/validation/configuration/ValidationConfiguration.java +++ b/src/main/java/ninja/javafx/smartcsv/validation/configuration/ValidationConfiguration.java @@ -32,35 +32,36 @@ import java.util.ArrayList; import java.util.List; /** - * validation configuration + * Configuration based on JSON Table Schema + * @see JSON Table Schema */ public class ValidationConfiguration { @SerializedName("fields") - private FieldConfiguration[] fieldConfigurations; + private Field[] fields; - public FieldConfiguration[] getFieldConfigurations() { - return fieldConfigurations; + public Field[] getFields() { + return fields; } - public void setFieldConfigurations(FieldConfiguration[] fieldConfigurations) { - this.fieldConfigurations = fieldConfigurations; + public void setFields(Field[] fields) { + this.fields = fields; } - public FieldConfiguration getFieldConfiguration(String column) { - for (FieldConfiguration fieldConfiguration: fieldConfigurations) { - if (fieldConfiguration.getName().equals(column)) { - return fieldConfiguration; + public Field getFieldConfiguration(String column) { + for (Field field : fields) { + if (field.getName().equals(column)) { + return field; } } return null; } public String[] headerNames() { - if (fieldConfigurations != null) { + if (fields != null) { List headerNames = new ArrayList<>(); - for (FieldConfiguration fieldConfiguration: fieldConfigurations) { - headerNames.add(fieldConfiguration.getName()); + for (Field field : fields) { + headerNames.add(field.getName()); } return headerNames.toArray(new String[headerNames.size()]); } @@ -69,11 +70,11 @@ public class ValidationConfiguration { } public void setHeaderNames(String[] header) { - fieldConfigurations = new FieldConfiguration[header.length]; + fields = new Field[header.length]; int i = 0; for (String headerName: header) { - fieldConfigurations[i] = new FieldConfiguration(); - fieldConfigurations[i].setName(headerName); + fields[i] = new Field(); + fields[i].setName(headerName); i++; } } diff --git a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.properties b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.properties index 027bf1c..a369c5a 100644 --- a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.properties +++ b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv.properties @@ -86,4 +86,10 @@ lineNumber = Selected line: log.header.message = {0} has {1} errors log.message = row {0} column {1} : {2} -column = column \ No newline at end of file +column = column + +format.type.DEFAULT = default +format.type.EMAIL = email +format.type.URI = uri +format.type.BINARY = binary +format.type.UUID = uuid diff --git a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv_de.properties b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv_de.properties index 16f75c0..aae9727 100644 --- a/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv_de.properties +++ b/src/main/resources/ninja/javafx/smartcsv/fx/smartcsv_de.properties @@ -96,4 +96,10 @@ lineNumber = Ausgew\u00e4hlte Zeile: log.header.message = {0} hat {1} Fehler log.message = Zeile {0} Spalte {1} : {2} -column = Spalte \ No newline at end of file +column = Spalte + +format.type.DEFAULT = Standard +format.type.EMAIL = Email +format.type.URI = URI +format.type.BINARY = Binär +format.type.UUID = UUID diff --git a/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml b/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml index b8fa926..7f91926 100644 --- a/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml +++ b/src/main/resources/ninja/javafx/smartcsv/fx/validation/validationEditor.fxml @@ -35,8 +35,8 @@