killbill-memoizeit
Changes
entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransition.java 35(+22 -13)
Details
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index f4f7c9c..faaf2b2 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
@@ -116,6 +116,7 @@ public class TestAnalyticsService
final DateTime requestedTransitionTime = new DateTime(DateTimeZone.UTC);
final String priceList = "something";
transition = new SubscriptionTransition(
+ UUID.randomUUID(),
subscriptionId,
bundle.getId(),
IEvent.EventType.API_USER,
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java b/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
index c4612fd..c0c93aa 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
@@ -156,6 +156,7 @@ public class TestAnalyticsListener
final ApiEventType eventType = ApiEventType.CREATE;
final ISubscription.SubscriptionState nextState = ISubscription.SubscriptionState.ACTIVE;
return new SubscriptionTransition(
+ UUID.randomUUID(),
subscriptionId,
bundleUUID,
IEvent.EventType.API_USER,
@@ -203,6 +204,7 @@ public class TestAnalyticsListener
)
{
return new SubscriptionTransition(
+ UUID.randomUUID(),
subscriptionId,
bundleUUID,
IEvent.EventType.API_USER,
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/user/ISubscriptionTransition.java b/api/src/main/java/com/ning/billing/entitlement/api/user/ISubscriptionTransition.java
index 718c28a..e968aa4 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/user/ISubscriptionTransition.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/user/ISubscriptionTransition.java
@@ -37,6 +37,8 @@ public interface ISubscriptionTransition extends IEventBusType {
PHASE
}
+ UUID getId();
+
SubscriptionTransitionType getTransitionType();
UUID getBundleId();
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
index b1c0b82..3781e74 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
@@ -18,6 +18,7 @@ package com.ning.billing.entitlement.api.user;
import java.lang.reflect.Field;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@@ -363,6 +364,19 @@ public class Subscription extends PrivateFields implements ISubscription {
return latestSubscription;
}
+ public ISubscriptionTransition getTransitionFromEvent(IEvent event) {
+ if (transitions == null || event == null) {
+ return null;
+ }
+
+ for (ISubscriptionTransition cur : transitions) {
+ if (cur.getId().equals(event.getId())) {
+ return cur;
+ }
+ }
+ return null;
+ }
+
public long getActiveVersion() {
return activeVersion;
}
@@ -407,7 +421,7 @@ public class Subscription extends PrivateFields implements ISubscription {
public List<ISubscriptionTransition> getActiveTransitions() {
if (transitions == null) {
- return null;
+ return Collections.emptyList();
}
List<ISubscriptionTransition> activeTransitions = new ArrayList<ISubscriptionTransition>();
@@ -556,7 +570,7 @@ public class Subscription extends PrivateFields implements ISubscription {
IPlanPhase nextPhase = catalog.getPhaseFromName(nextPhaseName);
SubscriptionTransition transition =
- new SubscriptionTransition(id, bundleId, cur.getType(), apiEventType,
+ new SubscriptionTransition(cur.getId(), id, bundleId, cur.getType(), apiEventType,
cur.getRequestedDate(), cur.getEffectiveDate(),
previousState, previousPlan, previousPhase, previousPriceList,
nextState, nextPlan, nextPhase, nextPriceList);
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransition.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransition.java
index 616e871..7f8bc8c 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransition.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransition.java
@@ -32,6 +32,7 @@ public class SubscriptionTransition implements ISubscriptionTransition {
private final UUID subscriptionId;
private final UUID bundleId;
+ private final UUID eventId;
private final EventType eventType;
private final ApiEventType apiEventType;
private final DateTime requestedTransitionTime;
@@ -45,11 +46,12 @@ public class SubscriptionTransition implements ISubscriptionTransition {
private final IPlan nextPlan;
private final IPlanPhase nextPhase;
- public SubscriptionTransition(UUID subscriptionId, UUID bundleId, EventType eventType,
+ public SubscriptionTransition(UUID eventId, UUID subscriptionId, UUID bundleId, EventType eventType,
ApiEventType apiEventType, DateTime requestedTransitionTime, DateTime effectiveTransitionTime,
SubscriptionState previousState, IPlan previousPlan, IPlanPhase previousPhase, String previousPriceList,
SubscriptionState nextState, IPlan nextPlan, IPlanPhase nextPhase, String nextPriceList) {
super();
+ this.eventId = eventId;
this.subscriptionId = subscriptionId;
this.bundleId = bundleId;
this.eventType = eventType;
@@ -67,6 +69,11 @@ public class SubscriptionTransition implements ISubscriptionTransition {
}
@Override
+ public UUID getId() {
+ return eventId;
+ }
+
+ @Override
public UUID getSubscriptionId() {
return subscriptionId;
}
@@ -151,17 +158,19 @@ public class SubscriptionTransition implements ISubscriptionTransition {
@Override
public String toString() {
- return "SubscriptionTransition [subscriptionId=" + subscriptionId
- + ", eventType=" + eventType + ", apiEventType="
- + apiEventType + ", requestedTransitionTime=" + requestedTransitionTime
- + ", effectiveTransitionTime=" + effectiveTransitionTime
- + ", previousState=" + previousState + ", previousPlan="
- + ((previousPlan != null) ? previousPlan.getName() : null)
- + ", previousPhase=" + ((previousPhase != null) ? previousPhase.getName() : null)
- + ", previousPriceList " + previousPriceList
- + ", nextState=" + nextState
- + ", nextPlan=" + ((nextPlan != null) ? nextPlan.getName() : null)
- + ", nextPriceList " + nextPriceList
- + ", nextPhase=" + ((nextPhase != null) ? nextPhase.getName() : null) + "]";
+ return "SubscriptionTransition [eventId=" + eventId
+ + ", subscriptionId=" + subscriptionId
+ + ", eventType=" + eventType + ", apiEventType="
+ + apiEventType + ", requestedTransitionTime=" + requestedTransitionTime
+ + ", effectiveTransitionTime=" + effectiveTransitionTime
+ + ", previousState=" + previousState + ", previousPlan="
+ + ((previousPlan != null) ? previousPlan.getName() : null)
+ + ", previousPhase=" + ((previousPhase != null) ? previousPhase.getName() : null)
+ + ", previousPriceList " + previousPriceList
+ + ", nextState=" + nextState
+ + ", nextPlan=" + ((nextPlan != null) ? nextPlan.getName() : null)
+ + ", nextPriceList " + nextPriceList
+ + ", nextPhase=" + ((nextPhase != null) ? nextPhase.getName() : null) + "]";
}
+
}
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java
index 2587baa..2b47f9c 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java
@@ -132,7 +132,7 @@ public class Engine implements IEventListener, IEntitlementService {
insertNextPhaseEvent(subscription);
}
try {
- eventBus.post(subscription.getLatestTranstion());
+ eventBus.post(subscription.getTransitionFromEvent(event));
} catch (EventBusException e) {
log.warn("Failed to post entitlement event " + event, e);
}
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/ApiTestListener.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/ApiTestListener.java
index 5b5100b..1ba79af 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/ApiTestListener.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/ApiTestListener.java
@@ -17,11 +17,16 @@
package com.ning.billing.entitlement.api;
import java.util.EmptyStackException;
+import java.util.Iterator;
+import java.util.List;
import java.util.Stack;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
+import com.google.common.collect.Lists;
import com.google.common.eventbus.Subscribe;
import com.ning.billing.entitlement.api.user.ISubscriptionTransition;
import com.ning.billing.util.eventbus.IEventBus;
@@ -30,7 +35,7 @@ public class ApiTestListener {
private static final Logger log = LoggerFactory.getLogger(ApiTestListener.class);
- private final Stack<NextEvent> nextExpectedEvent;
+ private final List<NextEvent> nextExpectedEvent;
private volatile boolean completed;
@@ -79,7 +84,7 @@ public class ApiTestListener {
public void pushExpectedEvent(NextEvent next) {
synchronized (this) {
- nextExpectedEvent.push(next);
+ nextExpectedEvent.add(next);
completed = false;
}
}
@@ -113,17 +118,22 @@ public class ApiTestListener {
log.debug("notifyIfStackEmpty EXIT");
}
- private void assertEqualsNicely(NextEvent expected, NextEvent real) {
- if (expected != real) {
- System.err.println("Expected event " + expected + " got " + real);
- try {
- NextEvent next = nextExpectedEvent.pop();
- while (next != null) {
- System.err.println("Also got event " + next);
- next = nextExpectedEvent.pop();
- }
- } catch (EmptyStackException ignore) {
+ private void assertEqualsNicely(NextEvent expected) {
+
+ boolean foundIt = false;
+ Iterator<NextEvent> it = nextExpectedEvent.iterator();
+ while (it.hasNext()) {
+ NextEvent ev = it.next();
+ if (ev == expected) {
+ it.remove();
+ foundIt = true;
+ break;
}
+ }
+
+ if (!foundIt) {
+ Joiner joiner = Joiner.on(" ");
+ System.err.println("Expected event " + expected + " got " + joiner.join(nextExpectedEvent));
System.exit(1);
}
}
@@ -131,35 +141,35 @@ public class ApiTestListener {
public void subscriptionCreated(ISubscriptionTransition created) {
log.debug("-> Got event CREATED");
- assertEqualsNicely(nextExpectedEvent.pop(), NextEvent.CREATE);
+ assertEqualsNicely(NextEvent.CREATE);
notifyIfStackEmpty();
}
public void subscriptionCancelled(ISubscriptionTransition cancelled) {
log.debug("-> Got event CANCEL");
- assertEqualsNicely(nextExpectedEvent.pop(), NextEvent.CANCEL);
+ assertEqualsNicely(NextEvent.CANCEL);
notifyIfStackEmpty();
}
public void subscriptionChanged(ISubscriptionTransition changed) {
log.debug("-> Got event CHANGE");
- assertEqualsNicely(nextExpectedEvent.pop(), NextEvent.CHANGE);
+ assertEqualsNicely(NextEvent.CHANGE);
notifyIfStackEmpty();
}
public void subscriptionPaused(ISubscriptionTransition paused) {
log.debug("-> Got event PAUSE");
- assertEqualsNicely(nextExpectedEvent.pop(), NextEvent.PAUSE);
+ assertEqualsNicely(NextEvent.PAUSE);
notifyIfStackEmpty();
}
public void subscriptionResumed(ISubscriptionTransition resumed) {
log.debug("-> Got event RESUME");
- assertEqualsNicely(nextExpectedEvent.pop(), NextEvent.RESUME);
+ assertEqualsNicely(NextEvent.RESUME);
notifyIfStackEmpty();
}
@@ -167,7 +177,7 @@ public class ApiTestListener {
public void subscriptionPhaseChanged(
ISubscriptionTransition phaseChanged) {
log.debug("-> Got event PHASE");
- assertEqualsNicely(nextExpectedEvent.pop(), NextEvent.PHASE);
+ assertEqualsNicely(NextEvent.PHASE);
notifyIfStackEmpty();
}
}
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreate.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreate.java
index 64f69c3..538d5dd 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreate.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreate.java
@@ -39,6 +39,38 @@ import com.ning.billing.util.clock.Clock;
public abstract class TestUserApiCreate extends TestUserApiBase {
+
+ protected void testCreateWithRequestedDateReal() {
+ log.info("Starting testCreateWithRequestedDate");
+ try {
+
+ DateTime init = clock.getUTCNow();
+ DateTime requestedDate = init.minusYears(1);
+
+ String productName = "Shotgun";
+ BillingPeriod term = BillingPeriod.MONTHLY;
+ String planSetName = IPriceListSet.DEFAULT_PRICELIST_NAME;
+
+
+ testListener.pushExpectedEvent(NextEvent.PHASE);
+ testListener.pushExpectedEvent(NextEvent.CREATE);
+
+
+ Subscription subscription = (Subscription) entitlementApi.createSubscription(bundle.getId(), productName, term, planSetName, requestedDate);
+ assertNotNull(subscription);
+
+ assertEquals(subscription.getActiveVersion(), SubscriptionEvents.INITIAL_VERSION);
+ //assertEquals(subscription.getAccount(), account.getId());
+ assertEquals(subscription.getBundleId(), bundle.getId());
+ assertEquals(subscription.getStartDate(), requestedDate);
+
+ assertTrue(testListener.isCompleted(5000));
+
+ } catch (EntitlementUserApiException e) {
+ Assert.fail(e.getMessage());
+ }
+ }
+
protected void testSimpleCreateSubscriptionReal() {
log.info("Starting testSimpleCreateSubscription");
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreateMemory.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreateMemory.java
index 429652c..8c1fa63 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreateMemory.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreateMemory.java
@@ -33,6 +33,11 @@ public class TestUserApiCreateMemory extends TestUserApiCreate {
}
@Test(enabled=true, groups={"fast"})
+ public void testCreateWithRequestedDate() {
+ invokeRealMethod(this);
+ }
+
+ @Test(enabled=true, groups={"fast"})
public void testSimpleCreateSubscription() {
invokeRealMethod(this);
}
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreateSql.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreateSql.java
index 328976f..77ee57d 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreateSql.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreateSql.java
@@ -32,6 +32,11 @@ public class TestUserApiCreateSql extends TestUserApiCreate {
}
@Test(enabled=true, groups={"sql"})
+ public void testCreateWithRequestedDate() {
+ invokeRealMethod(this);
+ }
+
+ @Test(enabled=true, groups={"sql"})
public void testSimpleCreateSubscription() {
invokeRealMethod(this);
}