/** * Return a calendar with the timezone field set, to be used for order comparison. If the original * calendar did not specify a timezone, set the local timezone (unadjusted for daylight savings). * The returned calendars will be totally ordered between themselves. We also set any missing * fields to ensure that normalization doesn't discard important data! (This is probably a bug in * the JAXP implementation, but the workaround doesn't hurt us, so it's faster to just fix it * here.) * * @return the calendar represented by this object, with the timezone field filled in with an * implicit value if necessary */ protected XMLGregorianCalendar getImplicitCalendar() { if (implicitCalendar == null) { implicitCalendar = (XMLGregorianCalendar) calendar.clone(); if (calendar.getTimezone() == DatatypeConstants.FIELD_UNDEFINED) { implicitCalendar.setTimezone(TimeUtils.getInstance().getLocalTimezoneOffsetMinutes()); } // fill in fields from default reference; don't have to worry about weird combinations of // fields being set, since we control that on creation switch (getType()) { case Type.DATE: implicitCalendar.setTime(0, 0, 0); break; case Type.TIME: implicitCalendar.setYear(1972); implicitCalendar.setMonth(12); implicitCalendar.setDay(31); break; default: } implicitCalendar = implicitCalendar .normalize(); // the comparison routines will normalize it anyway, just do it once // here } return implicitCalendar; }
private static XMLGregorianCalendar stripCalendar(XMLGregorianCalendar calendar) { calendar = (XMLGregorianCalendar) calendar.clone(); calendar.setYear(DatatypeConstants.FIELD_UNDEFINED); calendar.setMonth(DatatypeConstants.FIELD_UNDEFINED); calendar.setHour(DatatypeConstants.FIELD_UNDEFINED); calendar.setMinute(DatatypeConstants.FIELD_UNDEFINED); calendar.setSecond(DatatypeConstants.FIELD_UNDEFINED); calendar.setMillisecond(DatatypeConstants.FIELD_UNDEFINED); return calendar; }
public Object toJavaObject(Class target) throws XPathException { if (target == Object.class || target.isAssignableFrom(DateValue.class)) return this; else if (target.isAssignableFrom(XMLGregorianCalendar.class)) return calendar.clone(); else if (target.isAssignableFrom(GregorianCalendar.class)) return calendar.toGregorianCalendar(); else if (target == Date.class) return calendar.toGregorianCalendar().getTime(); throw new XPathException( "cannot convert value of type " + Type.getTypeName(getType()) + " to Java object of type " + target.getName()); }
/** * Add additional time in miliseconds * * @param value calendar whose value needs to be updated * @param milis * @return calendar value with the addition * @throws ConfigurationException */ public static XMLGregorianCalendar add(XMLGregorianCalendar value, long milis) throws ConfigurationException { XMLGregorianCalendar newVal = (XMLGregorianCalendar) value.clone(); Duration duration; try { duration = newDatatypeFactory().newDuration(milis); } catch (DatatypeConfigurationException e) { throw logger.configurationError(e); } newVal.add(duration); return newVal; }
/** * Utility method that is able to clone a calendar whose year is 0 (whatever a year 0 means). It * looks like the JDK is unable to do that. * * @param calendar The Calendar to clone * @return the cloned Calendar */ public static XMLGregorianCalendar cloneXMLGregorianCalendar(XMLGregorianCalendar calendar) { boolean hacked = false; if (calendar.getYear() == 0) { calendar.setYear(1); hacked = true; } XMLGregorianCalendar result = (XMLGregorianCalendar) calendar.clone(); if (hacked) { // reset everything calendar.setYear(0); // -1 could also be considered result.setYear(0); } return result; }
public AbstractDateTimeValue adjustedToTimezone(DayTimeDurationValue offset) throws XPathException { if (offset == null) offset = new DayTimeDurationValue(TimeUtils.getInstance().getLocalTimezoneOffsetMillis()); validateTimezone(offset); XMLGregorianCalendar xgc = (XMLGregorianCalendar) calendar.clone(); if (xgc.getTimezone() != DatatypeConstants.FIELD_UNDEFINED) { if (getType() == Type.DATE) xgc.setTime(0, 0, 0); // set the fields so we don't lose precision when shifting timezones xgc = xgc.normalize(); xgc.add(offset.duration); } try { xgc.setTimezone((int) (offset.getValue() / 60)); } catch (IllegalArgumentException e) { throw new XPathException("illegal timezone offset " + offset, e); } return createSameKind(xgc); }
public Object clone() { return calendar.clone(); }
public GDayValue(XMLGregorianCalendar calendar) throws XPathException { super(stripCalendar((XMLGregorianCalendar) calendar.clone())); }
public AbstractDateTimeValue withoutTimezone() throws XPathException { XMLGregorianCalendar xgc = (XMLGregorianCalendar) calendar.clone(); xgc.setTimezone(DatatypeConstants.FIELD_UNDEFINED); return createSameKind(xgc); }