diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/AnyValidatorFactory.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/AnyValidatorFactory.java index aac80a707e7a31114d41fa57fabacce350e4dd42..7c68dc191b483b54e2ea89231e742abd783ce54d 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/AnyValidatorFactory.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/AnyValidatorFactory.java @@ -32,7 +32,7 @@ final class AnyValidatorFactory implements IValidatorFactory { } - public IValidator createValidator() + public IValidator createValidator(String header) { return VALIDATOR; } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/ColumnDefinition.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/ColumnDefinition.java index eb8a4ee1ad3d54849a108368b2fee3472fc38010..9a31bebde140dd9b58fb55df4b60f27d43e0c816 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/ColumnDefinition.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/ColumnDefinition.java @@ -77,13 +77,19 @@ class ColumnDefinition ClassUtils.create(IColumnHeaderValidator.class, headerValidatorName, headerValidatorProperties); } + IValidatorFactory factory = createValidatorFactory(properties); + return new ColumnDefinition(name, headerValidator, factory, mandatory, order, + canDefineMultipleColumns); + } + + static IValidatorFactory createValidatorFactory(Properties properties) + { String validatorFactoryName = properties.getProperty(VALUE_VALIDATOR_KEY, DefaultValueValidatorFactory.class .getName()); IValidatorFactory factory = ClassUtils.create(IValidatorFactory.class, validatorFactoryName, properties); - return new ColumnDefinition(name, headerValidator, factory, mandatory, order, - canDefineMultipleColumns); + return factory; } private ColumnDefinition(String name, IColumnHeaderValidator headerValidator, @@ -134,8 +140,8 @@ class ColumnDefinition return headerValidator.validateHeader(header); } - IValidator createValidator() + IValidator createValidator(String header) { - return valueValidatorFactory.createValidator(); + return valueValidatorFactory.createValidator(header); } } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/DataSetValidatorForTSV.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/DataSetValidatorForTSV.java index 3b2e2dd9638d556fe429ff37ce2c2a4fb93b24b8..952126f31a6de9678ac0eb0523abd6d6959694f8 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/DataSetValidatorForTSV.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/DataSetValidatorForTSV.java @@ -160,7 +160,7 @@ class DataSetValidatorForTSV implements IDataSetValidator IValidator[] validators = new IValidator[definitions.length]; for (int i = 0; i < validators.length; i++) { - validators[i] = definitions[i].createValidator(); + validators[i] = definitions[i].createValidator(headers.get(i)); } int lineNumber = 1; while (table.hasMoreRows()) diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/DefaultValueValidatorFactory.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/DefaultValueValidatorFactory.java index c6241da68ec8ad3d528145584d46c6acb6c347dd..32dcd92983275f2e4712d3ab4cf80fdfe95d3c28 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/DefaultValueValidatorFactory.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/DefaultValueValidatorFactory.java @@ -89,9 +89,9 @@ public class DefaultValueValidatorFactory implements IValidatorFactory factory = valueType.createFactory(properties); } - public IValidator createValidator() + public IValidator createValidator(String header) { - return factory.createValidator(); + return factory.createValidator(header); } } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/HeaderBasedValueValidatorFactory.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/HeaderBasedValueValidatorFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..beae32c8ac00a0907d7e7f3f835a9f85de8029e4 --- /dev/null +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/HeaderBasedValueValidatorFactory.java @@ -0,0 +1,107 @@ +/* + * Copyright 2009 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.etlserver.validation; + +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.regex.Pattern; + +import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; +import ch.systemsx.cisd.common.utilities.PropertyUtils; +import ch.systemsx.cisd.openbis.dss.generic.shared.utils.PropertyParametersUtil; +import ch.systemsx.cisd.openbis.dss.generic.shared.utils.PropertyParametersUtil.SectionProperties; +import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException; + +/** + * + * + * @author Franz-Josef Elmer + */ +public class HeaderBasedValueValidatorFactory implements IValidatorFactory, IColumnHeaderValidator +{ + private static final class HeaderPatternAndFactory + { + private final Pattern pattern; + private final IValidatorFactory factory; + + HeaderPatternAndFactory(Pattern pattern, IValidatorFactory factory) + { + super(); + this.pattern = pattern; + this.factory = factory; + } + } + + private static final String HEADER_PATTERN_KEY = "header-pattern"; + private static final String HEADER_TYPES_KEY = "header-types"; + + private final List<HeaderPatternAndFactory> factories = new ArrayList<HeaderPatternAndFactory>(); + private final String headerMessage; + + public HeaderBasedValueValidatorFactory(Properties properties) + { + SectionProperties[] columnsProperties = + PropertyParametersUtil.extractSectionProperties(properties, HEADER_TYPES_KEY, false); + StringBuilder builder = new StringBuilder(); + for (SectionProperties sectionProperties : columnsProperties) + { + String key = sectionProperties.getKey(); + Properties props = sectionProperties.getProperties(); + String pattern = PropertyUtils.getMandatoryProperty(props, HEADER_PATTERN_KEY); + builder.append('\n').append("Regular expression header of type '").append(key); + builder.append("' have to match: ").append(pattern); + try + { + factories.add(new HeaderPatternAndFactory(Pattern.compile(pattern), + ColumnDefinition.createValidatorFactory(props))); + } catch (Exception ex) + { + throw new ConfigurationFailureException("Invalid header pattern for header type '" + + key + "': " + pattern); + } + } + headerMessage = builder.toString(); + } + + public Result validateHeader(String header) + { + for (HeaderPatternAndFactory factory : factories) + { + if (factory.pattern.matcher(header).matches()) + { + return Result.OK; + } + } + return Result.failure("Does not match: " + headerMessage); + } + + public IValidator createValidator(String columnHeader) + { + for (HeaderPatternAndFactory factory : factories) + { + if (factory.pattern.matcher(columnHeader).matches()) + { + return factory.factory.createValidator(columnHeader); + } + } + throw new UserFailureException("No value validatory found for header '" + columnHeader + + "': " + headerMessage); + } + + +} diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/IValidatorFactory.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/IValidatorFactory.java index 4e42035830d4badc2e0472032cf3052c4b1edff2..934d1be149b37d44c3678722a3e2e212baf118c7 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/IValidatorFactory.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/IValidatorFactory.java @@ -24,8 +24,8 @@ package ch.systemsx.cisd.etlserver.validation; public interface IValidatorFactory { /** - * Creates a validator. The same instance can be returned as in a previous call if the - * validator object is immutable. + * Creates a validator for the specified column header. The same instance can be returned as in + * a previous call for the same argument if the validator object is immutable and the . */ - public IValidator createValidator(); + public IValidator createValidator(String columnHeader); } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/NumericValidatorFactory.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/NumericValidatorFactory.java index 36918e2c258baab0593c6e864147f6b116e36611..904f1b98a6518edf82dd1994c6d857bdb8f484c3 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/NumericValidatorFactory.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/NumericValidatorFactory.java @@ -152,7 +152,7 @@ class NumericValidatorFactory extends AbstractValidatorFactory validator = new NumericValidator(allowEmptyValues, emptyValueSynonyms, rangeOrNull); } - public IValidator createValidator() + public IValidator createValidator(String header) { return validator; } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/StringValidatorFactory.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/StringValidatorFactory.java index fd7fe9a691f9ddd70ca8fc435ea48e60d4305190..0ae8424e943c3ef7766bb9fb513e4e828b02e147 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/StringValidatorFactory.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/StringValidatorFactory.java @@ -38,7 +38,7 @@ class StringValidatorFactory extends AbstractValidatorFactory validator = new RegExBasedValidator(allowEmptyValues, emptyValueSynonyms, regex); } - public IValidator createValidator() + public IValidator createValidator(String header) { return validator; } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/UniqueValidatorFactory.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/UniqueValidatorFactory.java index 8022f81269366fcd2815a730b7cef5a29d6ba993..9dc1cb5160ebcd53556e054b8fcbe3a401a1d651 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/UniqueValidatorFactory.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/validation/UniqueValidatorFactory.java @@ -36,14 +36,14 @@ class UniqueValidatorFactory implements IValidatorFactory String regex = properties.getProperty(StringValidatorFactory.VALUE_PATTERN_KEY); if (regex == null) { - validator = AnyValidatorFactory.INSTANCE.createValidator(); + validator = AnyValidatorFactory.INSTANCE.createValidator(null); } else { validator = new RegExBasedValidator(regex); } } - public IValidator createValidator() + public IValidator createValidator(String header) { return new IValidator() { diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/ColumnDefinitionTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/ColumnDefinitionTest.java index 5ffc3f0c27b85b48aec8adbd9bfad010fc73101c..b316c9cf4102a535895811df21ed5edad379bbed 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/ColumnDefinitionTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/ColumnDefinitionTest.java @@ -40,7 +40,7 @@ public class ColumnDefinitionTest extends AssertJUnit { ColumnDefinition definition = ColumnDefinition.create("col", new Properties()); - IValidator validator = definition.createValidator(); + IValidator validator = definition.createValidator("blabla"); validator.assertValid(null); validator.assertValid(""); validator.assertValid("abc"); @@ -97,7 +97,7 @@ public class ColumnDefinitionTest extends AssertJUnit props.setProperty(ColumnDefinition.ORDER_KEY, "1"); ColumnDefinition definition = ColumnDefinition.create("col", props); - IValidator validator = definition.createValidator(); + IValidator validator = definition.createValidator("blabla"); validator.assertValid(null); validator.assertValid(""); validator.assertValid("abc"); @@ -120,7 +120,7 @@ public class ColumnDefinitionTest extends AssertJUnit ColumnDefinition definition = ColumnDefinition.create("col", props); // We did not specify anything about the value -- these should all pass - IValidator valueValidator = definition.createValidator(); + IValidator valueValidator = definition.createValidator("blabla"); valueValidator.assertValid(null); valueValidator.assertValid(""); valueValidator.assertValid("abc"); @@ -164,7 +164,7 @@ public class ColumnDefinitionTest extends AssertJUnit ColumnDefinition definition = ColumnDefinition.create("col", props); // We did not specify anything about the value -- these should all pass - IValidator valueValidator = definition.createValidator(); + IValidator valueValidator = definition.createValidator("blabla"); valueValidator.assertValid(null); valueValidator.assertValid(""); valueValidator.assertValid("abc"); @@ -282,7 +282,7 @@ public class ColumnDefinitionTest extends AssertJUnit props.setProperty(DefaultValueValidatorFactory.VALUE_TYPE_KEY, "numeric"); ColumnDefinition definition = ColumnDefinition.create("col", props); - IValidator valueValidator = definition.createValidator(); + IValidator valueValidator = definition.createValidator("blabla"); try { valueValidator.assertValid(null); @@ -340,7 +340,7 @@ public class ColumnDefinitionTest extends AssertJUnit props.setProperty(DefaultValueValidatorFactory.VALUE_TYPE_KEY, "string"); props.setProperty(StringValidatorFactory.VALUE_PATTERN_KEY, "[0-9]+"); definition = ColumnDefinition.create("col", props); - valueValidator = definition.createValidator(); + valueValidator = definition.createValidator("blabla"); try { valueValidator.assertValid(null); @@ -387,7 +387,7 @@ public class ColumnDefinitionTest extends AssertJUnit props.setProperty(StringValidatorFactory.VALUE_PATTERN_KEY, ".+ :.*"); props.setProperty(AbstractValidatorFactory.ALLOW_EMPTY_VALUES_KEY, "true"); definition = ColumnDefinition.create("col", props); - valueValidator = definition.createValidator(); + valueValidator = definition.createValidator("blabla"); try { diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/DataSetValidatorForTSVTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/DataSetValidatorForTSVTest.java index 2484792d8c39f533d5355114e57079ee313629bc..8819157eef00872a48731cb1dd832afa1ae23c39 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/DataSetValidatorForTSVTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/DataSetValidatorForTSVTest.java @@ -93,7 +93,7 @@ public class DataSetValidatorForTSVTest extends AbstractFileSystemTestCase validator = new MockValidator(properties); } - public IValidator createValidator() + public IValidator createValidator(String header) { return validator; } diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/NumericValidatorFactoryTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/NumericValidatorFactoryTest.java index 4aa172471c89df12e19a55948d0169f026df3e95..5898fb3c593a6511ba358416e393b905f81a7ba3 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/NumericValidatorFactoryTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/NumericValidatorFactoryTest.java @@ -127,7 +127,7 @@ public class NumericValidatorFactoryTest extends AssertJUnit public void testInvalidNumber() { NumericValidatorFactory validatorFactory = new NumericValidatorFactory(new Properties()); - IValidator validator = validatorFactory.createValidator(); + IValidator validator = validatorFactory.createValidator("blabla"); assertNotANumber(validator, "abc"); assertNotANumber(validator, " -0-"); @@ -137,7 +137,7 @@ public class NumericValidatorFactoryTest extends AssertJUnit public void testEmptyValue() { NumericValidatorFactory validatorFactory = new NumericValidatorFactory(new Properties()); - IValidator validator = validatorFactory.createValidator(); + IValidator validator = validatorFactory.createValidator("blabla"); assertFailingOnBlankValue(validator, null); assertFailingOnBlankValue(validator, ""); @@ -151,7 +151,7 @@ public class NumericValidatorFactoryTest extends AssertJUnit properties.setProperty(NumericValidatorFactory.ALLOW_EMPTY_VALUES_KEY, "true"); properties.setProperty(NumericValidatorFactory.VALUE_RANGE_KEY, "(0,1]"); NumericValidatorFactory validatorFactory = new NumericValidatorFactory(properties); - IValidator validator = validatorFactory.createValidator(); + IValidator validator = validatorFactory.createValidator("blabla"); validator.assertValid(null); validator.assertValid(""); @@ -169,7 +169,7 @@ public class NumericValidatorFactoryTest extends AssertJUnit properties.setProperty(NumericValidatorFactory.EMPTY_VALUE_SYNONYMS_KEY, "-, N/A"); properties.setProperty(NumericValidatorFactory.VALUE_RANGE_KEY, "(0,1]"); NumericValidatorFactory validatorFactory = new NumericValidatorFactory(properties); - IValidator validator = validatorFactory.createValidator(); + IValidator validator = validatorFactory.createValidator("blabla"); validator.assertValid(null); validator.assertValid(""); @@ -185,7 +185,7 @@ public class NumericValidatorFactoryTest extends AssertJUnit public void testNoRange() { NumericValidatorFactory validatorFactory = new NumericValidatorFactory(new Properties()); - IValidator validator = validatorFactory.createValidator(); + IValidator validator = validatorFactory.createValidator("blabla"); validator.assertValid("-Infinity"); validator.assertValid("-1"); @@ -226,7 +226,7 @@ public class NumericValidatorFactoryTest extends AssertJUnit Properties properties = new Properties(); properties.setProperty(NumericValidatorFactory.VALUE_RANGE_KEY, range); NumericValidatorFactory validatorFactory = new NumericValidatorFactory(properties); - return validatorFactory.createValidator(); + return validatorFactory.createValidator("blabla"); } private void assertFailingOnBlankValue(IValidator validator, String value) diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/StringValidatorFactoryTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/StringValidatorFactoryTest.java index eb7fcff95c7e4f7bd071e0ee246c79bd415e6b38..deef95c8184fe1c8936b510e733094009e981c02 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/StringValidatorFactoryTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/StringValidatorFactoryTest.java @@ -51,7 +51,7 @@ public class StringValidatorFactoryTest extends AssertJUnit Properties properties = new Properties(); properties.setProperty(StringValidatorFactory.VALUE_PATTERN_KEY, "a.*"); StringValidatorFactory factory = new StringValidatorFactory(properties); - IValidator validator = factory.createValidator(); + IValidator validator = factory.createValidator("blabla"); validator.assertValid("a"); validator.assertValid("a1"); @@ -82,7 +82,7 @@ public class StringValidatorFactoryTest extends AssertJUnit properties.setProperty(StringValidatorFactory.VALUE_PATTERN_KEY, "a.*"); properties.setProperty(StringValidatorFactory.ALLOW_EMPTY_VALUES_KEY, "yes"); StringValidatorFactory factory = new StringValidatorFactory(properties); - IValidator validator = factory.createValidator(); + IValidator validator = factory.createValidator("blabla"); validator.assertValid("a"); validator.assertValid("a1"); @@ -109,7 +109,7 @@ public class StringValidatorFactoryTest extends AssertJUnit properties.setProperty(StringValidatorFactory.ALLOW_EMPTY_VALUES_KEY, "yes"); properties.setProperty(StringValidatorFactory.EMPTY_VALUE_SYNONYMS_KEY, "-"); StringValidatorFactory factory = new StringValidatorFactory(properties); - IValidator validator = factory.createValidator(); + IValidator validator = factory.createValidator("blabla"); validator.assertValid("a"); validator.assertValid("a1"); diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/UniqueValidatorFactoryTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/UniqueValidatorFactoryTest.java index ef24e49bb596b580fe07a22f4a8a5ab9352a2871..48949fdb626159b0e2ce1aeb4cd2ac01d5f929e3 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/UniqueValidatorFactoryTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/validation/UniqueValidatorFactoryTest.java @@ -34,7 +34,7 @@ public class UniqueValidatorFactoryTest extends AssertJUnit public void testNoPattern() { UniqueValidatorFactory factory = new UniqueValidatorFactory(new Properties()); - IValidator validator = factory.createValidator(); + IValidator validator = factory.createValidator("blabla"); validator.assertValid("a"); validator.assertValid("b"); @@ -54,7 +54,7 @@ public class UniqueValidatorFactoryTest extends AssertJUnit Properties properties = new Properties(); properties.setProperty(StringValidatorFactory.VALUE_PATTERN_KEY, "a[0-9]*"); UniqueValidatorFactory factory = new UniqueValidatorFactory(properties); - IValidator validator = factory.createValidator(); + IValidator validator = factory.createValidator("blabla"); validator.assertValid("a"); validator.assertValid("a1"); @@ -74,11 +74,11 @@ public class UniqueValidatorFactoryTest extends AssertJUnit public void testCreateValidatorReturnsFreshValidator() { UniqueValidatorFactory factory = new UniqueValidatorFactory(new Properties()); - IValidator validator = factory.createValidator(); + IValidator validator = factory.createValidator("blabla"); validator.assertValid("a"); - validator = factory.createValidator(); + validator = factory.createValidator("blabla"); validator.assertValid("a"); }