diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/PropertyValidator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/PropertyValidator.java index 1c4477875125b0b878d9c0af1abdb72f8e7c6163..5280214356e372428d15ec3897a3d1fede40cf35 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/PropertyValidator.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/PropertyValidator.java @@ -16,33 +16,23 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess; -import java.text.ParseException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; import java.util.EnumMap; -import java.util.List; import java.util.Map; -import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.time.DateFormatUtils; -import org.apache.commons.lang.time.DateUtils; import org.w3c.dom.Document; import ch.systemsx.cisd.common.collections.CollectionUtils; import ch.systemsx.cisd.common.collections.IToStringConverter; import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.utilities.PropertyUtils; -import ch.systemsx.cisd.common.utilities.PropertyUtils.Boolean; import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant; -import ch.systemsx.cisd.openbis.generic.shared.basic.ValidationUtilities.HyperlinkValidationHelper; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialTypePE; import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE; import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyPE; import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyTermPE; +import ch.systemsx.cisd.openbis.generic.shared.util.SimplePropertyValidator; import ch.systemsx.cisd.openbis.generic.shared.util.XmlUtils; /** @@ -52,74 +42,22 @@ import ch.systemsx.cisd.openbis.generic.shared.util.XmlUtils; */ public final class PropertyValidator implements IPropertyValueValidator { - public enum SupportedDatePattern - { - DAYS_DATE_PATTERN("yyyy-MM-dd"), - - MINUTES_DATE_PATTERN("yyyy-MM-dd HH:mm"), - - SECONDS_DATE_PATTERN("yyyy-MM-dd HH:mm:ss"), - - US_DATE_PATTERN("M/d/yy"), - - US_DATE_TIME_PATTERN("M/d/yy h:mm a"), - - US_DATE_TIME_24_PATTERN("M/d/yy HH:mm"), - - CANONICAL_DATE_PATTERN(BasicConstant.CANONICAL_DATE_FORMAT_PATTERN), - - RENDERED_CANONICAL_DATE_PATTERN(BasicConstant.RENDERED_CANONICAL_DATE_FORMAT_PATTERN); - - private final String pattern; - - SupportedDatePattern(String pattern) - { - this.pattern = pattern; - } - - public String getPattern() - { - return pattern; - } - } - - private final static String[] DATE_PATTERNS = createDatePatterns(); - private final static Map<DataTypeCode, IDataTypeValidator> dataTypeValidators = createDataTypeValidators(); + private final static SimplePropertyValidator simplePropertyValidator = + new SimplePropertyValidator(); + private final static Map<DataTypeCode, IDataTypeValidator> createDataTypeValidators() { final Map<DataTypeCode, IDataTypeValidator> map = new EnumMap<DataTypeCode, IDataTypeValidator>(DataTypeCode.class); - map.put(DataTypeCode.BOOLEAN, new BooleanValidator()); - map.put(DataTypeCode.VARCHAR, new VarcharValidator()); - map.put(DataTypeCode.TIMESTAMP, new TimestampValidator()); - map.put(DataTypeCode.INTEGER, new IntegerValidator()); - map.put(DataTypeCode.REAL, new RealValidator()); map.put(DataTypeCode.CONTROLLEDVOCABULARY, new ControlledVocabularyValidator()); map.put(DataTypeCode.MATERIAL, new MaterialValidator()); - map.put(DataTypeCode.HYPERLINK, new HyperlinkValidator()); - map.put(DataTypeCode.MULTILINE_VARCHAR, new VarcharValidator()); map.put(DataTypeCode.XML, new XmlValidator()); return map; } - private final static String[] createDatePatterns() - { - final List<String> datePatterns = new ArrayList<String>(); - // Order does not matter due to DateUtils implementation used. - for (SupportedDatePattern supportedPattern : SupportedDatePattern.values()) - { - datePatterns.add(supportedPattern.getPattern()); - } - return datePatterns.toArray(ArrayUtils.EMPTY_STRING_ARRAY); - } - - // - // IPropertyValidator - // - public final String validatePropertyValue(final PropertyTypePE propertyType, final String value) throws UserFailureException { @@ -132,6 +70,11 @@ public final class PropertyValidator implements IPropertyValueValidator return value; } final DataTypeCode entityDataType = propertyType.getType().getCode(); + // If the simplePropertyValidator can handle this, use it. . + if (simplePropertyValidator.canValidate(entityDataType)) + { + return simplePropertyValidator.validatePropertyValue(entityDataType, value); + } final IDataTypeValidator dataTypeValidator = dataTypeValidators.get(entityDataType); assert dataTypeValidator != null : String.format("No IDataTypeValidator implementation " + "specified for '%s'.", entityDataType); @@ -170,109 +113,6 @@ public final class PropertyValidator implements IPropertyValueValidator public String validate(final String value) throws UserFailureException; } - private final static class BooleanValidator implements IDataTypeValidator - { - - // - // IDataTypeValidator - // - - public final String validate(final String value) throws UserFailureException - { - assert value != null : "Unspecified value."; - final Boolean bool = PropertyUtils.Boolean.getBoolean(value); - if (bool == null) - { - throw UserFailureException.fromTemplate("Boolean value '%s' has improper format. " - + "It should be either 'true' or 'false'.", value); - } - return java.lang.Boolean.toString(bool.toBoolean()); - } - } - - private final static class VarcharValidator implements IDataTypeValidator - { - - // - // IDataTypeValidator - // - - public final String validate(final String value) throws UserFailureException - { - assert value != null : "Unspecified value."; - return value; - } - } - - public final static class TimestampValidator implements IDataTypeValidator - { - - // - // IDataTypeValidator - // - - public final String validate(final String value) throws UserFailureException - { - assert value != null : "Unspecified value."; - try - { - Date date = DateUtils.parseDate(value, DATE_PATTERNS); - // we store date in CANONICAL_DATE_PATTERN - return DateFormatUtils.format(date, - SupportedDatePattern.CANONICAL_DATE_PATTERN.getPattern()); - } catch (final ParseException ex) - { - throw UserFailureException.fromTemplate( - "Date value '%s' has improper format. It must be one of '%s'.", value, - Arrays.toString(DATE_PATTERNS)); - } - } - } - - private final static class IntegerValidator implements IDataTypeValidator - { - - // - // IDataTypeValidator - // - - public final String validate(final String value) throws UserFailureException - { - assert value != null : "Unspecified value."; - try - { - Integer.parseInt(value); - return value; - } catch (final NumberFormatException ex) - { - throw UserFailureException.fromTemplate("Integer value '%s' has improper format.", - value); - } - } - } - - private final static class RealValidator implements IDataTypeValidator - { - - // - // IDataTypeValidator - // - - public final String validate(final String value) throws UserFailureException - { - assert value != null : "Unspecified value."; - try - { - Double.parseDouble(value); - return value; - } catch (final NumberFormatException ex) - { - throw UserFailureException.fromTemplate("Double value '%s' has improper format.", - value); - } - } - } - private final static class ControlledVocabularyValidator implements IDataTypeValidator { @@ -380,35 +220,6 @@ public final class PropertyValidator implements IPropertyValueValidator } } - private final static class HyperlinkValidator implements IDataTypeValidator - { - - // - // IDataTypeValidator - // - - public final String validate(final String value) throws UserFailureException - { - assert value != null : "Unspecified value."; - - // validate protocols and format - if (HyperlinkValidationHelper.isProtocolValid(value) == false) - { - throw UserFailureException.fromTemplate( - "Hyperlink '%s' should start with one of the following protocols: '%s'", - value, HyperlinkValidationHelper.getValidProtocolsAsString()); - } - if (HyperlinkValidationHelper.isFormatValid(value) == false) - { - throw UserFailureException.fromTemplate( - "Hyperlink value '%s' has improper format.", value); - } - - // validated value is valid - return value; - } - } - private final static class XmlValidator implements IDataTypeValidator { diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/migration/MigrationStepFrom036To037.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/migration/MigrationStepFrom036To037.java index efdc36603636d2e1a5999eafcaef3266f60e8fc3..b3daa696e068914dc06cd274c59f57778c96414d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/migration/MigrationStepFrom036To037.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/migration/MigrationStepFrom036To037.java @@ -35,7 +35,7 @@ import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; import ch.systemsx.cisd.common.utilities.ModifiedShortPrefixToStringStyle; import ch.systemsx.cisd.dbmigration.java.MigrationStepAdapter; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.PropertyValidator.TimestampValidator; +import ch.systemsx.cisd.openbis.generic.shared.util.SimplePropertyValidator.TimestampValidator; import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; import ch.systemsx.cisd.openbis.generic.shared.dto.TableNames; @@ -51,8 +51,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.TableNames; public final class MigrationStepFrom036To037 extends MigrationStepAdapter { - private static final Logger operationLog = - LogFactory.getLogger(LogCategory.OPERATION, MigrationStepFrom036To037.class); + private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, + MigrationStepFrom036To037.class); private static final String SELECT_ENTITY_PROPERTIES_QUERY = "SELECT id, value FROM %s WHERE %s IN (" + "SELECT id FROM %s WHERE prty_id IN (" diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/migration/MigrationStepFrom046To047.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/migration/MigrationStepFrom046To047.java index 8c804766a5cfe50074f7e86149bed714e7f17c6d..29a898e015a1c9b91882baaf62d93b177b421528 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/migration/MigrationStepFrom046To047.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/migration/MigrationStepFrom046To047.java @@ -32,7 +32,7 @@ import ch.systemsx.cisd.common.collections.CollectionUtils; import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; import ch.systemsx.cisd.dbmigration.java.MigrationStepAdapter; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.PropertyValidator.TimestampValidator; +import ch.systemsx.cisd.openbis.generic.shared.util.SimplePropertyValidator.TimestampValidator; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings; import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; import ch.systemsx.cisd.openbis.generic.shared.dto.TableNames; @@ -50,8 +50,8 @@ import ch.systemsx.cisd.openbis.generic.shared.util.DisplaySettingsSerialization public final class MigrationStepFrom046To047 extends MigrationStepAdapter { - private static final Logger operationLog = - LogFactory.getLogger(LogCategory.OPERATION, MigrationStepFrom046To047.class); + private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, + MigrationStepFrom046To047.class); private static final String SELECT_PERSON_WITH_DISPLAY_SETTINGS_QUERY = "SELECT id, user_id, display_settings FROM %s;"; @@ -74,7 +74,7 @@ public final class MigrationStepFrom046To047 extends MigrationStepAdapter return new TimestampValidator().validate(oldDateValue); // returns canonical format } - // + // // MigrationStepAdapter // diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyValidatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyValidatorTest.java index 2af19bbf8efb89f003b71959db0f50ab9062c7e1..71b56cecb41eb0d51ce3b3a1c10702664c55748a 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyValidatorTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyValidatorTest.java @@ -27,7 +27,7 @@ import org.testng.annotations.Test; import ch.rinn.restrictions.Friend; import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.openbis.generic.server.dataaccess.PropertyValidator; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.PropertyValidator.SupportedDatePattern; +import ch.systemsx.cisd.openbis.generic.shared.util.SimplePropertyValidator.SupportedDatePattern; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; import ch.systemsx.cisd.openbis.generic.shared.dto.DataTypePE; import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialTypePE;