Issue #2636 - Changed subscription code to use gmt calendar.

Former-commit-id: 6e01cdb78e [formerly 6e01cdb78e [formerly 3e75bd3e55517bca7c85213307ed67973c2f145e]]
Former-commit-id: 1caacacfe3
Former-commit-id: f4da152d87
This commit is contained in:
Mike Duff 2014-01-28 11:09:33 -06:00
parent f7c3c8c83d
commit 1f4cc8681d
3 changed files with 205 additions and 54 deletions

View file

@ -1,19 +1,19 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
@ -65,9 +65,10 @@ import com.raytheon.uf.common.time.util.TimeUtil;
* Nov 14, 2013 2548 mpduff Add a subscription type slot.
* Jan 08, 2014 2615 bgonzale Implement calculate start and calculate end methods.
* Jan 14, 2014 2459 mpduff Add subscription state.
* Jan 20, 2013 2398 dhladky Fixed rescheduling beyond active period/expired window.
* Jan 24, 2013 2709 bgonzale Fix setting of active period end. Change active period checks
* Jan 20, 2014 2398 dhladky Fixed rescheduling beyond active period/expired window.
* Jan 24, 2014 2709 bgonzale Fix setting of active period end. Change active period checks
* to check day of year. removed now unused active period methods.
* Jan 28, 2014 2636 mpduff Changed to use GMT calendar.
*
* </pre>
*
@ -472,15 +473,15 @@ public abstract class RecurringSubscription<T extends Time, C extends Coverage>
private Integer getStartActivePeriodDayOfYear() {
if (startActivePeriodDayOfYear == null && activePeriodStart != null) {
startActivePeriodDayOfYear = TimeUtil
.newCalendar(activePeriodStart).get(Calendar.DAY_OF_YEAR);
startActivePeriodDayOfYear = TimeUtil.newGmtCalendar(
activePeriodStart).get(Calendar.DAY_OF_YEAR);
}
return startActivePeriodDayOfYear;
}
private Integer getEndActivePeriodDayOfYear() {
if (endActivePeriodDayOfYear == null && activePeriodEnd != null) {
endActivePeriodDayOfYear = TimeUtil.newCalendar(activePeriodEnd)
endActivePeriodDayOfYear = TimeUtil.newGmtCalendar(activePeriodEnd)
.get(Calendar.DAY_OF_YEAR);
}
return endActivePeriodDayOfYear;
@ -488,14 +489,34 @@ public abstract class RecurringSubscription<T extends Time, C extends Coverage>
@Override
public Calendar calculateStart(Calendar startConstraint) {
return TimeUtil.newCalendar(TimeUtil.max(subscriptionStart,
startConstraint));
if (subscriptionStart == null) {
return startConstraint;
}
long subStartMillis = subscriptionStart.getTime();
long constaintMillis = startConstraint.getTimeInMillis();
if (subStartMillis > constaintMillis) {
return TimeUtil.newGmtCalendar(subscriptionStart);
}
return startConstraint;
}
@Override
public Calendar calculateEnd(Calendar endConstraint) {
return TimeUtil.newCalendar(TimeUtil
.min(subscriptionEnd, endConstraint));
if (subscriptionEnd == null) {
return endConstraint;
}
long subEndMillis = subscriptionEnd.getTime();
long constaintMillis = endConstraint.getTimeInMillis();
if (subEndMillis < constaintMillis) {
return TimeUtil.newGmtCalendar(subscriptionEnd);
}
return endConstraint;
}
/**
@ -891,9 +912,10 @@ public abstract class RecurringSubscription<T extends Time, C extends Coverage>
return expired;
}
/**
* Check for expiration on date
*
* @param date
* @return
*/
@ -941,9 +963,10 @@ public abstract class RecurringSubscription<T extends Time, C extends Coverage>
return subscriptionState == SubscriptionState.ON
&& !checkAndSetExpiration();
}
/**
* Should this be scheduled for this time.
*
* @param checkDate
* @return
*/
@ -951,10 +974,11 @@ public abstract class RecurringSubscription<T extends Time, C extends Coverage>
if (!isExpired(checkCal.getTime()) && inActivePeriodWindow(checkCal)) {
return true;
}
return false;
}
@Override
public boolean inActivePeriodWindow(Calendar checkDate) {
if (activePeriodStart == null && activePeriodEnd == null) {
// no active period set
@ -967,7 +991,7 @@ public abstract class RecurringSubscription<T extends Time, C extends Coverage>
boolean isAfterPeriodStart = startDay <= checkDay;
boolean isBeforePeriodEnd = checkDay < endDay;
boolean periodCrossesYearBoundary = endDay < startDay;
if (periodCrossesYearBoundary) {
return isAfterPeriodStart || isBeforePeriodEnd;
} else {
@ -1084,4 +1108,4 @@ public abstract class RecurringSubscription<T extends Time, C extends Coverage>
public boolean shouldUpdate() {
return shouldUpdate;
}
}
}

View file

@ -56,6 +56,7 @@ import com.raytheon.uf.common.time.domain.api.ITimePoint;
* Nov 05, 2013 2499 rjpeter Added prettyDuration.
* Jan 08, 2014 2615 bgonzale Added Calendar min and max methods.
* Added newGmtCalendar from a date method.
* Jan 28, 2014 2636 mpduff Removed unused methods.
* </pre>
*
* @author njensen
@ -181,6 +182,13 @@ public final class TimeUtil {
*/
static ITimeStrategy timeStrategy = SYSTEM_TIME_STRATEGY;
/**
* Disabled constructor.
*/
private TimeUtil() {
}
/**
* Converts a Calendar in the local time zone to a GMT date
*
@ -327,30 +335,6 @@ public final class TimeUtil {
|| (laterCal.get(Calendar.YEAR) > earlierCal.get(Calendar.YEAR));
}
/**
* Min comparison of a Date and a Calendar; returns the lesser.
*
* @param lhs
* @param rhs
* @return the lesser of a Data and a Calendar; returns null if either is
* null.
*/
public static Calendar min(Date lhs, Calendar rhs) {
return min(TimeUtil.newCalendar(lhs), rhs);
}
/**
* Max comparison of a Date and a Calendar; returns the greater.
*
* @param lhs
* @param rhs
* @return the greater of a Data and a Calendar; returns null if either is
* null.
*/
public static Calendar max(Date lhs, Calendar rhs) {
return max(TimeUtil.newCalendar(lhs), rhs);
}
/**
* Max comparison of two Calendars; returns the greater.
*
@ -577,14 +561,9 @@ public final class TimeUtil {
return timeString.toString();
}
/**
* Disabled constructor.
*/
private TimeUtil() {
}
/**
* New Calendar from a Date
*
* @param date
* @return
*/
@ -596,7 +575,7 @@ public final class TimeUtil {
}
return t;
}
/**
* New Calendar from an existing calendar
*
@ -611,7 +590,7 @@ public final class TimeUtil {
}
return t;
}
/**
* New GMT Calendar from a Date
*
@ -637,11 +616,11 @@ public final class TimeUtil {
* @return
*/
public static Calendar addCurrentYearCalendar(final Calendar calendar) {
Calendar yearTime = TimeUtil.newGmtCalendar();
calendar.set(Calendar.YEAR, yearTime.get(Calendar.YEAR));
return calendar;
}
}

