@@ -4,16 +4,88 @@ Jsonix.Schema.XSD.Calendar = Jsonix.Class(Jsonix.Schema.XSD.AnySimpleType, {
44 parse : function ( text , context , input , scope ) {
55 Jsonix . Util . Ensure . ensureString ( text ) ;
66 if ( text . match ( new RegExp ( "^" + Jsonix . Schema . XSD . Calendar . DATETIME_PATTERN + "$" ) ) ) {
7- return this . parseDateTime ( text ) ;
7+ return this . parseDateTime ( text , context , input , scope ) ;
88 } else if ( text . match ( new RegExp ( "^" + Jsonix . Schema . XSD . Calendar . DATE_PATTERN + "$" ) ) ) {
9- return this . parseDate ( text ) ;
9+ return this . parseDate ( text , context , input , scope ) ;
1010 } else if ( text . match ( new RegExp ( "^" + Jsonix . Schema . XSD . Calendar . TIME_PATTERN + "$" ) ) ) {
11- return this . parseTime ( text ) ;
11+ return this . parseTime ( text , context , input , scope ) ;
12+ } else if ( text . match ( new RegExp ( "^" + Jsonix . Schema . XSD . Calendar . GYEAR_MONTH_PATTERN + "$" ) ) ) {
13+ return this . parseGYearMonth ( text , context , input , scope ) ;
14+ } else if ( text . match ( new RegExp ( "^" + Jsonix . Schema . XSD . Calendar . GYEAR_PATTERN + "$" ) ) ) {
15+ return this . parseGYear ( text , context , input , scope ) ;
16+ } else if ( text . match ( new RegExp ( "^" + Jsonix . Schema . XSD . Calendar . GMONTH_DAY_PATTERN + "$" ) ) ) {
17+ return this . parseGMonthDay ( text , context , input , scope ) ;
18+ } else if ( text . match ( new RegExp ( "^" + Jsonix . Schema . XSD . Calendar . GMONTH_PATTERN + "$" ) ) ) {
19+ return this . parseGMonth ( text , context , input , scope ) ;
20+ } else if ( text . match ( new RegExp ( "^" + Jsonix . Schema . XSD . Calendar . GDAY_PATTERN + "$" ) ) ) {
21+ return this . parseGDay ( text , context , input , scope ) ;
1222 } else {
13- throw new Error ( 'Value [' + text + '] does not match xs:dateTime, xs:date or xs:time patterns.' ) ;
23+ throw new Error ( 'Value [' + text + '] does not match xs:dateTime, xs:date, xs:time, xs:gYearMonth, xs:gYear, xs:gMonthDay, xs:gMonth or xs:gDay patterns.' ) ;
1424 }
1525 } ,
16- parseDateTime : function ( text ) {
26+ parseGYearMonth : function ( value , context , input , scope ) {
27+ var gYearMonthExpression = new RegExp ( "^" + Jsonix . Schema . XSD . Calendar . GYEAR_MONTH_PATTERN + "$" ) ;
28+ var results = value . match ( gYearMonthExpression ) ;
29+ if ( results !== null ) {
30+ var data = {
31+ year : parseInt ( results [ 1 ] , 10 ) ,
32+ month : parseInt ( results [ 5 ] , 10 ) ,
33+ timezone : this . parseTimezoneString ( results [ 7 ] )
34+ } ;
35+ return new Jsonix . XML . Calendar ( data ) ;
36+ }
37+ throw new Error ( 'Value [' + value + '] does not match the xs:gYearMonth pattern.' ) ;
38+ } ,
39+ parseGYear : function ( value , context , input , scope ) {
40+ var gYearExpression = new RegExp ( "^" + Jsonix . Schema . XSD . Calendar . GYEAR_PATTERN + "$" ) ;
41+ var results = value . match ( gYearExpression ) ;
42+ if ( results !== null ) {
43+ var data = {
44+ year : parseInt ( results [ 1 ] , 10 ) ,
45+ timezone : this . parseTimezoneString ( results [ 5 ] )
46+ } ;
47+ return new Jsonix . XML . Calendar ( data ) ;
48+ }
49+ throw new Error ( 'Value [' + value + '] does not match the xs:gYear pattern.' ) ;
50+ } ,
51+ parseGMonthDay : function ( value , context , input , scope ) {
52+ var gMonthDayExpression = new RegExp ( "^" + Jsonix . Schema . XSD . Calendar . GMONTH_DAY_PATTERN + "$" ) ;
53+ var results = value . match ( gMonthDayExpression ) ;
54+ if ( results !== null ) {
55+ var data = {
56+ month : parseInt ( results [ 2 ] , 10 ) ,
57+ day : parseInt ( results [ 3 ] , 10 ) ,
58+ timezone : this . parseTimezoneString ( results [ 5 ] )
59+ } ;
60+ return new Jsonix . XML . Calendar ( data ) ;
61+ }
62+ throw new Error ( 'Value [' + value + '] does not match the xs:gMonthDay pattern.' ) ;
63+ } ,
64+ parseGMonth : function ( value , context , input , scope ) {
65+ var gMonthExpression = new RegExp ( "^" + Jsonix . Schema . XSD . Calendar . GMONTH_PATTERN + "$" ) ;
66+ var results = value . match ( gMonthExpression ) ;
67+ if ( results !== null ) {
68+ var data = {
69+ month : parseInt ( results [ 2 ] , 10 ) ,
70+ timezone : this . parseTimezoneString ( results [ 3 ] )
71+ } ;
72+ return new Jsonix . XML . Calendar ( data ) ;
73+ }
74+ throw new Error ( 'Value [' + value + '] does not match the xs:gMonth pattern.' ) ;
75+ } ,
76+ parseGDay : function ( value , context , input , scope ) {
77+ var gDayExpression = new RegExp ( "^" + Jsonix . Schema . XSD . Calendar . GDAY_PATTERN + "$" ) ;
78+ var results = value . match ( gDayExpression ) ;
79+ if ( results !== null ) {
80+ var data = {
81+ day : parseInt ( results [ 2 ] , 10 ) ,
82+ timezone : this . parseTimezoneString ( results [ 3 ] )
83+ } ;
84+ return new Jsonix . XML . Calendar ( data ) ;
85+ }
86+ throw new Error ( 'Value [' + value + '] does not match the xs:gDay pattern.' ) ;
87+ } ,
88+ parseDateTime : function ( text , context , input , scope ) {
1789 Jsonix . Util . Ensure . ensureString ( text ) ;
1890 var expression = new RegExp ( "^" + Jsonix . Schema . XSD . Calendar . DATETIME_PATTERN + "$" ) ;
1991 var results = text . match ( expression ) ;
@@ -32,7 +104,7 @@ Jsonix.Schema.XSD.Calendar = Jsonix.Class(Jsonix.Schema.XSD.AnySimpleType, {
32104 }
33105 throw new Error ( 'Value [' + value + '] does not match the xs:date pattern.' ) ;
34106 } ,
35- parseDate : function ( text ) {
107+ parseDate : function ( text , context , input , scope ) {
36108 Jsonix . Util . Ensure . ensureString ( text ) ;
37109 var expression = new RegExp ( "^" + Jsonix . Schema . XSD . Calendar . DATE_PATTERN + "$" ) ;
38110 var results = text . match ( expression ) ;
@@ -47,7 +119,7 @@ Jsonix.Schema.XSD.Calendar = Jsonix.Class(Jsonix.Schema.XSD.AnySimpleType, {
47119 }
48120 throw new Error ( 'Value [' + value + '] does not match the xs:date pattern.' ) ;
49121 } ,
50- parseTime : function ( text ) {
122+ parseTime : function ( text , context , input , scope ) {
51123 Jsonix . Util . Ensure . ensureString ( text ) ;
52124 var expression = new RegExp ( "^" + Jsonix . Schema . XSD . Calendar . TIME_PATTERN + "$" ) ;
53125 var results = text . match ( expression ) ;
@@ -71,7 +143,7 @@ Jsonix.Schema.XSD.Calendar = Jsonix.Class(Jsonix.Schema.XSD.AnySimpleType, {
71143 return NaN ;
72144 } else if ( text === 'Z' ) {
73145 return 0 ;
74- } else if ( text === '+14:00' ) {
146+ } else if ( text === '+14:00' ) {
75147 return 14 * 60 ;
76148 } else if ( text === '-14:00' ) {
77149 return - 14 * 60 ;
@@ -95,6 +167,16 @@ Jsonix.Schema.XSD.Calendar = Jsonix.Class(Jsonix.Schema.XSD.AnySimpleType, {
95167 return this . printDate ( value ) ;
96168 } else if ( Jsonix . Util . NumberUtils . isInteger ( value . hour ) && Jsonix . Util . NumberUtils . isInteger ( value . minute ) && Jsonix . Util . NumberUtils . isInteger ( value . second ) ) {
97169 return this . printTime ( value ) ;
170+ } else if ( Jsonix . Util . NumberUtils . isInteger ( value . year ) && Jsonix . Util . NumberUtils . isInteger ( value . month ) ) {
171+ return this . printGYearMonth ( value ) ;
172+ } else if ( Jsonix . Util . NumberUtils . isInteger ( value . month ) && Jsonix . Util . NumberUtils . isInteger ( value . day ) ) {
173+ return this . printGMonthDay ( value ) ;
174+ } else if ( Jsonix . Util . NumberUtils . isInteger ( value . year ) ) {
175+ return this . printGYear ( value ) ;
176+ } else if ( Jsonix . Util . NumberUtils . isInteger ( value . month ) ) {
177+ return this . printGMonth ( value ) ;
178+ } else if ( Jsonix . Util . NumberUtils . isInteger ( value . day ) ) {
179+ return this . printGDay ( value ) ;
98180 } else {
99181 throw new Error ( 'Value [' + value + '] is not recognized as dateTime, date or time.' ) ;
100182 }
@@ -205,6 +287,94 @@ Jsonix.Schema.XSD.Calendar = Jsonix.Class(Jsonix.Schema.XSD.AnySimpleType, {
205287 }
206288 }
207289 } ,
290+ printGDay : function ( value , context , output , scope ) {
291+ Jsonix . Util . Ensure . ensureObject ( value ) ;
292+ var day = undefined ;
293+ var timezone = undefined ;
294+
295+ if ( value instanceof Date ) {
296+ day = value . getDate ( ) ;
297+ } else {
298+ Jsonix . Util . Ensure . ensureInteger ( value . day ) ;
299+ day = value . day ;
300+ timezone = value . timezone ;
301+ }
302+ Jsonix . XML . Calendar . validateDay ( day ) ;
303+ Jsonix . XML . Calendar . validateTimezone ( timezone ) ;
304+ return "---" + this . printDay ( day ) + this . printTimezoneString ( timezone ) ;
305+ } ,
306+ printGMonth : function ( value , context , output , scope ) {
307+ Jsonix . Util . Ensure . ensureObject ( value ) ;
308+ var month = undefined ;
309+ var timezone = undefined ;
310+
311+ if ( value instanceof Date ) {
312+ month = value . getMonth ( ) + 1 ;
313+ } else {
314+ Jsonix . Util . Ensure . ensureInteger ( value . month ) ;
315+ month = value . month ;
316+ timezone = value . timezone ;
317+ }
318+ Jsonix . XML . Calendar . validateMonth ( month ) ;
319+ Jsonix . XML . Calendar . validateTimezone ( timezone ) ;
320+ return "--" + this . printMonth ( month ) + this . printTimezoneString ( timezone ) ;
321+ } ,
322+ printGMonthDay : function ( value , context , output , scope ) {
323+ Jsonix . Util . Ensure . ensureObject ( value ) ;
324+ var month = undefined ;
325+ var day = undefined ;
326+ var timezone = undefined ;
327+
328+ if ( value instanceof Date ) {
329+ month = value . getMonth ( ) + 1 ;
330+ day = value . getDate ( ) ;
331+ } else {
332+ Jsonix . Util . Ensure . ensureInteger ( value . month ) ;
333+ Jsonix . Util . Ensure . ensureInteger ( value . day ) ;
334+ month = value . month ;
335+ day = value . day ;
336+ timezone = value . timezone ;
337+ }
338+ Jsonix . XML . Calendar . validateMonthDay ( month , day ) ;
339+ Jsonix . XML . Calendar . validateTimezone ( timezone ) ;
340+ return "--" + this . printMonth ( month ) + "-" + this . printDay ( day ) + this . printTimezoneString ( timezone ) ;
341+ } ,
342+ printGYear : function ( value , context , output , scope ) {
343+ Jsonix . Util . Ensure . ensureObject ( value ) ;
344+ var year = undefined ;
345+ var timezone = undefined ;
346+
347+ if ( value instanceof Date ) {
348+ year = value . getFullYear ( ) ;
349+ } else {
350+ Jsonix . Util . Ensure . ensureInteger ( value . year ) ;
351+ year = value . year ;
352+ timezone = value . timezone ;
353+ }
354+ Jsonix . XML . Calendar . validateYear ( year ) ;
355+ Jsonix . XML . Calendar . validateTimezone ( timezone ) ;
356+ return this . printSignedYear ( year ) + this . printTimezoneString ( timezone ) ;
357+ } ,
358+ printGYearMonth : function ( value , context , output , scope ) {
359+ Jsonix . Util . Ensure . ensureObject ( value ) ;
360+ var year = undefined ;
361+ var month = undefined ;
362+ var timezone = undefined ;
363+
364+ if ( value instanceof Date ) {
365+ year = value . getFullYear ( ) ;
366+ month = value . getMonth ( ) + 1 ;
367+ } else {
368+ Jsonix . Util . Ensure . ensureInteger ( value . year ) ;
369+ year = value . year ;
370+ month = value . month ;
371+ timezone = value . timezone ;
372+ }
373+ Jsonix . XML . Calendar . validateYear ( year ) ;
374+ Jsonix . XML . Calendar . validateMonth ( month ) ;
375+ Jsonix . XML . Calendar . validateTimezone ( timezone ) ;
376+ return this . printSignedYear ( year ) + "-" + this . printMonth ( month ) + this . printTimezoneString ( timezone ) ;
377+ } ,
208378 printSignedYear : function ( value ) {
209379 return value < 0 ? ( "-" + this . printYear ( value * - 1 ) ) : ( this . printYear ( value ) ) ;
210380 } ,
@@ -251,10 +421,6 @@ Jsonix.Schema.XSD.Calendar = Jsonix.Class(Jsonix.Schema.XSD.AnySimpleType, {
251421 if ( value < 0 ) {
252422 throw new Error ( 'Value [' + value + '] must not be negative.' ) ;
253423 }
254- // if (value >= Math.pow(10, length)) {
255- // throw new Error('Value [' + value + '] must be less than [' +
256- // Math.pow(10, length) + '].');
257- // }
258424 var result = String ( value ) ;
259425 for ( var i = result . length ; i < length ; i ++ ) {
260426 result = '0' + result ;
0 commit comments