2 Copyright (C) 2006 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
38 package gnu
.xml
.validation
.datatype
;
40 import java
.util
.TimeZone
;
41 import javax
.xml
.XMLConstants
;
42 import javax
.xml
.namespace
.QName
;
43 import org
.relaxng
.datatype
.DatatypeException
;
44 import org
.relaxng
.datatype
.ValidationContext
;
47 * The XML Schema time type.
49 * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
52 extends AtomicSimpleType
63 return minutes
* 31 + new Float(seconds
).hashCode();
66 public boolean equals(Object other
)
68 if (other
instanceof Time
)
70 Time time
= (Time
) other
;
71 return time
.minutes
== minutes
&& time
.seconds
== seconds
;
76 public int compareTo(Object other
)
78 if (other
instanceof Time
)
80 Time time
= (Time
) other
;
81 if (time
.minutes
!= minutes
)
82 return minutes
- time
.minutes
;
83 if (time
.seconds
== seconds
)
85 return (seconds
< time
.seconds
) ?
-1 : 1;
92 static final int[] CONSTRAINING_FACETS
= {
104 super(new QName(XMLConstants
.W3C_XML_SCHEMA_NS_URI
, "time"),
105 TypeLibrary
.ANY_SIMPLE_TYPE
);
108 public int[] getConstrainingFacets()
110 return CONSTRAINING_FACETS
;
113 public void checkValid(String value
, ValidationContext context
)
114 throws DatatypeException
116 super.checkValid(value
, context
);
117 int len
= value
.length();
120 for (int i
= 0; i
< len
; i
++)
122 char c
= value
.charAt(i
);
123 if (c
== '-' && state
== 0)
128 if (c
>= 0x30 && c
<= 0x39)
136 throw new DatatypeException(i
, "invalid time value");
146 throw new DatatypeException(i
, "invalid time value");
156 throw new DatatypeException(i
, "invalid time value");
164 throw new DatatypeException(i
, "invalid time value");
170 case 6: // second fraction
178 case 7: // timezone 1
181 if (c
== '+' || c
== '-')
193 throw new DatatypeException(i
, "invalid time value");
200 throw new DatatypeException(i
, "invalid time value");
205 if (len
- start
!= 2)
206 throw new DatatypeException(len
, "invalid time value");
208 case 6: // second fraction
210 case 8: // timezone 2
211 if (len
- start
!= 2)
212 throw new DatatypeException(len
, "invalid time value");
217 throw new DatatypeException(len
, "invalid time value");
221 public Object
createValue(String value
, ValidationContext context
) {
222 int len
= value
.length();
225 Time time
= new Time();
228 for (int i
= 0; i
< len
; i
++)
230 char c
= value
.charAt(i
);
231 if (c
>= 0x30 && c
<= 0x39)
239 Integer
.parseInt(value
.substring(start
, i
)) * 60;
249 Integer
.parseInt(value
.substring(start
, i
));
259 Float
.parseFloat(value
.substring(start
, i
));
268 if (len
- start
> 0 && state
== 7)
271 String timezone
= value
.substring(len
- start
);
272 int i
= timezone
.indexOf(':');
275 if ("Z".equals(timezone
))
277 TimeZone tz
= TimeZone
.getTimeZone(timezone
);
280 time
.minutes
+= tz
.getRawOffset();
284 String tzh
= timezone
.substring(0, i
);
285 String tzm
= timezone
.substring(i
+ 1);
286 int offset
= Integer
.parseInt(tzh
) * 60;
288 offset
-= Integer
.parseInt(tzm
);
290 offset
+= Integer
.parseInt(tzm
);
291 time
.minutes
+= offset
;
296 catch (NumberFormatException e
)