/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.core.el.datetime; import org.mule.runtime.api.exception.MuleRuntimeException; import org.mule.runtime.core.api.el.datetime.Instant; import org.mule.runtime.core.config.i18n.CoreMessages; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Locale; import java.util.TimeZone; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import org.apache.commons.lang.LocaleUtils; public abstract class AbstractInstant implements Instant { protected Locale locale; protected Calendar calendar; protected static final DatatypeFactory datatypeFactory; static { try { datatypeFactory = DatatypeFactory.newInstance(); } catch (DatatypeConfigurationException e) { throw new Error(e); } } public AbstractInstant(Calendar calendar, Locale locale) { this.calendar = calendar; this.locale = locale; } public AbstractInstant() { this.calendar = Calendar.getInstance(Locale.getDefault()); this.locale = Locale.getDefault(); } @Override public boolean isBefore(Instant date) { return calendar.before(date.toCalendar()); } @Override public boolean isAfter(Instant date) { return calendar.after(date.toCalendar()); } @Override public String format() { return toString(); } @Override public String format(String pattern) { SimpleDateFormat dateFormat = new SimpleDateFormat(pattern, locale); dateFormat.setTimeZone(calendar.getTimeZone()); return dateFormat.format(calendar.getTime()); } @Override public String getTimeZone() { return calendar.getTimeZone().getDisplayName(locale); } @Override public Instant withTimeZone(String newTimezone) { TimeZone timeZone = TimeZone.getTimeZone(newTimezone); calendar.add(Calendar.MILLISECOND, -timeZone.getOffset(calendar.getTimeInMillis())); calendar.setTimeZone(timeZone); return this; } @Override public Instant changeTimeZone(String newTimezone) { // Workaround for issues with java.util.Calendar. Ensure Calendar is in right state before updating // timeZone calendar.get(Calendar.ERA); calendar.setTimeZone(TimeZone.getTimeZone(newTimezone)); return this; } @Override public Instant withLocale(String locale) { this.locale = LocaleUtils.toLocale(locale); Calendar newCalendar = Calendar.getInstance(calendar.getTimeZone(), this.locale); newCalendar.setTime(calendar.getTime()); this.calendar = newCalendar; return this; } @Override public Calendar toCalendar() { return calendar; } @Override public java.util.Date toDate() { return calendar.getTime(); } @Override public XMLGregorianCalendar toXMLCalendar() throws DatatypeConfigurationException { if (calendar instanceof GregorianCalendar) { return datatypeFactory.newXMLGregorianCalendar((GregorianCalendar) calendar); } else { throw new MuleRuntimeException(CoreMessages .createStaticMessage("org.mule.runtime.core.el.DateTime.toXMLCalendar() does not support non-gregorian calendars.")); } } private int getTimeZoneOffset() { return calendar.get(Calendar.ZONE_OFFSET); } @Override public boolean equals(Object obj) { if (!(obj instanceof AbstractInstant)) { return false; } else { AbstractInstant other = (AbstractInstant) obj; return calendar.getTimeInMillis() == other.calendar.getTimeInMillis() && calendar.getFirstDayOfWeek() == other.calendar.getFirstDayOfWeek() && calendar.getMinimalDaysInFirstWeek() == other.calendar.getMinimalDaysInFirstWeek() && getTimeZoneOffset() == other.getTimeZoneOffset(); } } }