22
22
import com .networknt .schema .format .PatternFormat ;
23
23
import com .networknt .schema .format .RegexFormat ;
24
24
import com .networknt .schema .format .TimeFormat ;
25
+ import com .networknt .schema .format .UriFormat ;
26
+ import com .networknt .schema .format .UriReferenceFormat ;
25
27
import com .networknt .schema .utils .StringUtils ;
26
28
import org .slf4j .Logger ;
27
29
import org .slf4j .LoggerFactory ;
@@ -34,66 +36,38 @@ public class JsonMetaSchema {
34
36
private static final Logger logger = LoggerFactory .getLogger (JsonMetaSchema .class );
35
37
private static Map <String , String > UNKNOWN_KEYWORDS = new ConcurrentHashMap <>();
36
38
39
+ static PatternFormat pattern (String name , String regex , String description ) {
40
+ return new PatternFormat (name , regex , description );
41
+ }
42
+
37
43
static PatternFormat pattern (String name , String regex ) {
38
- return new PatternFormat (name , regex );
44
+ return pattern (name , regex , null );
39
45
}
40
46
41
47
public static final List <Format > COMMON_BUILTIN_FORMATS = new ArrayList <>();
42
48
43
49
// this section contains formats that is common for all specification versions.
44
50
static {
45
- // From RFC 3986
46
- // ALPHA [A-Za-z]
47
- // DIGIT [0-9]
48
- // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
49
- // => [A-Za-z][A-Za-z0-9+.-]*
50
- // unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
51
- // => [A-Za-z0-9._~\-]
52
- // gen-delims [:/?#\[\]@]
53
- // sub-delims [!$&'()*+,;=]
54
- // reserved = = gen-delims / sub-delims
55
- // => [:/?#\[\]@!$&'()*+,;=]
56
- // pct-encoded = "%" HEXDIG HEXDIG
57
- // => [A-Za-z0-9%] (approximation)
58
- // pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
59
- // => [A-Za-z0-9._~\-%!$&'()*+,;=:@]
60
- // userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
61
- // => [A-Za-z0-9._~\-%!$&'()*+,;=:]*
62
- // host = IP-literal / IPv4address / reg-name
63
- // => [A-Za-z0-9._~\-!$&'()*+,;=%:\[\]]* (approximation)
64
- // port = *DIGiT
65
- // => [0-9]*
66
- // authority = [ userinfo "@" ] host [ ":" port ]
67
- // => ([A-Za-z0-9._~\-%!$&'()*+,;=:]*@)?[A-Za-z0-9._~\-!$&'()*+,;=%:\[\]]*(:[0-9]*)?
68
- // hier-part = "//" authority path-abempty
69
- // / path-absolute
70
- // / path-rootless
71
- // / path-empty
72
- // => (\/\/([A-Za-z0-9._~\-%!$&'()*+,;=:]*@)?[A-Za-z0-9._~\-!$&'()*+,;=%:\[\]]*(:[0-9]*)?)?[A-Za-z0-9._~\-%!$&'()*+,;=:@\/]* (approximation)
73
- // query = *( pchar / "/" / "?" )
74
- // => [A-Za-z0-9._~\-%!$&'()*+,;=:@\/?]*
75
- // fragment = *( pchar / "/" / "?" )
76
- // => [A-Za-z0-9._~\-%!$&'()*+,;=:@\/?]*
77
- // uri = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
78
- COMMON_BUILTIN_FORMATS .add (pattern ("uri" , "^[A-Za-z][A-Za-z0-9+.-]*:(\\ /\\ /([A-Za-z0-9._~\\ -%!$&'()*+,;=:]*@)?[A-Za-z0-9._~\\ -!$&'()*+,;=%:\\ [\\ ]]*(:[0-9]*)?)?[A-Za-z0-9._~\\ -%!$&'()*+,;=:@\\ /]*([?][A-Za-z0-9._~\\ -%!$&'()*+,;=:@\\ /?]*)?([#][A-Za-z0-9._~\\ -%!$&'()*+,;=:@\\ /?]*)?" ));
51
+ COMMON_BUILTIN_FORMATS .add (pattern ("alpha" , "^[a-zA-Z]+$" ));
52
+ COMMON_BUILTIN_FORMATS .add (pattern ("alphanumeric" , "^[a-zA-Z0-9]+$" ));
53
+ COMMON_BUILTIN_FORMATS .add (pattern ("color" , "(#?([0-9A-Fa-f]{3,6})\\ b)|(aqua)|(black)|(blue)|(fuchsia)|(gray)|(green)|(lime)|(maroon)|(navy)|(olive)|(orange)|(purple)|(red)|(silver)|(teal)|(white)|(yellow)|(rgb\\ (\\ s*\\ b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\ b\\ s*,\\ s*\\ b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\ b\\ s*,\\ s*\\ b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\ b\\ s*\\ ))|(rgb\\ (\\ s*(\\ d?\\ d%|100%)+\\ s*,\\ s*(\\ d?\\ d%|100%)+\\ s*,\\ s*(\\ d?\\ d%|100%)+\\ s*\\ ))" ));
54
+ COMMON_BUILTIN_FORMATS .add (pattern ("hostname" , "^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\ -]{0,61}[a-zA-Z0-9])(\\ .([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\ -]{0,61}[a-zA-Z0-9]))*$" ));
79
55
COMMON_BUILTIN_FORMATS .add (pattern ("ip-address" , "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\ .){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$" ));
80
56
COMMON_BUILTIN_FORMATS .add (pattern ("ipv4" , "^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\ .){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$" ));
81
57
COMMON_BUILTIN_FORMATS .add (pattern ("ipv6" , "^\\ s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\ d|1\\ d\\ d|[1-9]?\\ d)(\\ .(25[0-5]|2[0-4]\\ d|1\\ d\\ d|[1-9]?\\ d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\ d|1\\ d\\ d|[1-9]?\\ d)(\\ .(25[0-5]|2[0-4]\\ d|1\\ d\\ d|[1-9]?\\ d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\ d|1\\ d\\ d|[1-9]?\\ d)(\\ .(25[0-5]|2[0-4]\\ d|1\\ d\\ d|[1-9]?\\ d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\ d|1\\ d\\ d|[1-9]?\\ d)(\\ .(25[0-5]|2[0-4]\\ d|1\\ d\\ d|[1-9]?\\ d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\ d|1\\ d\\ d|[1-9]?\\ d)(\\ .(25[0-5]|2[0-4]\\ d|1\\ d\\ d|[1-9]?\\ d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\ d|1\\ d\\ d|[1-9]?\\ d)(\\ .(25[0-5]|2[0-4]\\ d|1\\ d\\ d|[1-9]?\\ d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\ d|1\\ d\\ d|[1-9]?\\ d)(\\ .(25[0-5]|2[0-4]\\ d|1\\ d\\ d|[1-9]?\\ d)){3}))|:)))(%.+)?\\ s*$" ));
82
- COMMON_BUILTIN_FORMATS .add (pattern ("color" , "(#?([0-9A-Fa-f]{3,6})\\ b)|(aqua)|(black)|(blue)|(fuchsia)|(gray)|(green)|(lime)|(maroon)|(navy)|(olive)|(orange)|(purple)|(red)|(silver)|(teal)|(white)|(yellow)|(rgb\\ (\\ s*\\ b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\ b\\ s*,\\ s*\\ b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\ b\\ s*,\\ s*\\ b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\ b\\ s*\\ ))|(rgb\\ (\\ s*(\\ d?\\ d%|100%)+\\ s*,\\ s*(\\ d?\\ d%|100%)+\\ s*,\\ s*(\\ d?\\ d%|100%)+\\ s*\\ ))" ));
83
- COMMON_BUILTIN_FORMATS .add (pattern ("hostname" , "^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\ -]{0,61}[a-zA-Z0-9])(\\ .([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\ -]{0,61}[a-zA-Z0-9]))*$" ));
84
- COMMON_BUILTIN_FORMATS .add (pattern ("alpha" , "^[a-zA-Z]+$" ));
85
- COMMON_BUILTIN_FORMATS .add (pattern ("alphanumeric" , "^[a-zA-Z0-9]+$" ));
58
+ COMMON_BUILTIN_FORMATS .add (pattern ("json-pointer" , "^(/([^/#~]|[~](?=[01]))*)*$" ));
86
59
COMMON_BUILTIN_FORMATS .add (pattern ("phone" , "^\\ +(?:[0-9] ?){6,14}[0-9]$" ));
87
- COMMON_BUILTIN_FORMATS .add (pattern ("utc-millisec " , "^[0 -9]+( \\ .?[0-9]+)? $" ));
60
+ COMMON_BUILTIN_FORMATS .add (pattern ("relative-json-pointer " , "^(0|([1 -9]\\ d*))(#|(/([^/#~]|[~](?=[01]))*)*) $" ));
88
61
COMMON_BUILTIN_FORMATS .add (pattern ("style" , "\\ s*(.+?):\\ s*([^;]+);?" ));
89
- COMMON_BUILTIN_FORMATS .add (pattern ("uuid" , "^\\ p{XDigit}{8}-\\ p{XDigit}{4}-\\ p{XDigit}{4}-\\ p{XDigit}{4}-\\ p{XDigit}{12}$" ));
90
62
COMMON_BUILTIN_FORMATS .add (pattern ("uri-template" , "^([^\\ p{Cntrl}\" '%<>\\ ^`\\ {|\\ }]|%\\ p{XDigit}{2}|\\ {[+#./;?&=,!@|]?((\\ w|%\\ p{XDigit}{2})(\\ .?(\\ w|%\\ p{XDigit}{2}))*(:[1-9]\\ d{0,3}|\\ *)?)(,((\\ w|%\\ p{XDigit}{2})(\\ .?(\\ w|%\\ p{XDigit}{2}))*(:[1-9]\\ d{0,3}|\\ *)?))*\\ })*$" ));
91
- COMMON_BUILTIN_FORMATS .add (pattern ("json-pointer " , "^(/([^/#~]|[~](?=[01]))*)* $" ));
92
- COMMON_BUILTIN_FORMATS .add (pattern ("relative-json-pointer " , "^(0|([1-9] \\ d*))(#|(/([^/#~]|[~](?=[01]))*)*) $" ));
63
+ COMMON_BUILTIN_FORMATS .add (pattern ("utc-millisec " , "^[0-9]+( \\ .?[0-9]+)? $" ));
64
+ COMMON_BUILTIN_FORMATS .add (pattern ("uuid " , "^\\ p{XDigit}{8}- \\ p{XDigit}{4}- \\ p{XDigit}{4}- \\ p{XDigit}{4}- \\ p{XDigit}{12} $" ));
93
65
COMMON_BUILTIN_FORMATS .add (new DateFormat ());
94
66
COMMON_BUILTIN_FORMATS .add (new EmailFormat ());
95
67
COMMON_BUILTIN_FORMATS .add (new RegexFormat ());
96
68
COMMON_BUILTIN_FORMATS .add (new TimeFormat ());
69
+ COMMON_BUILTIN_FORMATS .add (new UriFormat ());
70
+ COMMON_BUILTIN_FORMATS .add (new UriReferenceFormat ());
97
71
}
98
72
99
73
public static class Builder {
0 commit comments