View file

@ -25,8 +25,10 @@ import static org.hamcrest.CoreMatchers.not;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import javax.xml.bind.JAXBException;
@ -54,8 +56,9 @@ import com.raytheon.uf.common.time.util.TimeUtilTest;
* Jan 11, 2013 1453 djohnson Add test for active period crossing year boundary.
* Mar 28, 2013 1841 djohnson Subscription is now UserSubscription.
* May 15, 2013 1040 mpduff Office Id now a set.
* Oct 21, 2013 2292 mpduff Implement multiple data types
* Jan 14, 2014 2459 mpduff Change Subscription status code
* Oct 21, 2013 2292 mpduff Implement multiple data types.
* Jan 14, 2014 2459 mpduff Change Subscription status code.
* Jan 28, 2014 2636 mpduff Added testInWindow test method.
*
* </pre>
*
@ -268,4 +271,149 @@ public class SiteSubscriptionTest {
System.out.println(new JAXBManager(SiteSubscription.class)
.marshalToXml(subscription));
}
@Test
public void testGetStatusForOneDayWindow() {
final Date tomorrow = new Date(TimeUtil.currentTimeMillis()
+ (TimeUtil.MILLIS_PER_DAY));
final Date today = new Date(TimeUtil.currentTimeMillis());
Subscription subscription = new SubscriptionBuilder()
.withActivePeriodStart(today).withActivePeriodEnd(tomorrow)
.build();
assertThat(subscription.getStatus(),
is(equalTo(SubscriptionStatus.ACTIVE)));
}
@Test
public void testInWindowMethod() {
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
Calendar startCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
Calendar endCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
Calendar checkCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
startCal.set(Calendar.MONTH, Calendar.DECEMBER);
startCal.set(Calendar.DAY_OF_MONTH, 20);
endCal.set(Calendar.MONTH, Calendar.JANUARY);
endCal.set(Calendar.DAY_OF_MONTH, 10);
// Active window crosses year boundary
// First check Jan 1
checkCal.set(Calendar.MONTH, Calendar.JANUARY);
checkCal.set(Calendar.DAY_OF_MONTH, 1);
startCal = TimeUtil.minCalendarFields(startCal, Calendar.HOUR_OF_DAY,
Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND);
endCal = TimeUtil.minCalendarFields(endCal, Calendar.HOUR_OF_DAY,
Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND);
checkCal = TimeUtil.minCalendarFields(checkCal, Calendar.HOUR_OF_DAY,
Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND);
Subscription subscription = new SubscriptionBuilder()
.withActivePeriodStart(startCal.getTime())
.withActivePeriodEnd(endCal.getTime()).build();
System.out.println("\nStartCal: " + sdf.format(startCal.getTime()));
System.out.println("EndCal: " + sdf.format(endCal.getTime()));
System.out.println("CheckCal: " + sdf.format(checkCal.getTime()));
assertThat(subscription.inActivePeriodWindow(checkCal),
is(equalTo(Boolean.TRUE)));
// Next check Starting Day
checkCal.set(Calendar.MONTH, Calendar.DECEMBER);
checkCal.set(Calendar.DAY_OF_MONTH, 20);
System.out.println("\nStartCal: " + sdf.format(startCal.getTime()));
System.out.println("EndCal: " + sdf.format(endCal.getTime()));
System.out.println("CheckCal: " + sdf.format(checkCal.getTime()));
assertThat(subscription.inActivePeriodWindow(checkCal),
is(equalTo(Boolean.TRUE)));
// Next check Ending Day - Should be outside window
checkCal.set(Calendar.MONTH, Calendar.JANUARY);
checkCal.set(Calendar.DAY_OF_MONTH, 10);
System.out.println("\nStartCal: " + sdf.format(startCal.getTime()));
System.out.println("EndCal: " + sdf.format(endCal.getTime()));
System.out.println("CheckCal: " + sdf.format(checkCal.getTime()));
assertThat(subscription.inActivePeriodWindow(checkCal),
is(equalTo(Boolean.FALSE)));
// Next check before starting Day - Should be outside window
checkCal.set(Calendar.MONTH, Calendar.OCTOBER);
checkCal.set(Calendar.DAY_OF_MONTH, 10);
System.out.println("\nStartCal: " + sdf.format(startCal.getTime()));
System.out.println("EndCal: " + sdf.format(endCal.getTime()));
System.out.println("CheckCal: " + sdf.format(checkCal.getTime()));
assertThat(subscription.inActivePeriodWindow(checkCal),
is(equalTo(Boolean.FALSE)));
// Next check after ending Day - Should be outside window
checkCal.set(Calendar.MONTH, Calendar.MARCH);
checkCal.set(Calendar.DAY_OF_MONTH, 10);
System.out.println("\nStartCal: " + sdf.format(startCal.getTime()));
System.out.println("EndCal: " + sdf.format(endCal.getTime()));
System.out.println("CheckCal: " + sdf.format(checkCal.getTime()));
assertThat(subscription.inActivePeriodWindow(checkCal),
is(equalTo(Boolean.FALSE)));
// Change window to not be over year boundary
startCal.set(Calendar.MONTH, Calendar.MARCH);
startCal.set(Calendar.DAY_OF_MONTH, 1);
endCal.set(Calendar.MONTH, Calendar.OCTOBER);
endCal.set(Calendar.DAY_OF_MONTH, 1);
subscription = new SubscriptionBuilder()
.withActivePeriodStart(startCal.getTime())
.withActivePeriodEnd(endCal.getTime()).build();
// First check day in the window
checkCal.set(Calendar.MONTH, Calendar.JUNE);
checkCal.set(Calendar.DAY_OF_MONTH, 10);
System.out.println("\nStartCal: " + sdf.format(startCal.getTime()));
System.out.println("EndCal: " + sdf.format(endCal.getTime()));
System.out.println("CheckCal: " + sdf.format(checkCal.getTime()));
assertThat(subscription.inActivePeriodWindow(checkCal),
is(equalTo(Boolean.TRUE)));
// Check start day
checkCal.set(Calendar.MONTH, Calendar.MARCH);
checkCal.set(Calendar.DAY_OF_MONTH, 1);
System.out.println("\nStartCal: " + sdf.format(startCal.getTime()));
System.out.println("EndCal: " + sdf.format(endCal.getTime()));
System.out.println("CheckCal: " + sdf.format(checkCal.getTime()));
assertThat(subscription.inActivePeriodWindow(checkCal),
is(equalTo(Boolean.TRUE)));
// Check end day - should be outside window
checkCal.set(Calendar.MONTH, Calendar.OCTOBER);
checkCal.set(Calendar.DAY_OF_MONTH, 1);
System.out.println("\nStartCal: " + sdf.format(startCal.getTime()));
System.out.println("EndCal: " + sdf.format(endCal.getTime()));
System.out.println("CheckCal: " + sdf.format(checkCal.getTime()));
assertThat(subscription.inActivePeriodWindow(checkCal),
is(equalTo(Boolean.FALSE)));
// Check before start day - should be outside window
checkCal.set(Calendar.MONTH, Calendar.FEBRUARY);
checkCal.set(Calendar.DAY_OF_MONTH, 1);
System.out.println("\nStartCal: " + sdf.format(startCal.getTime()));
System.out.println("EndCal: " + sdf.format(endCal.getTime()));
System.out.println("CheckCal: " + sdf.format(checkCal.getTime()));
assertThat(subscription.inActivePeriodWindow(checkCal),
is(equalTo(Boolean.FALSE)));
// Check after end day - should be outside window
checkCal.set(Calendar.MONTH, Calendar.NOVEMBER);
checkCal.set(Calendar.DAY_OF_MONTH, 1);
System.out.println("\nStartCal: " + sdf.format(startCal.getTime()));
System.out.println("EndCal: " + sdf.format(endCal.getTime()));
System.out.println("CheckCal: " + sdf.format(checkCal.getTime()));
assertThat(subscription.inActivePeriodWindow(checkCal),
is(equalTo(Boolean.FALSE)));
}
}