package org.codehaus.mojo.dashboard.report.plugin.configuration;
/*
* Copyright 2007 David Vicente
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.util.Calendar;
import java.util.Date;
/**
* @author <a href="dvicente72@gmail.com">David Vicente</a>
*
*/
public class PeriodUtils
{
private static final int PATTERN_MINUS_SUBSTR_LENGTH = 5;
private static final int PATTERN_PLUS_SUBSTR_LENGTH = 4;
private static final int DELTA_NEXT_WEEK = 7;
private static final int DELTA_PREVIOUS_WEEK = -DELTA_NEXT_WEEK;
private static final int MILLISECOND_END_OF_DAY = 999;
private static final int SECOND_END_OF_DAY = 59;
private static final int MINUTE_END_OF_DAY = 59;
private static final int HOUR_END_OF_DAY = 23;
public static final String NOW = "Now";
public static final String STARTOF_TODAY = "Startof_today";
public static final String ENDOF_TODAY = "Endof_today";
public static final String STARTOF_TOMORROW = "Startof_tomorrow";
public static final String ENDOF_TOMORROW = "Endof_tomorrow";
public static final String STARTOF_YESTERDAY = "Startof_yesterday";
public static final String ENDOF_YESTERDAY = "Endof_yesterday";
public static final String STARTOF_THISWEEK = "Startof_thisweek";
public static final String ENDOF_THISWEEK = "Endof_thisweek";
public static final String STARTOF_NEXTWEEK = "Startof_nextweek";
public static final String ENDOF_NEXTWEEK = "Endof_nextweek";
public static final String STARTOF_LASTWEEK = "Startof_lastweek";
public static final String ENDOF_LASTWEEK = "Endof_lastweek";
public static final String STARTOF_THISMONTH = "Startof_thismonth";
public static final String ENDOF_THISMONTH = "Endof_thismonth";
public static final String STARTOF_LASTMONTH = "Startof_lastmonth";
public static final String ENDOF_LASTMONTH = "Endof_lastmonth";
public static final String STARTOF_NEXTMONTH = "Startof_nextmonth";
public static final String ENDOF_NEXTMONTH = "Endof_nextmonth";
public static final String STARTOF_THISYEAR = "Startof_thisyear";
public static final String ENDOF_THISYEAR = "Endof_thisyear";
public static final String STARTOF_LASTYEAR = "Startof_lastyear";
public static final String ENDOF_LASTYEAR = "Endof_lastyear";
public static final String STARTOF_NEXTYEAR = "Startof_nextyear";
public static final String ENDOF_NEXTYEAR = "Endof_nextyear";
/**
* Plus[0-9]{1,3}
*/
public static final String PATTERN_PLUS = "Plus";
/**
* Minus[0-9]{1,3}
*/
public static final String PATTERN_MINUS = "Minus";
/**
*
* @param pattern
* @return
*/
public static Date getDateFromPattern( String pattern )
{
return getDateFromPattern( pattern, new Date( System.currentTimeMillis() ) );
}
/**
*
* @param pattern
* @param currentDate
* @return
*/
public static Date getDateFromPattern( String pattern, Date currentDate )
{
Date returnDate = null;
if ( pattern != null && pattern.length() > 0 )
{
Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek( Calendar.MONDAY );
cal.setTime( currentDate );
if ( NOW.equals( pattern ) )
{
returnDate = currentDate;
}
else if ( STARTOF_TODAY.equals( pattern ) )
{
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
returnDate = cal.getTime();
}
else if ( ENDOF_TODAY.equals( pattern ) )
{
cal.set( Calendar.HOUR_OF_DAY, HOUR_END_OF_DAY );
cal.set( Calendar.MINUTE, MINUTE_END_OF_DAY );
cal.set( Calendar.SECOND, SECOND_END_OF_DAY );
cal.set( Calendar.MILLISECOND, MILLISECOND_END_OF_DAY );
returnDate = cal.getTime();
}
else if ( STARTOF_TOMORROW.equals( pattern ) )
{
cal.add( Calendar.DAY_OF_MONTH, 1 );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
returnDate = cal.getTime();
}
else if ( ENDOF_TOMORROW.equals( pattern ) )
{
cal.add( Calendar.DAY_OF_MONTH, 1 );
cal.set( Calendar.HOUR_OF_DAY, HOUR_END_OF_DAY );
cal.set( Calendar.MINUTE, MINUTE_END_OF_DAY );
cal.set( Calendar.SECOND, SECOND_END_OF_DAY );
cal.set( Calendar.MILLISECOND, MILLISECOND_END_OF_DAY );
returnDate = cal.getTime();
}
else if ( STARTOF_YESTERDAY.equals( pattern ) )
{
cal.add( Calendar.DAY_OF_MONTH, -1 );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
returnDate = cal.getTime();
}
else if ( ENDOF_YESTERDAY.equals( pattern ) )
{
cal.add( Calendar.DAY_OF_MONTH, -1 );
cal.set( Calendar.HOUR_OF_DAY, HOUR_END_OF_DAY );
cal.set( Calendar.MINUTE, MINUTE_END_OF_DAY );
cal.set( Calendar.SECOND, SECOND_END_OF_DAY );
cal.set( Calendar.MILLISECOND, MILLISECOND_END_OF_DAY );
returnDate = cal.getTime();
}
else if ( STARTOF_THISWEEK.equals( pattern ) )
{
cal.set( Calendar.DAY_OF_WEEK, Calendar.MONDAY );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
returnDate = cal.getTime();
}
else if ( ENDOF_THISWEEK.equals( pattern ) )
{
cal.set( Calendar.DAY_OF_WEEK, Calendar.SATURDAY );
cal.add( Calendar.DAY_OF_MONTH, 1 );
cal.set( Calendar.HOUR_OF_DAY, HOUR_END_OF_DAY );
cal.set( Calendar.MINUTE, MINUTE_END_OF_DAY );
cal.set( Calendar.SECOND, SECOND_END_OF_DAY );
cal.set( Calendar.MILLISECOND, MILLISECOND_END_OF_DAY );
returnDate = cal.getTime();
}
else if ( STARTOF_NEXTWEEK.equals( pattern ) )
{
cal.add( Calendar.DAY_OF_MONTH, DELTA_NEXT_WEEK );
cal.set( Calendar.DAY_OF_WEEK, Calendar.MONDAY );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
returnDate = cal.getTime();
}
else if ( ENDOF_NEXTWEEK.equals( pattern ) )
{
cal.add( Calendar.DAY_OF_MONTH, DELTA_NEXT_WEEK );
cal.set( Calendar.DAY_OF_WEEK, Calendar.SATURDAY );
cal.add( Calendar.DAY_OF_MONTH, 1 );
cal.set( Calendar.HOUR_OF_DAY, HOUR_END_OF_DAY );
cal.set( Calendar.MINUTE, MINUTE_END_OF_DAY );
cal.set( Calendar.SECOND, SECOND_END_OF_DAY );
cal.set( Calendar.MILLISECOND, MILLISECOND_END_OF_DAY );
returnDate = cal.getTime();
}
else if ( STARTOF_LASTWEEK.equals( pattern ) )
{
cal.add( Calendar.DAY_OF_MONTH, DELTA_PREVIOUS_WEEK );
cal.set( Calendar.DAY_OF_WEEK, Calendar.MONDAY );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
returnDate = cal.getTime();
}
else if ( ENDOF_LASTWEEK.equals( pattern ) )
{
cal.add( Calendar.DAY_OF_MONTH, DELTA_PREVIOUS_WEEK );
cal.set( Calendar.DAY_OF_WEEK, Calendar.SATURDAY );
cal.add( Calendar.DAY_OF_MONTH, 1 );
cal.set( Calendar.HOUR_OF_DAY, HOUR_END_OF_DAY );
cal.set( Calendar.MINUTE, MINUTE_END_OF_DAY );
cal.set( Calendar.SECOND, SECOND_END_OF_DAY );
cal.set( Calendar.MILLISECOND, MILLISECOND_END_OF_DAY );
returnDate = cal.getTime();
}
else if ( STARTOF_THISMONTH.equals( pattern ) )
{
cal.set( Calendar.DAY_OF_MONTH, 1 );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
returnDate = cal.getTime();
}
else if ( ENDOF_THISMONTH.equals( pattern ) )
{
cal.set( Calendar.DAY_OF_MONTH, cal.getActualMaximum( Calendar.DAY_OF_MONTH ) );
cal.set( Calendar.HOUR_OF_DAY, HOUR_END_OF_DAY );
cal.set( Calendar.MINUTE, MINUTE_END_OF_DAY );
cal.set( Calendar.SECOND, SECOND_END_OF_DAY );
cal.set( Calendar.MILLISECOND, MILLISECOND_END_OF_DAY );
returnDate = cal.getTime();
}
else if ( STARTOF_LASTMONTH.equals( pattern ) )
{
cal.set( Calendar.DAY_OF_MONTH, 1 );
cal.add( Calendar.MONTH, -1 );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
returnDate = cal.getTime();
}
else if ( ENDOF_LASTMONTH.equals( pattern ) )
{
cal.add( Calendar.MONTH, -1 );
cal.set( Calendar.DAY_OF_MONTH, cal.getActualMaximum( Calendar.DAY_OF_MONTH ) );
cal.set( Calendar.HOUR_OF_DAY, HOUR_END_OF_DAY );
cal.set( Calendar.MINUTE, MINUTE_END_OF_DAY );
cal.set( Calendar.SECOND, SECOND_END_OF_DAY );
cal.set( Calendar.MILLISECOND, MILLISECOND_END_OF_DAY );
returnDate = cal.getTime();
}
else if ( STARTOF_NEXTMONTH.equals( pattern ) )
{
cal.set( Calendar.DAY_OF_MONTH, 1 );
cal.add( Calendar.MONTH, 1 );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
returnDate = cal.getTime();
}
else if ( ENDOF_NEXTMONTH.equals( pattern ) )
{
cal.add( Calendar.MONTH, 1 );
cal.set( Calendar.DAY_OF_MONTH, cal.getActualMaximum( Calendar.DAY_OF_MONTH ) );
cal.set( Calendar.HOUR_OF_DAY, HOUR_END_OF_DAY );
cal.set( Calendar.MINUTE, MINUTE_END_OF_DAY );
cal.set( Calendar.SECOND, SECOND_END_OF_DAY );
cal.set( Calendar.MILLISECOND, MILLISECOND_END_OF_DAY );
returnDate = cal.getTime();
}
else if ( STARTOF_THISYEAR.equals( pattern ) )
{
cal.set( Calendar.DAY_OF_MONTH, 1 );
cal.set( Calendar.MONTH, Calendar.JANUARY );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
returnDate = cal.getTime();
}
else if ( ENDOF_THISYEAR.equals( pattern ) )
{
cal.set( Calendar.MONTH, Calendar.DECEMBER );
cal.set( Calendar.DAY_OF_MONTH, cal.getActualMaximum( Calendar.DAY_OF_MONTH ) );
cal.set( Calendar.HOUR_OF_DAY, HOUR_END_OF_DAY );
cal.set( Calendar.MINUTE, MINUTE_END_OF_DAY );
cal.set( Calendar.SECOND, SECOND_END_OF_DAY );
cal.set( Calendar.MILLISECOND, MILLISECOND_END_OF_DAY );
returnDate = cal.getTime();
}
else if ( STARTOF_LASTYEAR.equals( pattern ) )
{
cal.set( Calendar.DAY_OF_MONTH, 1 );
cal.set( Calendar.MONTH, Calendar.JANUARY );
cal.add( Calendar.YEAR, -1 );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
returnDate = cal.getTime();
}
else if ( ENDOF_LASTYEAR.equals( pattern ) )
{
cal.set( Calendar.MONTH, Calendar.DECEMBER );
cal.add( Calendar.YEAR, -1 );
cal.set( Calendar.DAY_OF_MONTH, cal.getActualMaximum( Calendar.DAY_OF_MONTH ) );
cal.set( Calendar.HOUR_OF_DAY, HOUR_END_OF_DAY );
cal.set( Calendar.MINUTE, MINUTE_END_OF_DAY );
cal.set( Calendar.SECOND, SECOND_END_OF_DAY );
cal.set( Calendar.MILLISECOND, MILLISECOND_END_OF_DAY );
returnDate = cal.getTime();
}
else if ( STARTOF_NEXTYEAR.equals( pattern ) )
{
cal.set( Calendar.DAY_OF_MONTH, 1 );
cal.set( Calendar.MONTH, Calendar.JANUARY );
cal.add( Calendar.YEAR, 1 );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
returnDate = cal.getTime();
}
else if ( ENDOF_NEXTYEAR.equals( pattern ) )
{
cal.set( Calendar.MONTH, Calendar.DECEMBER );
cal.add( Calendar.YEAR, 1 );
cal.set( Calendar.DAY_OF_MONTH, cal.getActualMaximum( Calendar.DAY_OF_MONTH ) );
cal.set( Calendar.HOUR_OF_DAY, HOUR_END_OF_DAY );
cal.set( Calendar.MINUTE, MINUTE_END_OF_DAY );
cal.set( Calendar.SECOND, SECOND_END_OF_DAY );
cal.set( Calendar.MILLISECOND, MILLISECOND_END_OF_DAY );
returnDate = cal.getTime();
}
else if ( pattern.startsWith( PATTERN_PLUS ) )
{
String strDelta = pattern.substring( PATTERN_PLUS_SUBSTR_LENGTH, pattern.length() );
int delta = Integer.parseInt( strDelta );
cal.add( Calendar.DAY_OF_MONTH, delta );
returnDate = cal.getTime();
}
else if ( pattern.startsWith( PATTERN_MINUS ) )
{
String strDelta = pattern.substring( PATTERN_MINUS_SUBSTR_LENGTH, pattern.length() );
int delta = Integer.parseInt( strDelta );
cal.add( Calendar.DAY_OF_MONTH, -( delta ) );
returnDate = cal.getTime();
}
}
return returnDate;
}
}