]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/datatypes/literal/Time.java
Using XML ontology as base of converted XML schemas
[simantics/interop.git] / org.simantics.xml.sax.base / src / org / simantics / xml / sax / base / datatypes / literal / Time.java
diff --git a/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/datatypes/literal/Time.java b/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/datatypes/literal/Time.java
new file mode 100644 (file)
index 0000000..03b3911
--- /dev/null
@@ -0,0 +1,108 @@
+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