Skip to content
Snippets Groups Projects
Commit fe3d0e15 authored by vkovtun's avatar vkovtun
Browse files

SSDM-8101 Added support to ISO 8601 date formats, namely ...

SSDM-8101 Added support to ISO 8601 date formats, namely  "yyyy-MM-dd'T'HH:mm", "yyyy-MM-dd'T'HH:mm:ss", "yyyy-MM-dd'T'HH:mm:ssX" and "yyyy-MM-dd'T'HH:mm:ssXXX".
parent 90989c9e
No related branches found
No related tags found
No related merge requests found
......@@ -93,7 +93,7 @@ public class BasicConstant
/**
* Canonical date format pattern used to render dates in GUI in a more readable way.
*/
public static final String RENDERED_CANONICAL_DATE_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss ZZZZ";
public static final String RENDERED_CANONICAL_DATE_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss ZZZ";
/**
* Date format which does not include time zone.
......
......@@ -16,24 +16,18 @@
package ch.systemsx.cisd.openbis.generic.shared.util;
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.lang3.ArrayUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import ch.systemsx.cisd.common.exceptions.UserFailureException;
import ch.systemsx.cisd.common.properties.PropertyUtils;
import ch.systemsx.cisd.common.properties.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 org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import java.text.ParseException;
import java.util.*;
/**
* This is a refactoring of {@link ch.systemsx.cisd.openbis.generic.server.dataaccess.PropertyValidator} that takes some simple validations that do
......@@ -52,6 +46,10 @@ public class SimplePropertyValidator
SECONDS_DATE_PATTERN("yyyy-MM-dd HH:mm:ss"),
ISO_MINUTES_DATE_PATTERN("yyyy-MM-dd'T'HH:mm"),
ISO_SECONDS_DATE_PATTERN("yyyy-MM-dd'T'HH:mm:ss"),
US_DATE_PATTERN("M/d/yy"),
US_DATE_TIME_PATTERN("M/d/yy h:mm a"),
......@@ -60,7 +58,11 @@ public class SimplePropertyValidator
CANONICAL_DATE_PATTERN(BasicConstant.CANONICAL_DATE_FORMAT_PATTERN),
RENDERED_CANONICAL_DATE_PATTERN(BasicConstant.RENDERED_CANONICAL_DATE_FORMAT_PATTERN);
ISO_CANONICAL_DATE_PATTERN("yyyy-MM-dd'T'HH:mm:ssX"),
RENDERED_CANONICAL_DATE_PATTERN(BasicConstant.RENDERED_CANONICAL_DATE_FORMAT_PATTERN),
ISO_RENDERED_CANONICAL_DATE_PATTERN("yyyy-MM-dd'T'HH:mm:ssXXX");
private final String pattern;
......@@ -199,7 +201,7 @@ public class SimplePropertyValidator
// we store date in CANONICAL_DATE_PATTERN
return DateFormatUtils.format(date,
SupportedDatePattern.CANONICAL_DATE_PATTERN.getPattern());
} catch (final ParseException ex)
} catch (final ParseException | IllegalArgumentException ex)
{
throwUserFailureException(value);
return null;
......@@ -235,9 +237,10 @@ public class SimplePropertyValidator
*/
private final static void throwUserFailureException(final String value) throws UserFailureException
{
final String validValues = "[" + String.join("\n", DATE_PATTERNS) + "]";
throw UserFailureException.fromTemplate(
"Date value '%s' has improper format. It must be one of '%s'.", value,
Arrays.toString(DATE_PATTERNS));
validValues);
}
}
......
......@@ -16,13 +16,12 @@
package ch.systemsx.cisd.openbis.generic.shared.util;
import static org.testng.Assert.assertEquals;
import ch.systemsx.cisd.common.exceptions.UserFailureException;
import ch.systemsx.cisd.openbis.generic.shared.util.SimplePropertyValidator.TimestampValidator;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import ch.systemsx.cisd.common.exceptions.UserFailureException;
import ch.systemsx.cisd.openbis.generic.shared.util.SimplePropertyValidator.TimestampValidator;
import static org.testng.Assert.assertEquals;
/**
* @author Franz-Josef Elmer
......@@ -33,18 +32,20 @@ public class SimplePropertyValidatorTest
@DataProvider
public Object[][] validTimestamps()
{
return new Object[][] {
{ "2020-05-16", "2020-05-16 00:00:00 +0200" },
{ "2020-5-16", "2020-05-16 00:00:00 +0200" },
{ "2019-01-16", "2019-01-16 00:00:00 +0100" },
{ "2019-01-16 3:4", "2019-01-16 03:04:00 +0100" },
{ "2019-01-16 18:23:56", "2019-01-16 18:23:56 +0100" },
{ "2019-01-16 18:23:56 +0700", "2019-01-16 12:23:56 +0100" },
{ "2019-01-16 18:23:56 GMT", "2019-01-16 19:23:56 +0100" },
{ "1/16/19", "2019-01-16 00:00:00 +0100" },
{ "1/16/19 8:9", "2019-01-16 08:09:00 +0100" },
{ "1/16/19 8:9 p", "2019-01-16 20:09:00 +0100" },
{ "1/16/19 18:19", "2019-01-16 18:19:00 +0100" },
return new Object[][]{
{"2020-05-16", "2020-05-16 00:00:00 +0200"},
{"2020-5-16", "2020-05-16 00:00:00 +0200"},
{"2019-01-16", "2019-01-16 00:00:00 +0100"},
{"2019-01-16 3:4", "2019-01-16 03:04:00 +0100"},
{"2019-01-16 18:23:56", "2019-01-16 18:23:56 +0100"},
{"2019-01-16 18:23:56 +0700", "2019-01-16 12:23:56 +0100"},
{"2019-01-16 18:23:56 GMT", "2019-01-16 19:23:56 +0100"},
{"1/16/19", "2019-01-16 00:00:00 +0100"},
{"1/16/19 8:9", "2019-01-16 08:09:00 +0100"},
{"1/16/19 8:9 p", "2019-01-16 20:09:00 +0100"},
{"1/16/19 18:19", "2019-01-16 18:19:00 +0100"},
{"2019-05-20T10:58:24+00:00", "2019-05-20 12:58:24 +0200"},
{"2019-05-20T10:58:24Z", "2019-05-20 12:58:24 +0200"},
};
}
......@@ -52,7 +53,6 @@ public class SimplePropertyValidatorTest
public Object[][] invalidTimestamps()
{
return new Object[][] {
{ "2010-05-06T17:13:39" },
{ "10-05-06" },
{ "10-05-06 7:23" },
{ "10-05-06 17:13:39" },
......@@ -60,6 +60,10 @@ public class SimplePropertyValidatorTest
{ "2010-05-06 27:13:39" },
{ "13/12/11 7:39" },
{ "3/12/11 7:39:22" },
{ "10-05-06T7:23" },
{ "10-05-06T17:13:39" },
{ "2010-05-36T17:13:39" },
{ "2010-05-06T27:13:39" },
};
}
......@@ -81,9 +85,19 @@ public class SimplePropertyValidatorTest
validator.validate(stringToParse);
} catch (UserFailureException e)
{
assertEquals(e.getMessage(), "Date value '" + stringToParse + "' has improper format. It must be one of "
+ "'[yyyy-MM-dd, yyyy-MM-dd HH:mm, yyyy-MM-dd HH:mm:ss, M/d/yy, M/d/yy h:mm a, M/d/yy HH:mm, "
+ "yyyy-MM-dd HH:mm:ss Z, yyyy-MM-dd HH:mm:ss ZZZZ]'.");
assertEquals(e.getMessage(), "Date value '" + stringToParse + "' has improper format. " +
"It must be one of '[yyyy-MM-dd\n" +
"yyyy-MM-dd HH:mm\n" +
"yyyy-MM-dd HH:mm:ss\n" +
"yyyy-MM-dd'T'HH:mm\n" +
"yyyy-MM-dd'T'HH:mm:ss\n" +
"M/d/yy\n" +
"M/d/yy h:mm a\n" +
"M/d/yy HH:mm\n" +
"yyyy-MM-dd HH:mm:ss Z\n" +
"yyyy-MM-dd'T'HH:mm:ssX\n" +
"yyyy-MM-dd HH:mm:ss ZZZ\n" +
"yyyy-MM-dd'T'HH:mm:ssXXX]'.");
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment