diff --git a/src/main/java/gov/nasa/pds/tools/validate/rule/pds4/DateTimeValidator.java b/src/main/java/gov/nasa/pds/tools/validate/rule/pds4/DateTimeValidator.java index e8347ca05..2ffaee1ae 100644 --- a/src/main/java/gov/nasa/pds/tools/validate/rule/pds4/DateTimeValidator.java +++ b/src/main/java/gov/nasa/pds/tools/validate/rule/pds4/DateTimeValidator.java @@ -13,11 +13,11 @@ // $Id$ package gov.nasa.pds.tools.validate.rule.pds4; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.regex.Pattern; import gov.nasa.pds.label.object.FieldType; +import gov.nasa.pds.registry.common.util.TimeFormatRegex; /** * Class to validate datetime values. @@ -27,152 +27,21 @@ */ public class DateTimeValidator { - /** - * Valid Day Of Year formats. - * - */ - private static List DOY_FORMATS = Arrays.asList( - Pattern.compile("(-)?[0-9]{4}(Z?)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96))-366(Z?)"), - Pattern.compile("(-)?[0-9]{4}-((00[1-9])|(0[1-9][0-9])|([1-2][0-9][0-9])|(3(([0-5][0-9])|(6[0-5]))))(Z?)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-366(Z?)")); - - /** - * Valid Day of Year datetime formats. - * - */ - private static List DATE_TIME_DOY_FORMATS = Arrays.asList( - Pattern.compile("(-)?[0-9]{4}(Z?)"), - Pattern.compile("(-)?[0-9]{4}-((00[1-9])|(0[1-9][0-9])|([1-2][0-9][0-9])|(3(([0-5][0-9])|(6[0-5]))))(Z?)"), - Pattern.compile("(-)?[0-9]{4}-((00[1-9])|(0[1-9][0-9])|([1-2][0-9][0-9])|(3(([0-5][0-9])|(6[0-5]))))(T)(([0-1][0-9])|(2[0-3]))(Z?)"), - Pattern.compile("(-)?[0-9]{4}-((00[1-9])|(0[1-9][0-9])|([1-2][0-9][0-9])|(3(([0-5][0-9])|(6[0-5]))))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z?)"), - Pattern.compile("(-)?[0-9]{4}-((00[1-9])|(0[1-9][0-9])|([1-2][0-9][0-9])|(3(([0-5][0-9])|(6[0-5]))))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:([0-5][0-9])(\\.([0-9]+))?(Z?)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96))-366(Z?)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96))-366(T)(([0-1][0-9])|(2[0-3]))(Z?)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96))-366(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z?)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96))-366(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:([0-5][0-9])(\\.([0-9]+))?(Z?)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-366(Z?)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-366(T)(([0-1][0-9])|(2[0-3]))(Z?)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-366(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z?)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-366(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:([0-5][0-9])(\\.([0-9]+))?(Z?)"), - Pattern.compile("(1981|1982|1983|1985|1993|1994|1997|2015)-181T23:59:60(\\.[0-9]+)?(Z?)"), - Pattern.compile("(1972|1992|2012)-182T23:59:60(\\.[0-9]+)?(Z?)"), - Pattern.compile("(1971|1973|1974|1975|1977|1978|1979|1987|1989|1990|1995|1998|2005)-365T23:59:60(\\.[0-9]+)?(Z?)"), - Pattern.compile("(1972|1976|2008|2016)-366T23:59:60(\\.[0-9]+)?(Z?)")); - - /** - * Valid datetime UTC formats. - * - */ - private static List DATE_TIME_DOY_UTC_FORMATS = Arrays.asList( - Pattern.compile("(-)?[0-9]{4}(Z)"), - Pattern.compile("(-)?[0-9]{4}-((00[1-9])|(0[1-9][0-9])|([1-2][0-9][0-9])|(3(([0-5][0-9])|(6[0-5]))))(Z)"), - Pattern.compile("(-)?[0-9]{4}-((00[1-9])|(0[1-9][0-9])|([1-2][0-9][0-9])|(3(([0-5][0-9])|(6[0-5]))))(T)(([0-1][0-9])|(2[0-3]))(Z)"), - Pattern.compile("(-)?[0-9]{4}-((00[1-9])|(0[1-9][0-9])|([1-2][0-9][0-9])|(3(([0-5][0-9])|(6[0-5]))))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z)"), - Pattern.compile("(-)?[0-9]{4}-((00[1-9])|(0[1-9][0-9])|([1-2][0-9][0-9])|(3(([0-5][0-9])|(6[0-5]))))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:([0-5][0-9])(\\.([0-9]+))?(Z)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96))-366(Z)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96))-366(T)(([0-1][0-9])|(2[0-3]))(Z)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96))-366(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96))-366(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:([0-5][0-9])(\\.([0-9]+))?(Z)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-366(Z)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-366(T)(([0-1][0-9])|(2[0-3]))(Z)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-366(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-366(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:([0-5][0-9])(\\.([0-9]+))?(Z)"), - Pattern.compile("(1981|1982|1983|1985|1993|1994|1997|2015)-181T23:59:60(\\.[0-9]+)?(Z)"), - Pattern.compile("(1972|1992|2012)-182T23:59:60(\\.[0-9]+)?(Z)"), - Pattern.compile("(1971|1973|1974|1975|1977|1978|1979|1987|1989|1990|1995|1998|2005)-365T23:59:60(\\.[0-9]+)?(Z)"), - Pattern.compile("(1972|1976|2008|2016)-366T23:59:60(\\.[0-9]+)?(Z)")); - - /** - * Valid datetime year month day formats. - * - */ - private static List DATE_TIME_YMD_FORMATS = Arrays.asList( - Pattern.compile("(-)?[0-9]{4}(Z?)"), - Pattern.compile("(-)?[0-9]{4}-((0[1-9])|(1[0-2]))(Z?)"), - Pattern.compile("(-)?[0-9]{4}-(02-((0[1-9])|(1[0-9])|(2[0-8])))(Z?)"), - Pattern.compile("(-)?[0-9]{4}-((04|06|09|11)-((0[1-9])|([1-2][0-9])|30))(Z?)"), - Pattern.compile("(-)?[0-9]{4}-((01|03|05|07|08|10|12)-((0[1-9])|([1-2][0-9])|(30|31)))(Z?)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)-02-29)(Z?)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-02-29(Z?)"), - Pattern.compile("(-)?[0-9]{4}-(02-((0[1-9])|(1[0-9])|(2[0-8])))(T)(([0-1][0-9])|(2[0-3]))(Z?)"), - Pattern.compile("(-)?[0-9]{4}-((04|06|09|11)-((0[1-9])|([1-2][0-9])|30))(T)(([0-1][0-9])|(2[0-3]))(Z?)"), - Pattern.compile("(-)?[0-9]{4}-((01|03|05|07|08|10|12)-((0[1-9])|([1-2][0-9])|(30|31)))(T)(([0-1][0-9])|(2[0-3]))(Z?)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)-02-29)(T)(([0-1][0-9])|(2[0-3]))(Z?)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-02-29(T)(([0-1][0-9])|(2[0-3]))(Z?)"), - Pattern.compile("(-)?[0-9]{4}-(02-((0[1-9])|(1[0-9])|(2[0-8])))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z?)"), - Pattern.compile("(-)?[0-9]{4}-((04|06|09|11)-((0[1-9])|([1-2][0-9])|30))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z?)"), - Pattern.compile("(-)?[0-9]{4}-((01|03|05|07|08|10|12)-((0[1-9])|([1-2][0-9])|(30|31)))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z?)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)-02-29)(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z?)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-02-29(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z?)"), - Pattern.compile("(-)?[0-9]{4}-(02-((0[1-9])|(1[0-9])|(2[0-8])))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:([0-5][0-9])(\\.([0-9]+))?(Z?)"), - Pattern.compile("(-)?[0-9]{4}-((04|06|09|11)-((0[1-9])|([1-2][0-9])|30))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:([0-5][0-9])(\\.([0-9]+))?(Z?)"), - Pattern.compile("(-)?[0-9]{4}-((01|03|05|07|08|10|12)-((0[1-9])|([1-2][0-9])|(30|31)))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:([0-5][0-9])(\\.([0-9]+))?(Z?)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)-02-29)(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:([0-5][0-9])(\\.([0-9]+))?(Z?)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-02-29(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:([0-5][0-9])(\\.([0-9]+))?(Z?)"), - Pattern.compile("((1971|1972|1973|1974|1975|1976|1977|1978|1979|1987|1989|1990|1995|1998|2005|2008|2016)-12-31T23:59:60(\\.[0-9]+)?(Z?)|(1972|1981|1982|1983|1985|1992|1993|1994|1997|2012|2015)-06-30T23:59:60(\\.[0-9]+)?(Z?))")); - - /** - * Valid datetime year month day UTC formats. - * - */ - private static List DATE_TIME_YMD_UTC_FORMATS = Arrays.asList( - Pattern.compile("(-)?[0-9]{4}(Z)"), - Pattern.compile("(-)?[0-9]{4}-((0[1-9])|(1[0-2]))(Z)"), - Pattern.compile("(-)?[0-9]{4}-(02-((0[1-9])|(1[0-9])|(2[0-8])))(Z)"), - Pattern.compile("(-)?[0-9]{4}-((04|06|09|11)-((0[1-9])|([1-2][0-9])|30))(Z)"), - Pattern.compile("(-)?[0-9]{4}-((01|03|05|07|08|10|12)-((0[1-9])|([1-2][0-9])|(30|31)))(Z)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)-02-29)(Z)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-02-29(Z)"), - Pattern.compile("(-)?[0-9]{4}-(02-((0[1-9])|(1[0-9])|(2[0-8])))(T)(([0-1][0-9])|(2[0-3]))(Z)"), - Pattern.compile("(-)?[0-9]{4}-((04|06|09|11)-((0[1-9])|([1-2][0-9])|30))(T)(([0-1][0-9])|(2[0-3]))(Z)"), - Pattern.compile("(-)?[0-9]{4}-((01|03|05|07|08|10|12)-((0[1-9])|([1-2][0-9])|(30|31)))(T)(([0-1][0-9])|(2[0-3]))(Z)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)-02-29)(T)(([0-1][0-9])|(2[0-3]))(Z)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-02-29(T)(([0-1][0-9])|(2[0-3]))(Z)"), - Pattern.compile("(-)?[0-9]{4}-(02-((0[1-9])|(1[0-9])|(2[0-8])))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z)"), - Pattern.compile("(-)?[0-9]{4}-((04|06|09|11)-((0[1-9])|([1-2][0-9])|30))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z)"), - Pattern.compile("(-)?[0-9]{4}-((01|03|05|07|08|10|12)-((0[1-9])|([1-2][0-9])|(30|31)))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)-02-29)(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-02-29(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z)"), - Pattern.compile("(-)?[0-9]{4}-(02-((0[1-9])|(1[0-9])|(2[0-8])))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:([0-5][0-9])(\\.([0-9]+))?(Z)"), - Pattern.compile("(-)?[0-9]{4}-((04|06|09|11)-((0[1-9])|([1-2][0-9])|30))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:([0-5][0-9])(\\.([0-9]+))?(Z)"), - Pattern.compile("(-)?[0-9]{4}-((01|03|05|07|08|10|12)-((0[1-9])|([1-2][0-9])|(30|31)))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:([0-5][0-9])(\\.([0-9]+))?(Z)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)-02-29)(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:([0-5][0-9])(\\.([0-9]+))?(Z)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-02-29(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:([0-5][0-9])(\\.([0-9]+))?(Z)"), - Pattern.compile("((1971|1972|1973|1974|1975|1976|1977|1978|1979|1987|1989|1990|1995|1998|2005|2008|2016)-12-31T23:59:60(\\.[0-9]+)?(Z)|(1972|1981|1982|1983|1985|1992|1993|1994|1997|2012|2015)-06-30T23:59:60(\\.[0-9]+)?(Z))")); - - /** - * Valid year month day formats. - * - */ - private static List DATE_YMD_FORMATS = Arrays.asList( - Pattern.compile("(-)?[0-9]{4}(Z?)"), - Pattern.compile("(-)?[0-9]{4}-((0[1-9])|(1[0-2]))(Z?)"), - Pattern.compile("((-)?[0-9]{4}-(02-((0[1-9])|(1[0-9])|(2[0-8])))|(-)?[0-9]{4}-((04|06|09|11)-((0[1-9])|([1-2][0-9])|30))|(-)?[0-9]{4}-((01|03|05|07|08|10|12)-((0[1-9])|([1-2][0-9])|(30|31))))(Z?)"), - Pattern.compile("(-)?([0-9]{2}(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)-02-29)(Z?)"), - Pattern.compile("(-)?(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)00-02-29(Z?)")); - - private static List TIME_FORMATS = Arrays.asList( - Pattern.compile("(([0-1][0-9])|(2[0-3]))(Z?)"), - Pattern.compile("(([0-1][0-9])|(2[0-3])):[0-5][0-9](Z?)"), - Pattern.compile("(([0-1][0-9])|(2[0-3])):[0-5][0-9]:([0-5][0-9])(\\.([0-9]+))?(Z?)"), - Pattern.compile("(23):[0-5][0-9]:(([0-5][0-9])|60)((\\.[0-9]+))?(Z?)")); - /** * Mapping of field datetime types to its list of valid datetime formats. * */ public static final HashMap> DATE_TIME_FORMATS = new HashMap<>(); static { - DATE_TIME_FORMATS.put(FieldType.ASCII_DATE_DOY.getXMLType(), DOY_FORMATS); - DATE_TIME_FORMATS.put(FieldType.ASCII_DATE_TIME_DOY.getXMLType(), DATE_TIME_DOY_FORMATS); + DATE_TIME_FORMATS.put(FieldType.ASCII_DATE_DOY.getXMLType(), TimeFormatRegex.DOY_FORMATS); + DATE_TIME_FORMATS.put(FieldType.ASCII_DATE_TIME_DOY.getXMLType(), TimeFormatRegex.DATE_TIME_DOY_FORMATS); DATE_TIME_FORMATS.put(FieldType.ASCII_DATE_TIME_DOY_UTC.getXMLType(), - DATE_TIME_DOY_UTC_FORMATS); - DATE_TIME_FORMATS.put(FieldType.ASCII_DATE_TIME_YMD.getXMLType(), DATE_TIME_YMD_FORMATS); + TimeFormatRegex.DATE_TIME_DOY_UTC_FORMATS); + DATE_TIME_FORMATS.put(FieldType.ASCII_DATE_TIME_YMD.getXMLType(), TimeFormatRegex.DATE_TIME_YMD_FORMATS); DATE_TIME_FORMATS.put(FieldType.ASCII_DATE_TIME_YMD_UTC.getXMLType(), - DATE_TIME_YMD_UTC_FORMATS); - DATE_TIME_FORMATS.put(FieldType.ASCII_DATE_YMD.getXMLType(), DATE_YMD_FORMATS); - DATE_TIME_FORMATS.put(FieldType.ASCII_TIME.getXMLType(), TIME_FORMATS); + TimeFormatRegex.DATE_TIME_YMD_UTC_FORMATS); + DATE_TIME_FORMATS.put(FieldType.ASCII_DATE_YMD.getXMLType(), TimeFormatRegex.DATE_YMD_FORMATS); + DATE_TIME_FORMATS.put(FieldType.ASCII_TIME.getXMLType(), TimeFormatRegex.TIME_FORMATS); } /**