--- /dev/null
+package org.simantics.xml.sax.base.datatypes.literal;\r
+\r
+import java.text.ParseException;\r
+import java.text.SimpleDateFormat;\r
+import java.util.Calendar;\r
+import java.util.Date;\r
+import java.util.TimeZone;\r
+\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.databoard.binding.Binding;\r
+import org.simantics.databoard.util.Bean;\r
+\r
+public class Time extends Bean implements org.simantics.xml.sax.base.datatypes.adt.Time {\r
+\r
+ public static final Binding BINDING = Bindings.getBindingUnchecked(Time.class);\r
+\r
+ public byte hours;\r
+ public byte minutes;\r
+ public byte seconds;\r
+ public int offset;\r
+ \r
+ \r
+ public Time(){\r
+ super(BINDING);\r
+ }\r
+\r
+ public Time(int hours, int minutes, int seconds) {\r
+ this(hours,minutes,seconds, java.lang.Integer.MIN_VALUE);\r
+ }\r
+ \r
+ public Time(int hours, int minutes, int seconds, int offset) {\r
+ super(BINDING);\r
+ if (hours < 0 || hours > 23) throw new IllegalArgumentException("Hours must be between 0 - 23, got " + hours);\r
+ if (minutes < 0 || minutes > 59) throw new IllegalArgumentException("Minutes must be between 0 - 59, got " + minutes);\r
+ if (seconds < 0 || seconds > 59) throw new IllegalArgumentException("Seconds must be between 0 - 59, got " + seconds);\r
+ this.hours = (byte)hours;\r
+ this.minutes = (byte)minutes;\r
+ this.seconds = (byte)seconds;\r
+ this.offset = offset;\r
+ }\r
+\r
+ @Override\r
+ public int getHours() {\r
+ return hours;\r
+ }\r
+\r
+ @Override\r
+ public int getMinutes() {\r
+ return minutes;\r
+ }\r
+\r
+ @Override\r
+ public int getSeconds() {\r
+ return seconds;\r
+ }\r
+\r
+ @Override\r
+ public int getTimezoneOffset() {\r
+ return offset;\r
+ }\r
+\r
+ @Override\r
+ public Date getJavaDate() {\r
+ Calendar c = Calendar.getInstance();\r
+ c.set(Calendar.HOUR_OF_DAY, hours);\r
+ c.set(Calendar.MINUTE, minutes);\r
+ c.set(Calendar.SECOND, seconds);\r
+ if (offset != Integer.MIN_VALUE) {\r
+ c.setTimeZone(TimeZone.getTimeZone(TimeZone.getAvailableIDs(offset*60*1000)[0]));\r
+ }\r
+ return c.getTime();\r
+ }\r
+ \r
+ @Override\r
+ public int compare(org.simantics.xml.sax.base.datatypes.adt.Time o) {\r
+ // FIXME: take account time offset \r
+ if (getHours() != o.getHours())\r
+ return getHours() - o.getHours();\r
+ if (getMinutes() != o.getMinutes())\r
+ return getMinutes() - o.getMinutes();\r
+ if (getSeconds() != o.getSeconds())\r
+ return getSeconds() - o.getSeconds();\r
+ return 0;\r
+ }\r
+ \r
+ public static Time parseTime(String timeString) {\r
+ // FIXME: XML specification allows any number of second decimals!\r
+ String[] formats = new String[]{"HH:mm:ss.SSSSSSSXXX","HH:mm:ss.SSSSSSS","HH:mm:ss.SSXXX","HH:mm:ss.SS","HH:mm:ssXXX", "HH:mm:ss"};\r
+ boolean[] timezone = new boolean[]{true, false,true,false,true,false};\r
+ for (int i = 0; i< formats.length; i++) {\r
+ String format = formats[i];\r
+ try {\r
+ SimpleDateFormat dateFormat = new SimpleDateFormat(format);\r
+ Date n = dateFormat.parse(timeString);\r
+ if (timezone[i]) {\r
+ return new Time(n.getHours(), n.getMinutes(), n.getSeconds(), n.getTimezoneOffset());\r
+ }\r
+ return new Time(n.getHours(), n.getMinutes(), n.getSeconds());\r
+ } catch (ParseException e) {\r
+ \r
+ }\r
+ }\r
+\r
+ throw new IllegalArgumentException("Time is not in proper format " + timeString);\r
+ \r
+ }\r
+\r
+}\r