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