/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2001 - 2013 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved. */ package org.pentaho.reporting.engine.classic.core.function.date; import org.pentaho.reporting.engine.classic.core.ResourceBundleFactory; import org.pentaho.reporting.engine.classic.core.function.AbstractExpression; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; /** * The DateExpression can be used to construct a static date object. The Calendar object used as base is initialized to * the current date. Fields that are not set, are ignored. * <p/> * To construct dates from values read from the data-row, use the {@link VariableDateExpression} instead. * * @author Thomas Morgner */ public class DateExpression extends AbstractExpression { /** * A property holding the month of the year. */ private Integer month; /** * A property holding the year. */ private Integer year; /** * A property holding the hour of the day. This property uses the 24-hour system. */ private Integer hour; /** * A property holding the minute. */ private Integer minute; /** * A property holding the second. */ private Integer second; /** * A property holding milli-seconds. */ private Integer milliSecond; /** * A property holding time in milli-seconds since 01-01-1970. */ private Long time; /** * A property holding time in seconds since 01-01-1970. */ private Long epochTime; /** * A property holding the day of the week. */ private Integer dayOfWeek; /** * A property holding the day of the year. */ private Integer dayOfYear; /** * A property holding the day of the month. */ private Integer dayOfMonth; /** * A property holding the day of the week in the month. */ private Integer dayOfWeekInMonth; /** * A property holding the time-zone. */ private TimeZone timeZone; /** * A property holding the week of the year. */ private Integer weekOfYear; /** * A property holding the week of the month. */ private Integer weekOfMonth; /** * Default Constructor. */ public DateExpression() { } /** * Returns the current time-zone. * * @return the time-zone or null, if none is set. */ public TimeZone getTimeZone() { return timeZone; } /** * Defines the timezone. If none is defined here, the locale's default timezone is used instead. * * @param timeZone * the time-zone. */ public void setTimeZone( final TimeZone timeZone ) { this.timeZone = timeZone; } /** * Returns the month property. * * @return the month property. */ public Integer getMonth() { return month; } /** * Defines the month property. * * @param month * the month property. */ public void setMonth( final Integer month ) { this.month = month; } /** * Returns the day property. This returns the day within the current month. * * @return the day of the month property. */ public Integer getDay() { return dayOfMonth; } /** * Defines the day property. This defines the day within the current month. * * @param day * the day of the month property. */ public void setDay( final Integer day ) { this.dayOfMonth = day; } /** * Returns the year property. * * @return the year property. */ public Integer getYear() { return year; } /** * Defines the year property. * * @param year * the year property. */ public void setYear( final Integer year ) { this.year = year; } /** * Returns the hour of the day property. This uses the 24-hour system. * * @return the hour property. */ public Integer getHour() { return hour; } /** * Defines the hour property. This uses the 24-hour system * * @param hour * the hour property. */ public void setHour( final Integer hour ) { this.hour = hour; } /** * Returns the minute property. * * @return the minute property. */ public Integer getMinute() { return minute; } /** * Defines the minute property. * * @param minute * the minute property. */ public void setMinute( final Integer minute ) { this.minute = minute; } /** * Returns the second property. * * @return the second property. */ public Integer getSecond() { return second; } /** * Defines the second property. * * @param second * the second property. */ public void setSecond( final Integer second ) { this.second = second; } /** * Returns the milli-second property. * * @return the milli-second property. */ public Integer getMilliSecond() { return milliSecond; } /** * Defines the year property. * * @param milliSecond * the milli-seconds property. */ public void setMilliSecond( final Integer milliSecond ) { this.milliSecond = milliSecond; } /** * Returns the time in milli-seconds since 01-Jan-1970. * * @return the time in milli-seconds since 01-Jan-1970. */ public Long getTime() { return time; } /** * Defines the time in milli-seconds since 01-Jan-1970. * * @param time * the time in milli-seconds since 01-Jan-1970. */ public void setTime( final Long time ) { this.time = time; } /** * Returns the time in seconds since 01-Jan-1970. * * @return the time in seconds since 01-Jan-1970. */ public Long getEpochTime() { return epochTime; } /** * Defines the time in seconds since 01-Jan-1970. * * @param epochTime * the time in seconds since 01-Jan-1970. */ public void setEpochTime( final Long epochTime ) { this.epochTime = epochTime; } /** * Returns the day of the week property. * * @return the day-of-the-week property. */ public Integer getDayOfWeek() { return dayOfWeek; } /** * Defines the day of the week property. * * @param dayOfWeek * the day-of-the-week property. */ public void setDayOfWeek( final Integer dayOfWeek ) { this.dayOfWeek = dayOfWeek; } /** * Returns the day of the year property. * * @return the day-of-the-year property. */ public Integer getDayOfYear() { return dayOfYear; } /** * Defines the day of the year property. * * @param dayOfYear * the day-of-the-year property. */ public void setDayOfYear( final Integer dayOfYear ) { this.dayOfYear = dayOfYear; } /** * Returns the day of the month property. * * @return the day-of-the-month property. */ public Integer getDayOfMonth() { return dayOfMonth; } /** * Defines the day of the month property. * * @param dayOfMonth * the day-of-the-month property. */ public void setDayOfMonth( final Integer dayOfMonth ) { this.dayOfMonth = dayOfMonth; } /** * Returns the day of the week in the month property. * * @return the day of the week in the month property. */ public Integer getDayOfWeekInMonth() { return dayOfWeekInMonth; } /** * Defines the day of the week in the month property. * * @param dayOfWeekInMonth * the day of the week in the month property. */ public void setDayOfWeekInMonth( final Integer dayOfWeekInMonth ) { this.dayOfWeekInMonth = dayOfWeekInMonth; } /** * Returns the week of the year property. * * @return the week of the year property. */ public Integer getWeekOfYear() { return weekOfYear; } /** * Defines the week of the year property. * * @param weekOfYear * the week of the year property. */ public void setWeekOfYear( final Integer weekOfYear ) { this.weekOfYear = weekOfYear; } public Integer getWeekOfMonth() { return weekOfMonth; } public void setWeekOfMonth( final Integer weekOfMonth ) { this.weekOfMonth = weekOfMonth; } /** * Return the current expression value. * <P> * The value depends (obviously) on the expression implementation. * * @return the value of the function. */ public Object getValue() { final Calendar calendar = getCalendar(); configureCalendar( calendar ); return calendar.getTime(); } /** * Configures the given Calendar instance by applying all defined fields to it. * * @param calendar * the week of the year property. */ protected void configureCalendar( final Calendar calendar ) { if ( time != null ) { calendar.setTime( new Date( time.longValue() ) ); } if ( epochTime != null ) { calendar.setTime( new Date( epochTime.longValue() * 1000 ) ); } if ( month != null ) { calendar.set( Calendar.MONTH, month.intValue() ); } if ( dayOfMonth != null ) { calendar.set( Calendar.DAY_OF_MONTH, dayOfMonth.intValue() ); } if ( year != null ) { calendar.set( Calendar.YEAR, year.intValue() ); } if ( hour != null ) { calendar.set( Calendar.HOUR_OF_DAY, hour.intValue() ); } if ( minute != null ) { calendar.set( Calendar.MINUTE, minute.intValue() ); } if ( second != null ) { calendar.set( Calendar.SECOND, second.intValue() ); } if ( milliSecond != null ) { calendar.set( Calendar.MILLISECOND, milliSecond.intValue() ); } if ( dayOfWeek != null ) { calendar.set( Calendar.DAY_OF_WEEK, dayOfWeek.intValue() ); } if ( dayOfYear != null ) { calendar.set( Calendar.DAY_OF_YEAR, dayOfYear.intValue() ); } if ( dayOfWeekInMonth != null ) { calendar.set( Calendar.DAY_OF_WEEK_IN_MONTH, dayOfWeekInMonth.intValue() ); } if ( weekOfYear != null ) { calendar.set( Calendar.WEEK_OF_YEAR, weekOfYear.intValue() ); } if ( weekOfMonth != null ) { calendar.set( Calendar.WEEK_OF_MONTH, weekOfMonth.intValue() ); } if ( timeZone != null ) { calendar.setTimeZone( getTimeZone() ); } } /** * Create a new calendar instance. This implementation uses Calendar.getInstance(..) to create the Calendar, and * therefore the result depends on the locale of the report. * * @return the calendar. */ protected Calendar getCalendar() { final ResourceBundleFactory rf = getResourceBundleFactory(); return Calendar.getInstance( rf.getLocale() ); } }