From 30d0eb8552e4672dd3d3e5304dcd2e4b99dc03ea Mon Sep 17 00:00:00 2001 From: Mike Duff Date: Wed, 15 Jan 2014 09:19:17 -0600 Subject: [PATCH] Issue #2459 - Refactor the subscription status Former-commit-id: 245d76358e8de7e39192b64c930799e86932bde6 [formerly d03c012a549388fa23ced9a8c141f6f3dfc1f7f3 [formerly f94593867edcd4a0465c6a487f22c2725357de68] [formerly 245d76358e8de7e39192b64c930799e86932bde6 [formerly 3ab5b072627d0a8b0eabe12fb700f6a74319b5f9]]] Former-commit-id: d03c012a549388fa23ced9a8c141f6f3dfc1f7f3 [formerly f94593867edcd4a0465c6a487f22c2725357de68] Former-commit-id: d03c012a549388fa23ced9a8c141f6f3dfc1f7f3 Former-commit-id: 43810aa5f585ce3ae6fec1bd48ec9bb94e0f0550 --- ...aDeliveryProductBrowserDataDefinition.java | 4 +- .../subscription/CreateSubscriptionDlg.java | 8 +- .../subscription/SubscriptionManagerDlg.java | 7 +- .../SubscriptionManagerRowData.java | 4 +- .../subscription/subset/SubsetManagerDlg.java | 2 +- .../registry/RecurringSubscription.java | 121 +++++++++++------- .../datadelivery/registry/Subscription.java | 52 +++++--- .../common/datadelivery/registry/Utils.java | 44 ++++--- .../ebxml/SubscriptionFilterableQuery.java | 36 +++--- .../handlers/BaseSubscriptionHandler.java | 12 +- .../bandwidth/BandwidthManager.java | 13 +- .../registry/BaseSubscriptionFixture.java | 2 +- .../registry/SiteSubscriptionTest.java | 65 +++++++++- .../registry/SubscriptionBuilder.java | 13 +- 14 files changed, 250 insertions(+), 133 deletions(-) diff --git a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/DataDeliveryProductBrowserDataDefinition.java b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/DataDeliveryProductBrowserDataDefinition.java index a44b8d1f09..e0d3868526 100644 --- a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/DataDeliveryProductBrowserDataDefinition.java +++ b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/DataDeliveryProductBrowserDataDefinition.java @@ -33,7 +33,6 @@ import com.raytheon.uf.common.datadelivery.registry.Coverage; import com.raytheon.uf.common.datadelivery.registry.DataType; import com.raytheon.uf.common.datadelivery.registry.Subscription; import com.raytheon.uf.common.datadelivery.registry.Subscription.SubscriptionType; -import com.raytheon.uf.common.datadelivery.registry.Utils.SubscriptionStatus; import com.raytheon.uf.common.datadelivery.registry.handlers.IAdhocSubscriptionHandler; import com.raytheon.uf.common.datadelivery.registry.handlers.ISubscriptionHandler; import com.raytheon.uf.common.dataquery.requests.RequestConstraint; @@ -74,6 +73,7 @@ import com.raytheon.viz.pointdata.util.PointDataInventory; * Oct 13, 2013 2460 dhladky Added display of Adhoc subscriptions * Nov 19, 2013 2458 mpduff Only pull subscriptions for the local site * Nov 21, 2013 2554 dhladky Restored ADHOC's to working. + * Jan 14, 2014 2459 mpduff Change Subscription status code * * * @@ -403,7 +403,7 @@ public class DataDeliveryProductBrowserDataDefinition List subList = getSubscriptions(); for (Subscription s : subList) { - if (SubscriptionStatus.ACTIVE.toString().equals(s.getStatus()) + if (s.isActive() || s.getSubscriptionType().equals(SubscriptionType.QUERY)) { if (s.getDataSetType() == dataType) { activeSubList.add(s); diff --git a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/CreateSubscriptionDlg.java b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/CreateSubscriptionDlg.java index 598080bcb4..08c98b6d63 100644 --- a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/CreateSubscriptionDlg.java +++ b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/CreateSubscriptionDlg.java @@ -72,7 +72,6 @@ import com.raytheon.uf.common.datadelivery.registry.SharedSubscription; import com.raytheon.uf.common.datadelivery.registry.Subscription; import com.raytheon.uf.common.datadelivery.registry.Subscription.SubscriptionPriority; import com.raytheon.uf.common.datadelivery.registry.Time; -import com.raytheon.uf.common.datadelivery.registry.Utils.SubscriptionStatus; import com.raytheon.uf.common.datadelivery.registry.ebxml.DataSetQuery; import com.raytheon.uf.common.datadelivery.registry.handlers.DataDeliveryHandlers; import com.raytheon.uf.common.datadelivery.registry.handlers.IPendingSubscriptionHandler; @@ -144,6 +143,7 @@ import com.raytheon.viz.ui.presenter.components.ComboBoxConf; * Oct 21, 2013 2292 mpduff Close dialog on OK. * Nov 07, 2013 2291 skorolev Used showText() method for "Unable to Create Subscription" message. * Nov 08, 2013 2506 bgonzale Removed send notification when a subscription is updated and created. + * Jan 14, 2014 2459 mpduff Change Subscription status code * * * @@ -1088,14 +1088,11 @@ public class CreateSubscriptionDlg extends CaveSWTDialog { .parse(endText); subscription.setActivePeriodEnd(endPeriodDate); } - - subscription.setActive(true); } catch (ParseException e) { statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e); } } else { - subscription.setActive(true); subscription.setActivePeriodStart(null); subscription.setActivePeriodEnd(null); } @@ -1635,8 +1632,7 @@ public class CreateSubscriptionDlg extends CaveSWTDialog { // If currently in the window, assume starting from last year for // the start date - if (subscription.getStatus().equals( - SubscriptionStatus.ACTIVE.toString())) { + if (subscription.isActive()) { calendarYearToUse--; } diff --git a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/SubscriptionManagerDlg.java b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/SubscriptionManagerDlg.java index 0b81c53cd4..5a95043c85 100644 --- a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/SubscriptionManagerDlg.java +++ b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/SubscriptionManagerDlg.java @@ -147,6 +147,7 @@ import com.raytheon.viz.ui.presenter.IDisplay; * Nov 08, 2013 2506 bgonzale Removed send notification when a subscription is deleted. * Dec 05, 2013 2570 skorolev Show All subscriptions. * Jan 08, 2014 2642 mpduff Update dialog for permissions, adding site to shared + * Jan 14, 2014 2459 mpduff Change Subscription status code * * * @author mpduff @@ -1161,7 +1162,11 @@ public class SubscriptionManagerDlg extends CaveSWTDialog implements .getSubscriptionData().getDataRow(idx); Subscription sub = rowData.getSubscription(); - sub.setActive(activate); + if (activate) { + sub.activate(); + } else { + sub.deactivate(); + } try { SubscriptionServiceResult response = subscriptionService diff --git a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/SubscriptionManagerRowData.java b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/SubscriptionManagerRowData.java index b5d504ebbc..f92d1d876d 100644 --- a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/SubscriptionManagerRowData.java +++ b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/SubscriptionManagerRowData.java @@ -50,6 +50,7 @@ import com.raytheon.uf.viz.datadelivery.utils.DataDeliveryUtils.TABLE_TYPE; * Jan 25, 2012 1528 djohnson Priorities no longer need incrementing for display. * Apr 08, 2013 1826 djohnson Remove delivery options. * May 15, 2013 1040 mpduff Change Office IDs to set. + * Jan 14, 2014 2459 mpduff Change Subscription status code * * * @author mpduff @@ -472,8 +473,7 @@ public class SubscriptionManagerRowData implements this.setPriority(subscription.getPriority().getPriorityValue()); this.setSubscriptionStart(subscription.getSubscriptionStart()); this.setSubscriptionEnd(subscription.getSubscriptionEnd()); - this.setActive(subscription.isActive()); - this.setStatus(subscription.getStatus()); + this.setStatus(subscription.getStatus().toString()); } /** diff --git a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/subset/SubsetManagerDlg.java b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/subset/SubsetManagerDlg.java index 5553e9985e..b0d8986d29 100644 --- a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/subset/SubsetManagerDlg.java +++ b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/subset/SubsetManagerDlg.java @@ -138,6 +138,7 @@ import com.raytheon.viz.ui.presenter.IDisplay; * Oct 25, 2013 2292 mpduff Move overlap processing to edex. * Nov 14, 2013 2538 mpduff Added check for duplicate subscription. * Nov 14, 2013 2548 mpduff Set the subscription type (QUERY OR RECURRING) + * Jan 14, 2014 2459 mpduff Change Subscription status code * * * @author mpduff @@ -603,7 +604,6 @@ public abstract class SubsetManagerDlg extends CaveSWTDialog implements sub.setSubscriptionStart(this.subscription.getSubscriptionStart()); sub.setActivePeriodEnd(this.subscription.getActivePeriodEnd()); sub.setActivePeriodStart(this.subscription.getActivePeriodStart()); - sub.setActive(this.subscription.isActive()); sub.setPriority(this.subscription.getPriority()); } diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/RecurringSubscription.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/RecurringSubscription.java index 5b1453bcc7..37f1bd8371 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/RecurringSubscription.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/RecurringSubscription.java @@ -64,6 +64,7 @@ import com.raytheon.uf.common.time.util.TimeUtil; * Oct 30, 2013 2448 dhladky Fixed pulling data before and after activePeriod starting and ending. * 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. * * * @@ -95,7 +96,6 @@ public abstract class RecurringSubscription * New subscription name */ public RecurringSubscription(Subscription sub, String name) { - this.setActive(sub.isActive()); this.setActivePeriodEnd(sub.getActivePeriodEnd()); this.setActivePeriodStart(sub.getActivePeriodStart()); this.setCoverage(sub.getCoverage()); @@ -209,11 +209,6 @@ public abstract class RecurringSubscription @SlotAttribute(Subscription.DATA_SET_SLOT) private String dataSetName; - @XmlAttribute - @DynamicSerializeElement - @SlotAttribute - private boolean active; - @XmlAttribute @DynamicSerializeElement @SlotAttribute @@ -267,6 +262,11 @@ public abstract class RecurringSubscription @SlotAttribute(Subscription.SUBSCRIPTION_TYPE_SLOT) private SubscriptionType subscriptionType; + @XmlAttribute + @DynamicSerializeElement + @SlotAttribute(Subscription.SUBSCRIPTION_STATE_SLOT) + private SubscriptionState subscriptionState; + /** * Get subscription name. * @@ -454,8 +454,7 @@ public abstract class RecurringSubscription private Calendar getActivePeriodStart(Calendar base) { // active period values are month and day of month only, use base // Calendar for active period year - Calendar activePeriodStartCal = TimeUtil - .newCalendar(activePeriodStart); + Calendar activePeriodStartCal = TimeUtil.newCalendar(activePeriodStart); TimeUtil.minCalendarFields(activePeriodStartCal, Calendar.MILLISECOND, Calendar.SECOND, Calendar.MINUTE, Calendar.HOUR_OF_DAY); activePeriodStartCal.set(Calendar.YEAR, base.get(Calendar.YEAR)); @@ -484,8 +483,7 @@ public abstract class RecurringSubscription } else { realStart = startConstraint; } - return TimeUtil.newCalendar(TimeUtil.max(subscriptionStart, - realStart)); + return TimeUtil.newCalendar(TimeUtil.max(subscriptionStart, realStart)); } @Override @@ -704,18 +702,7 @@ public abstract class RecurringSubscription */ @Override public boolean isActive() { - return active; - } - - /** - * Set the subscription status to active. - * - * @param active - * subscription active - */ - @Override - public void setActive(boolean active) { - this.active = active; + return getStatus() == SubscriptionStatus.ACTIVE; } /** @@ -727,6 +714,9 @@ public abstract class RecurringSubscription @Override public void setValid(boolean valid) { this.valid = valid; + if (!valid) { + subscriptionState = SubscriptionState.OFF; + } } /** @@ -892,14 +882,14 @@ public abstract class RecurringSubscription * * @return true if status is expired */ - @Override - public boolean isExpired() { + private boolean isExpired() { Calendar cal = TimeUtil.newGmtCalendar(); Date today = cal.getTime(); boolean expired = false; if (this.getSubscriptionEnd() != null && today.after(this.getSubscriptionEnd())) { expired = true; + this.subscriptionState = SubscriptionState.OFF; } return expired; @@ -908,32 +898,40 @@ public abstract class RecurringSubscription /** * Get the current subscription status. * - * @return String value of SUBSCRIPTION_STATUS + * @return SUBSCRIPTION_STATUS */ @Override - public String getStatus() { - SubscriptionStatus status = SubscriptionStatus.INVALID; - - if (isValid()) { - if (isExpired()) { - status = SubscriptionStatus.EXPIRED; - } else if (!isActive()) { - status = SubscriptionStatus.INACTIVE; - } else { - Calendar cal = TimeUtil.newGmtCalendar(); - Date today = cal.getTime(); - - status = (inWindow(today)) ? SubscriptionStatus.ACTIVE - : SubscriptionStatus.INACTIVE; - - if (status == SubscriptionStatus.ACTIVE && isUnscheduled()) { - status = SubscriptionStatus.UNSCHEDULED; - } - } + public SubscriptionStatus getStatus() { + if (!isValid()) { + return SubscriptionStatus.INVALID; + } else if (isExpired()) { + return SubscriptionStatus.EXPIRED; + } else if (subscriptionState == SubscriptionState.OFF) { + return SubscriptionStatus.DEACTIVATED; } - return status.toString(); + // At this point the subscription is in the ON state + Calendar cal = TimeUtil.newGmtCalendar(); + Date today = cal.getTime(); + if (unscheduled) { + return SubscriptionStatus.UNSCHEDULED; + } else if (inWindow(today)) { + return SubscriptionStatus.ACTIVE; + } + + return SubscriptionStatus.INACTIVE; + } + + /** + * Return true if this subscription should be scheduled. Scheduling is based + * on the status of the subscription. Returns false if the subscription is + * expired or deactivated. + * + * @return true if this subscription should be scheduled + */ + public boolean shouldSchedule() { + return subscriptionState == SubscriptionState.ON && !isExpired(); } private boolean inWindow(Date checkDate) { @@ -1046,4 +1044,37 @@ public abstract class RecurringSubscription public void setSubscriptionType(SubscriptionType subscriptionType) { this.subscriptionType = subscriptionType; } + + /** + * @return the subscriptionState + */ + public SubscriptionState getSubscriptionState() { + return subscriptionState; + } + + /** + * @param subscriptionState + * the subscriptionState to set + */ + public void setSubscriptionState(SubscriptionState subscriptionState) { + this.subscriptionState = subscriptionState; + } + + /** + * {@inheritDoc} + */ + @Override + public void activate() { + if (valid && !isExpired()) { + this.setSubscriptionState(SubscriptionState.ON); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void deactivate() { + this.setSubscriptionState(SubscriptionState.OFF); + } } diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Subscription.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Subscription.java index 4df35239a7..f884ad4b4b 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Subscription.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Subscription.java @@ -27,6 +27,8 @@ import java.util.Set; import javax.xml.bind.annotation.XmlEnum; import javax.xml.bind.annotation.XmlEnumValue; +import com.raytheon.uf.common.datadelivery.registry.Utils.SubscriptionStatus; + /** * Definition of a subscription. * @@ -43,7 +45,8 @@ import javax.xml.bind.annotation.XmlEnumValue; * Sept 30,2013 1797 dhladky Abstracted and genericized. * Oct 23, 2013 2484 dhladky Unique ID for subscriptions updated. * Nov 14, 2013 2548 mpduff Add a subscription type information. - * Jan 08, 2014 2615 bgonzale Added calculate start and calculate end methods. + * Jan 08, 2014 2615 bgonzale Added calculate start and calculate end methods. + * Jan 14, 2014 2459 mpduff Change Subscription status code * * * @@ -58,6 +61,19 @@ public interface Subscription { QUERY, RECURRING; } + /** + * State of the subscription. + * + *
+     * ON for Active, Inactive, Unscheduled status
+     * OFF for Expired, Deactivated, Invalid status
+     * 
+ */ + @XmlEnum + public enum SubscriptionState { + ON, OFF; + } + /** Enumeration to use for subscription priorities */ @XmlEnum public static enum SubscriptionPriority { @@ -157,6 +173,9 @@ public interface Subscription { /** Subscription type slot (query, recurring) */ String SUBSCRIPTION_TYPE_SLOT = "subscriptionType"; + /** Subscription state slot (off or on) */ + String SUBSCRIPTION_STATE_SLOT = "subscriptionState"; + /** * Get subscription name. * @@ -458,20 +477,12 @@ public interface Subscription { void setDataSetName(String dataSetName); /** - * isActive flag for subscription status. + * Check if status is SubscriptionStatus.ACTIVE * * @return boolean true if subscription is Active */ boolean isActive(); - /** - * Set the subscription status to active. - * - * @param active - * subscription active - */ - void setActive(boolean active); - /** * Set subscription valid. * @@ -558,19 +569,12 @@ public interface Subscription { */ void setId(String id); - /** - * Determine if subscription status is expired. - * - * @return true if status is expired - */ - boolean isExpired(); - /** * Get the current subscription status. * - * @return String value of SUBSCRIPTION_STATUS + * @return SubscriptionStatus */ - String getStatus(); + SubscriptionStatus getStatus(); /** * Get the route. @@ -679,4 +683,14 @@ public interface Subscription { * @param subType */ void setSubscriptionType(SubscriptionType subType); + + /** + * Activate the subscription + */ + void activate(); + + /** + * Deactivate the subscription + */ + void deactivate(); } \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Utils.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Utils.java index 7d8d7bef26..a1eeb9700e 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Utils.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Utils.java @@ -21,7 +21,8 @@ import com.vividsolutions.jts.geom.Polygon; * ------------ ---------- ----------- -------------------------- * Feb 20, 2011 218 dhladky Initial creation. * Oct 1, 2012 1103 jpiatt Added invalid subscription status. - * Nov 20, 2012 1286 djohnson Add UNSCHEDULED. + * Nov 20, 2012 1286 djohnson Add UNSCHEDULED. + * Jan 14, 2014 2459 mpduff Change Subscription status code * * * @@ -35,12 +36,11 @@ public class Utils { * Get the geometry for a bounding box * * @param upperLeft - * upper left corner + * upper left corner * @param LowerRight - * lower right corner + * lower right corner * - * @return bounding box - * counding box coordinates + * @return bounding box bounding box coordinates */ public static Geometry getGeometry(Coordinate upperLeft, Coordinate LowerRight) { @@ -65,12 +65,11 @@ public class Utils { * Date conversion. * * @param format - * pass in date format + * pass in date format * @param dateString - * date in string format - * - * @return Date - * converted date + * date in string format + * + * @return Date converted date * @throws ParseException */ public static Date convertDate(String format, String dateString) @@ -82,19 +81,30 @@ public class Utils { /** * Subscription status options. + * + *
+     * Expired - Do not schedule
+     * Deactivated - Do not schedule
+     * Active - Currently scheduled
+     * Inactive - Not currently scheduled (outside of active period)
+     * Unscheduled - Not currently scheduled due to bandwidth limitations
+     * Invalid - Subscription does not match the available data set
+     * 
*/ public static enum SubscriptionStatus { - + /** Active Subscription Status */ - ACTIVE("Active"), + ACTIVE("Active"), /** Inactive Subscription Status */ - INACTIVE("Inactive"), + INACTIVE("Inactive"), /** Expired Subscription Status */ - EXPIRED("Expired"), - /** Invalid Subscription Status */ - INVALID("Invalid"), + EXPIRED("Expired"), /** Unscheduled Subscription Status */ - UNSCHEDULED("Unscheduled"); + UNSCHEDULED("Unscheduled"), + /** Deactivated Subscription Status */ + DEACTIVATED("Deactivated"), + /** Invalid Subscription Status */ + INVALID("Invalid"); private final String status; diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/ebxml/SubscriptionFilterableQuery.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/ebxml/SubscriptionFilterableQuery.java index 1fc00d78e9..7e0bdb9879 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/ebxml/SubscriptionFilterableQuery.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/ebxml/SubscriptionFilterableQuery.java @@ -10,8 +10,8 @@ import javax.xml.bind.annotation.XmlAccessorType; import com.raytheon.uf.common.datadelivery.registry.Network; import com.raytheon.uf.common.datadelivery.registry.Subscription; +import com.raytheon.uf.common.datadelivery.registry.Subscription.SubscriptionState; import com.raytheon.uf.common.registry.ebxml.AdhocRegistryQuery; -import com.raytheon.uf.common.registry.ebxml.BooleanAttribute; import com.raytheon.uf.common.registry.ebxml.CalendarAttribute; import com.raytheon.uf.common.registry.ebxml.StringAttribute; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; @@ -36,6 +36,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; * Feb 20, 2013 1543 djohnson Add ability to filter on routes. * May 28, 2013 1650 djohnson More information when failing to schedule. * Sep 04, 2013 2330 bgonzale OfficeIds attribute is a collection. + * Jan 14, 2014 2459 mpduff Change to query for ON subscription state. * * * @@ -48,11 +49,12 @@ public abstract class SubscriptionFilterableQuery extends AdhocRegistryQuery { /** - * A setter for the queryable attribute dataSetName equals a single String value. - * Using this setter will equate to an HQL "equals" query against the specified column name. - * + * A setter for the queryable attribute dataSetName equals a single String + * value. Using this setter will equate to an HQL "equals" query against the + * specified column name. + * * @param collectionName - * The value of the dataSetName attribute to search for. + * The value of the dataSetName attribute to search for. */ public void setDataSetName(String dataSetName) { setAttribute("dataSetName", new StringAttribute(dataSetName)); @@ -60,10 +62,11 @@ public abstract class SubscriptionFilterableQuery extends /** * A setter for the queryable attribute time equals a single String value. - * Using this setter will equate to an HQL "equals" query against the specified column name. - * + * Using this setter will equate to an HQL "equals" query against the + * specified column name. + * * @param collectionName - * The value of the time attribute to search for. + * The value of the time attribute to search for. */ public void setMatureTime(Calendar matureTime) { CalendarAttribute ca = new CalendarAttribute(matureTime); @@ -73,10 +76,11 @@ public abstract class SubscriptionFilterableQuery extends /** * A setter for the queryable attribute name equals a single String value. - * Using this setter will equate to an HQL "equals" query against the specified column name. - * + * Using this setter will equate to an HQL "equals" query against the + * specified column name. + * * @param collectionName - * The value of the name attribute to search for. + * The value of the name attribute to search for. */ public void setName(String name) { setAttribute(Subscription.NAME_SLOT, new StringAttribute(name)); @@ -109,10 +113,11 @@ public abstract class SubscriptionFilterableQuery extends /** * A setter for the queryable attribute owner equals a single String value. - * Using this setter will equate to an HQL "equals" query against the specified column name. - * + * Using this setter will equate to an HQL "equals" query against the + * specified column name. + * * @param collectionName - * The value of the owner attribute to search for. + * The value of the owner attribute to search for. */ public void setOwner(String owner) { setAttribute("owner", new StringAttribute(owner)); @@ -155,7 +160,8 @@ public abstract class SubscriptionFilterableQuery extends * The value of the active attribute to search for. */ public void setActive(boolean active) { - setAttribute("active", new BooleanAttribute(active)); + setAttribute(Subscription.SUBSCRIPTION_STATE_SLOT, new StringAttribute( + SubscriptionState.ON.name())); } /** diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/handlers/BaseSubscriptionHandler.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/handlers/BaseSubscriptionHandler.java index b385369c26..2f1e4c1fdd 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/handlers/BaseSubscriptionHandler.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/handlers/BaseSubscriptionHandler.java @@ -19,6 +19,7 @@ **/ package com.raytheon.uf.common.datadelivery.registry.handlers; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; @@ -26,6 +27,7 @@ import java.util.List; import java.util.Set; import com.raytheon.uf.common.datadelivery.registry.Network; +import com.raytheon.uf.common.datadelivery.registry.RecurringSubscription; import com.raytheon.uf.common.datadelivery.registry.Subscription; import com.raytheon.uf.common.datadelivery.registry.ebxml.SubscriptionDataSetNameQuery; import com.raytheon.uf.common.datadelivery.registry.ebxml.SubscriptionFilterableQuery; @@ -50,6 +52,7 @@ import com.raytheon.uf.common.registry.handler.RegistryHandlerException; * Jun 24, 2013 2106 djohnson Now composes a registryHandler. * Jul 18, 2013 2193 mpduff Changes for SubscriptionDataSetNameQuery. * Sep 11, 2013 2352 mpduff Add siteId to getSubscribedToDataSetNames method. + * Jan 14, 2014 2459 mpduff Validate subs should be scheduled before returning them. * * * @@ -200,7 +203,12 @@ public abstract class BaseSubscriptionHandler returnList = new ArrayList(); + for (T sub : response.getResults()) { + if (((RecurringSubscription) sub).shouldSchedule()) { + returnList.add(sub); + } + } + return returnList; } - } diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthManager.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthManager.java index bc4e093f69..1609f5c1f3 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthManager.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthManager.java @@ -40,6 +40,7 @@ import com.raytheon.uf.common.datadelivery.registry.PointTime; import com.raytheon.uf.common.datadelivery.registry.SiteSubscription; import com.raytheon.uf.common.datadelivery.registry.Subscription; import com.raytheon.uf.common.datadelivery.registry.Time; +import com.raytheon.uf.common.datadelivery.registry.Utils.SubscriptionStatus; import com.raytheon.uf.common.datadelivery.registry.handlers.DataDeliveryHandlers; import com.raytheon.uf.common.event.EventBus; import com.raytheon.uf.common.registry.handler.RegistryHandlerException; @@ -135,6 +136,7 @@ import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; * Jan 08, 2014 2615 bgonzale getMostRecent checks subscription time constraints before scheduling. * handlePoint method now schedules most recent. * Jan 14, 2014 2692 dhladky Bad Point scheduling final Empty list. + * Jan 14, 2014 2459 mpduff Change to subscription status. * * * @@ -589,10 +591,10 @@ public abstract class BandwidthManager // If BandwidthManager does not know about the subscription, and // it's active, attempt to add it.. - if (bandwidthSubscriptions.isEmpty() && subscription.isActive() - && !subscription.isUnscheduled()) { + if (bandwidthSubscriptions.isEmpty() && subscription.isActive()) { return schedule(subscription); - } else if (!subscription.isActive() || subscription.isUnscheduled()) { + } else if (subscription.isUnscheduled() + || subscription.getStatus() == SubscriptionStatus.DEACTIVATED) { // See if the subscription was inactivated or unscheduled.. // Need to remove BandwidthReservations for this // subscription. @@ -647,7 +649,7 @@ public abstract class BandwidthManager useMostRecentDataSetUpdate)); return unscheduled; } - + private List getMostRecent( Subscription subscription, boolean useMostRecentDataSetUpdate) { List unscheduled = Collections.emptyList(); @@ -667,7 +669,8 @@ public abstract class BandwidthManager + "No adhoc requested.", subscription.getName())); } else { - RetrievalPlan plan = retrievalManager.getPlan(subscription.getRoute()); + RetrievalPlan plan = retrievalManager.getPlan(subscription + .getRoute()); if (plan != null) { Date subscriptionValidStart = subscription.calculateStart( plan.getPlanStart()).getTime(); diff --git a/tests/unit/com/raytheon/uf/common/datadelivery/registry/BaseSubscriptionFixture.java b/tests/unit/com/raytheon/uf/common/datadelivery/registry/BaseSubscriptionFixture.java index 4644d01ec7..314f04eff1 100644 --- a/tests/unit/com/raytheon/uf/common/datadelivery/registry/BaseSubscriptionFixture.java +++ b/tests/unit/com/raytheon/uf/common/datadelivery/registry/BaseSubscriptionFixture.java @@ -43,6 +43,7 @@ import com.raytheon.uf.common.time.util.TimeUtil; * May 15, 2013 1040 mpduff Office Ids are now a list. * Oct 2 2013 1797 dhladky subscription and time generics * Oct 21, 2013 2292 mpduff Implement multiple data types + * Jan 14, 2014 2459 mpduff Change subscription status code * * * @@ -77,7 +78,6 @@ public abstract class BaseSubscriptionFixture { public M getInstance(long seedValue, Random random, DataType dataType) { M subscription = getSubscription(); - subscription.setActive(random.nextBoolean()); subscription.setActivePeriodStart(TimeUtil.newDate()); subscription.setActivePeriodEnd(new Date(subscription .getActivePeriodStart().getTime() + seedValue)); diff --git a/tests/unit/com/raytheon/uf/common/datadelivery/registry/SiteSubscriptionTest.java b/tests/unit/com/raytheon/uf/common/datadelivery/registry/SiteSubscriptionTest.java index d276a2d0d1..4789beefaa 100644 --- a/tests/unit/com/raytheon/uf/common/datadelivery/registry/SiteSubscriptionTest.java +++ b/tests/unit/com/raytheon/uf/common/datadelivery/registry/SiteSubscriptionTest.java @@ -55,6 +55,7 @@ import com.raytheon.uf.common.time.util.TimeUtilTest; * 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 * * * @@ -134,7 +135,7 @@ public class SiteSubscriptionTest { .withActivePeriodEnd(fiveDaysFromNow).build(); assertThat(subscription.getStatus(), - is(equalTo(SubscriptionStatus.ACTIVE.toString()))); + is(equalTo(SubscriptionStatus.ACTIVE))); } @Test @@ -149,7 +150,7 @@ public class SiteSubscriptionTest { .withActivePeriodEnd(yesterday).build(); assertThat(subscription.getStatus(), - is(equalTo(SubscriptionStatus.INACTIVE.toString()))); + is(equalTo(SubscriptionStatus.INACTIVE))); } @Test @@ -166,7 +167,7 @@ public class SiteSubscriptionTest { .withActivePeriodEnd(fiveDaysFromNow1970).build(); assertThat(subscription.getStatus(), - is(equalTo(SubscriptionStatus.ACTIVE.toString()))); + is(equalTo(SubscriptionStatus.ACTIVE))); } @Test @@ -184,7 +185,7 @@ public class SiteSubscriptionTest { .withActivePeriodEnd(yesterday1970).build(); assertThat(subscription.getStatus(), - is(equalTo(SubscriptionStatus.INACTIVE.toString()))); + is(equalTo(SubscriptionStatus.INACTIVE))); } @Test @@ -203,7 +204,61 @@ public class SiteSubscriptionTest { .withActivePeriodEnd(januaryFirst).build(); assertThat(subscription.getStatus(), - is(equalTo(SubscriptionStatus.ACTIVE.toString()))); + is(equalTo(SubscriptionStatus.ACTIVE))); + } + + @Test + public void testActivatedSubOutsideActivePeriodReturnsInactive() { + final Date fiveDaysAgo = new Date(TimeUtil.currentTimeMillis() + - (TimeUtil.MILLIS_PER_DAY * 5)); + final Date yesterday = new Date(TimeUtil.currentTimeMillis() + - TimeUtil.MILLIS_PER_DAY); + + Subscription sub = new SubscriptionBuilder() + .withActivePeriodStart(fiveDaysAgo) + .withActivePeriodEnd(yesterday).build(); + + sub.deactivate(); + sub.activate(); + assertThat(sub.getStatus(), is(equalTo(SubscriptionStatus.INACTIVE))); + } + + @Test + public void testGetStatusOfDeactivatedSubReturnsDeactivatedStatus() { + Subscription sub = new SubscriptionBuilder().build(); + sub.deactivate(); + sub.getStatus(); + assertThat(sub.getStatus(), is(equalTo(SubscriptionStatus.DEACTIVATED))); + } + + @Test + public void testGetStatusOfReactivatedSubReturnsActive() { + Subscription sub = new SubscriptionBuilder().build(); + sub.deactivate(); + sub.activate(); + assertThat(sub.getStatus(), is(equalTo(SubscriptionStatus.ACTIVE))); + } + + @Test + public void testActivatingAnExpiredSubIsStillExpired() { + Subscription sub = new SubscriptionBuilder().build(); + Calendar endTime = TimeUtil.newGmtCalendar(); + endTime.add(Calendar.DAY_OF_MONTH, -30); + sub.setSubscriptionEnd(endTime.getTime()); + + // activate it + sub.activate(); + + assertThat(sub.getStatus(), is(equalTo(SubscriptionStatus.EXPIRED))); + } + + @Test + public void testInvalidSubCannotBeActivated() { + SiteSubscription sub = new SubscriptionBuilder().build(); + sub.setValid(false); + sub.activate(); + + assertThat(sub.getStatus(), is(equalTo(SubscriptionStatus.INVALID))); } @Test diff --git a/tests/unit/com/raytheon/uf/common/datadelivery/registry/SubscriptionBuilder.java b/tests/unit/com/raytheon/uf/common/datadelivery/registry/SubscriptionBuilder.java index 0d1691938a..ef3f25a913 100644 --- a/tests/unit/com/raytheon/uf/common/datadelivery/registry/SubscriptionBuilder.java +++ b/tests/unit/com/raytheon/uf/common/datadelivery/registry/SubscriptionBuilder.java @@ -40,6 +40,7 @@ import com.raytheon.uf.common.time.util.TimeUtil; * Apr 08, 2013 1826 djohnson Remove delivery options. * 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 * * * @@ -51,8 +52,6 @@ public class SubscriptionBuilder { private int latencyInMinutes = 0; - private boolean active = true; - private Date activePeriodStart; private Date activePeriodEnd; @@ -98,7 +97,6 @@ public class SubscriptionBuilder { public SiteSubscription build() { SiteSubscription subscription = SiteSubscriptionFixture.INSTANCE .get(dataType); - subscription.setActive(active); subscription.setActivePeriodStart(activePeriodStart); subscription.setActivePeriodEnd(activePeriodEnd); subscription.setDataSetName(dataSetName); @@ -132,15 +130,6 @@ public class SubscriptionBuilder { return this; } - /** - * @param active - * the active to set - */ - public SubscriptionBuilder withActive(boolean active) { - this.active = active; - return this; - } - /** * @param activePeriodStart * the activePeriodStart to set