killbill-memoizeit

Introduing EventBus into killbill

11/11/2011 6:56:44 PM

Changes

api/pom.xml 7(+6 -1)

api/src/main/java/com/ning/billing/entitlement/api/user/IApiListener.java 33(+0 -33)

api/src/main/java/com/ning/billing/lifecycle/Lifecycled.java 27(+0 -27)

entitlement/src/main/java/com/ning/billing/entitlement/api/billing/BillingApi.java 80(+0 -80)

util/pom.xml 9(+4 -5)

Details

diff --git a/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java b/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
index 653a285..a80d32b 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
@@ -21,7 +21,6 @@ import com.ning.billing.account.api.IAccount;
 import com.ning.billing.account.api.IAccountUserApi;
 import com.ning.billing.analytics.dao.EventDao;
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.entitlement.api.user.IApiListener;
 import com.ning.billing.entitlement.api.user.IEntitlementUserApi;
 import com.ning.billing.entitlement.api.user.ISubscriptionBundle;
 import com.ning.billing.entitlement.api.user.ISubscriptionTransition;
@@ -31,7 +30,8 @@ import org.slf4j.LoggerFactory;
 
 import java.util.List;
 
-public class AnalyticsListener implements IApiListener
+// STEPH fid with Pierre
+public class AnalyticsListener /* implements IApiListener */
 {
     private static final Logger log = LoggerFactory.getLogger(AnalyticsListener.class);
     private final EventDao dao;
@@ -45,42 +45,40 @@ public class AnalyticsListener implements IApiListener
         this.accountApi = accountApi;
     }
 
-    @Override
+
     public void subscriptionCreated(ISubscriptionTransition created)
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCreated(created.getNextPlan());
         recordTransition(event, created);
     }
 
-    @Override
+
     public void subscriptionCancelled(ISubscriptionTransition cancelled)
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCancelled(cancelled.getNextPlan());
         recordTransition(event, cancelled);
     }
 
-    @Override
+
     public void subscriptionChanged(ISubscriptionTransition changed)
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionChanged(changed.getNextPlan());
         recordTransition(event, changed);
     }
 
-    @Override
+
     public void subscriptionPaused(ISubscriptionTransition paused)
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionPaused(paused.getNextPlan());
         recordTransition(event, paused);
     }
 
-    @Override
     public void subscriptionResumed(ISubscriptionTransition resumed)
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionResumed(resumed.getNextPlan());
         recordTransition(event, resumed);
     }
 
-    @Override
     public void subscriptionPhaseChanged(ISubscriptionTransition phaseChanged)
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionPhaseChanged(phaseChanged.getNextPlan(), phaseChanged.getNextState());

api/pom.xml 7(+6 -1)

diff --git a/api/pom.xml b/api/pom.xml
index e9d887f..5cfa476 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -8,7 +8,8 @@
     OR CONDITIONS OF ANY KIND, either express or implied. See the ~ License for 
     the specific language governing permissions and limitations ~ under the License. -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>com.ning.billing</groupId>
@@ -26,6 +27,10 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
+            <groupId>org.jdbi</groupId>
+            <artifactId>jdbi</artifactId>
+        </dependency>
+        <dependency>
             <groupId>com.google.inject</groupId>
             <artifactId>guice</artifactId>
             <scope>provided</scope>
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/IEntitlementService.java b/api/src/main/java/com/ning/billing/entitlement/api/IEntitlementService.java
index 41cd37d..bd47c6b 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/IEntitlementService.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/IEntitlementService.java
@@ -16,10 +16,7 @@
 
 package com.ning.billing.entitlement.api;
 
-import java.util.List;
-
 import com.ning.billing.entitlement.api.billing.IEntitlementBillingApi;
-import com.ning.billing.entitlement.api.user.IApiListener;
 import com.ning.billing.entitlement.api.user.IEntitlementUserApi;
 import com.ning.billing.lifecycle.IService;
 
@@ -29,7 +26,7 @@ public interface IEntitlementService extends IService {
     @Override
     public String getName();
 
-    public IEntitlementUserApi getUserApi(List<IApiListener> listeners);
+    public IEntitlementUserApi getUserApi();
 
     public IEntitlementBillingApi getBillingApi();
 
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/user/IEntitlementUserApi.java b/api/src/main/java/com/ning/billing/entitlement/api/user/IEntitlementUserApi.java
index fb21eea..b37b976 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/user/IEntitlementUserApi.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/user/IEntitlementUserApi.java
@@ -25,8 +25,6 @@ import com.ning.billing.catalog.api.BillingPeriod;
 
 public interface IEntitlementUserApi {
 
-    public void initialize(List<IApiListener> listeners);
-
     public ISubscriptionBundle getBundleFromId(UUID id);
 
     public ISubscription getSubscriptionFromId(UUID id);
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 d4e1a5a..e100a5b 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
@@ -23,9 +23,21 @@ import org.joda.time.DateTime;
 import com.ning.billing.catalog.api.IPlan;
 import com.ning.billing.catalog.api.IPlanPhase;
 import com.ning.billing.entitlement.api.user.ISubscription.SubscriptionState;
+import com.ning.billing.util.eventbus.IEventBusType;
 
-public interface ISubscriptionTransition {
+public interface ISubscriptionTransition extends IEventBusType {
 
+    public enum SubscriptionTransitionTypeType {
+        CREATE,
+        CHANGE,
+        PAUSE,
+        RESUME,
+        CANCEL,
+        UNCANCEL,
+        PHASE
+    }
+
+    SubscriptionTransitionTypeType getTransitionType();
 
     UUID getBundleId();
 
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/lifecycle/TestLifecycle.java b/beatrix/src/test/java/com/ning/billing/beatrix/lifecycle/TestLifecycle.java
index f85232f..7ceae83 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/lifecycle/TestLifecycle.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/lifecycle/TestLifecycle.java
@@ -26,7 +26,6 @@ import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.Stage;
 import com.ning.billing.lifecycle.IService;
-import com.ning.billing.lifecycle.Lifecycled;
 import com.ning.billing.lifecycle.LyfecycleHandlerType;
 import com.ning.billing.lifecycle.LyfecycleHandlerType.LyfecycleLevel;
 
@@ -58,7 +57,6 @@ public class TestLifecycle {
         }
     }
 
-    @Lifecycled
     public static class Service2 implements IService {
 
         @LyfecycleHandlerType(LyfecycleLevel.LOAD_CATALOG)
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/EntitlementUserApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/EntitlementUserApi.java
index 8561ce0..4e17a53 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/EntitlementUserApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/EntitlementUserApi.java
@@ -22,15 +22,15 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 
+import com.google.inject.Inject;
 import com.ning.billing.ErrorCode;
 import com.ning.billing.account.api.IAccount;
 import com.ning.billing.catalog.api.BillingPeriod;
-import com.ning.billing.catalog.api.ICatalog;
+import com.ning.billing.catalog.api.ICatalogService;
 import com.ning.billing.catalog.api.IPlan;
 import com.ning.billing.catalog.api.IPlanPhase;
 import com.ning.billing.entitlement.alignment.IPlanAligner;
 import com.ning.billing.entitlement.alignment.IPlanAligner.TimedPhase;
-import com.ning.billing.entitlement.api.user.IApiListener;
 import com.ning.billing.entitlement.api.user.ISubscription;
 import com.ning.billing.entitlement.api.user.ISubscriptionBundle;
 import com.ning.billing.entitlement.api.user.IEntitlementUserApi;
@@ -41,37 +41,23 @@ import com.ning.billing.entitlement.events.phase.IPhaseEvent;
 import com.ning.billing.entitlement.events.phase.PhaseEvent;
 import com.ning.billing.entitlement.events.user.ApiEventCreate;
 import com.ning.billing.entitlement.exceptions.EntitlementError;
-import com.ning.billing.entitlement.glue.InjectorMagic;
 import com.ning.billing.util.clock.IClock;
 
 public class EntitlementUserApi implements IEntitlementUserApi {
 
-    private final Engine engine;
     private final IClock clock;
     private final IEntitlementDao dao;
     private final IPlanAligner planAligner;
+    private final ICatalogService catalogService;
 
-    private boolean initialized;
-
-    private ICatalog catalog;
-
-    public EntitlementUserApi(Engine engine, IClock clock, IPlanAligner planAligner, IEntitlementDao dao) {
+    @Inject
+    public EntitlementUserApi(IClock clock, IPlanAligner planAligner,
+            IEntitlementDao dao, ICatalogService catalogService) {
         super();
-        this.engine = engine;
         this.clock = clock;
         this.dao = dao;
         this.planAligner = planAligner;
-        this.initialized = false;
-
-    }
-
-    @Override
-    public synchronized void initialize(List<IApiListener> listeners) {
-        if (!initialized) {
-            this.catalog = InjectorMagic.getCatlog();
-            engine.registerApiObservers(listeners);
-            initialized = true;
-        }
+        this.catalogService = catalogService;
     }
 
     @Override
@@ -110,7 +96,7 @@ public class EntitlementUserApi implements IEntitlementUserApi {
 
         DateTime now = clock.getUTCNow();
 
-        IPlan plan = catalog.getPlan(productName, term, realPriceList);
+        IPlan plan = catalogService.getCatalog().getPlan(productName, term, realPriceList);
         if (plan == null) {
             throw new EntitlementUserApiException(ErrorCode.ENT_CREATE_BAD_CATALOG, productName, term, realPriceList);
         }
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 63f42f6..827d6a8 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
@@ -25,6 +25,7 @@ import com.ning.billing.catalog.api.IPlanPhase;
 import com.ning.billing.entitlement.api.user.ISubscription.SubscriptionState;
 import com.ning.billing.entitlement.events.IEvent.EventType;
 import com.ning.billing.entitlement.events.user.ApiEventType;
+import com.ning.billing.entitlement.exceptions.EntitlementError;
 
 public class SubscriptionTransition implements ISubscriptionTransition {
 
@@ -117,6 +118,18 @@ public class SubscriptionTransition implements ISubscriptionTransition {
         return nextPriceList;
     }
 
+    @Override
+    public SubscriptionTransitionTypeType getTransitionType() {
+        switch(eventType) {
+        case API_USER:
+            return apiEventType.getSubscriptionTransitionType();
+        case PHASE:
+            return SubscriptionTransitionTypeType.PHASE;
+        default:
+            throw new EntitlementError("Unexpected event type " + eventType);
+        }
+    }
+
     public ApiEventType getApiEventType() {
         return apiEventType;
     }
@@ -151,5 +164,4 @@ public class SubscriptionTransition implements ISubscriptionTransition {
                 + ", 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 dd33ae5..86a5a6d 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
@@ -16,25 +16,19 @@
 
 package com.ning.billing.entitlement.engine.core;
 
-import java.util.List;
-
 import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.inject.Inject;
-import com.ning.billing.catalog.api.ICatalog;
-import com.ning.billing.catalog.api.ICatalogService;
 import com.ning.billing.config.IEntitlementConfig;
 
 import com.ning.billing.entitlement.alignment.IPlanAligner;
 import com.ning.billing.entitlement.alignment.IPlanAligner.TimedPhase;
-import com.ning.billing.entitlement.alignment.PlanAligner;
 import com.ning.billing.entitlement.api.IEntitlementService;
-import com.ning.billing.entitlement.api.billing.BillingApi;
+import com.ning.billing.entitlement.api.billing.EntitlementBillingApi;
 import com.ning.billing.entitlement.api.billing.IEntitlementBillingApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApi;
-import com.ning.billing.entitlement.api.user.IApiListener;
 import com.ning.billing.entitlement.api.user.IEntitlementUserApi;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.engine.dao.IEntitlementDao;
@@ -59,20 +53,19 @@ public class Engine implements IEventListener, IEntitlementService {
     private final IPlanAligner planAligner;
     private final IEntitlementUserApi userApi;
     private final IEntitlementBillingApi billingApi;
-    private List<IApiListener> observers;
 
 
     @Inject
     public Engine(IClock clock, IEntitlementDao dao, IApiEventProcessor apiEventProcessor,
-            IPlanAligner planAligner, IEntitlementConfig config) {
+            IPlanAligner planAligner, IEntitlementConfig config, EntitlementUserApi userApi,
+            EntitlementBillingApi billingApi) {
         super();
         this.clock = clock;
         this.dao = dao;
         this.apiEventProcessor = apiEventProcessor;
         this.planAligner = planAligner;
-        this.observers = null;
-        this.userApi = new EntitlementUserApi(this, clock, planAligner, dao);
-        this.billingApi = new BillingApi(this, clock, dao);
+        this.userApi = userApi;
+        this.billingApi = billingApi;
     }
 
     @Override
@@ -96,8 +89,7 @@ public class Engine implements IEventListener, IEntitlementService {
     }
 
     @Override
-    public IEntitlementUserApi getUserApi(List<IApiListener> listeners) {
-        userApi.initialize(listeners);
+    public IEntitlementUserApi getUserApi() {
         return userApi;
     }
 
@@ -107,16 +99,8 @@ public class Engine implements IEventListener, IEntitlementService {
     }
 
 
-    public void registerApiObservers(List<IApiListener> observers) {
-        this.observers = observers;
-    }
-
-
     @Override
     public void processEventReady(IEvent event) {
-        if (observers == null) {
-            return;
-        }
         Subscription subscription = (Subscription) dao.getSubscriptionFromId(event.getSubscriptionId());
         if (subscription == null) {
             log.warn("Failed to retrieve subscription for id %s", event.getSubscriptionId());
@@ -131,6 +115,7 @@ public class Engine implements IEventListener, IEntitlementService {
     }
 
     private void dispatchApiEvent(IUserEvent event, Subscription subscription) {
+/*
         for (IApiListener listener : observers) {
             switch(event.getEventType()) {
             case CREATE:
@@ -146,12 +131,16 @@ public class Engine implements IEventListener, IEntitlementService {
                 break;
             }
         }
+        */
     }
+// STEPH observers
 
     private void dispatchPhaseEvent(IPhaseEvent event, Subscription subscription) {
+/*
         for (IApiListener listener : observers) {
             listener.subscriptionPhaseChanged(subscription.getLatestTranstion());
         }
+*/
     }
 
     private void insertNextPhaseEvent(Subscription subscription) {
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/events/user/ApiEventType.java b/entitlement/src/main/java/com/ning/billing/entitlement/events/user/ApiEventType.java
index e07e39f..94a446f 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/events/user/ApiEventType.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/events/user/ApiEventType.java
@@ -16,16 +16,38 @@
 
 package com.ning.billing.entitlement.events.user;
 
+import com.ning.billing.entitlement.api.user.ISubscriptionTransition.SubscriptionTransitionTypeType;
+
 
 public enum ApiEventType {
     /*
-     * STEPH should be changed
      * Ordering is important for unit tests today.
      */
-    CREATE,
-    CHANGE,
-    PAUSE,
-    RESUME,
-    CANCEL,
-    UNCANCEL
+    CREATE {
+        @Override
+        public SubscriptionTransitionTypeType getSubscriptionTransitionType() { return SubscriptionTransitionTypeType.CREATE; }
+    },
+    CHANGE {
+        @Override
+        public SubscriptionTransitionTypeType getSubscriptionTransitionType() { return SubscriptionTransitionTypeType.CHANGE; }
+    },
+    PAUSE {
+        @Override
+        public SubscriptionTransitionTypeType getSubscriptionTransitionType() { return SubscriptionTransitionTypeType.PAUSE; }
+    },
+    RESUME {
+        @Override
+        public SubscriptionTransitionTypeType getSubscriptionTransitionType() { return SubscriptionTransitionTypeType.RESUME; }
+    },
+    CANCEL {
+        @Override
+        public SubscriptionTransitionTypeType getSubscriptionTransitionType() { return SubscriptionTransitionTypeType.CANCEL; }
+    },
+    UNCANCEL {
+        @Override
+        public SubscriptionTransitionTypeType getSubscriptionTransitionType() { return SubscriptionTransitionTypeType.UNCANCEL; }
+    };
+
+    // STEPH Really, is that necessary?
+    public abstract SubscriptionTransitionTypeType getSubscriptionTransitionType();
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/glue/EntitlementModule.java b/entitlement/src/main/java/com/ning/billing/entitlement/glue/EntitlementModule.java
index d303b30..fe8489c 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/glue/EntitlementModule.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/glue/EntitlementModule.java
@@ -23,6 +23,8 @@ import com.ning.billing.config.IEntitlementConfig;
 import com.ning.billing.entitlement.alignment.IPlanAligner;
 import com.ning.billing.entitlement.alignment.PlanAligner;
 import com.ning.billing.entitlement.api.IEntitlementService;
+import com.ning.billing.entitlement.api.billing.EntitlementBillingApi;
+import com.ning.billing.entitlement.api.billing.IEntitlementBillingApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.IEntitlementUserApi;
 import com.ning.billing.entitlement.engine.core.ApiEventProcessor;
@@ -59,6 +61,8 @@ public class EntitlementModule extends AbstractModule {
         bind(IEntitlementService.class).to(Engine.class).asEagerSingleton();
         bind(Engine.class).asEagerSingleton();
         bind(IPlanAligner.class).to(PlanAligner.class).asEagerSingleton();
+        bind(IEntitlementUserApi.class).to(EntitlementUserApi.class).asEagerSingleton();
+        bind(IEntitlementBillingApi.class).to(EntitlementBillingApi.class).asEagerSingleton();
     }
 
     protected void installInjectorMagic() {
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 9591ee6..f882943 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
@@ -22,10 +22,11 @@ import java.util.Stack;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.entitlement.api.user.IApiListener;
+import com.google.common.eventbus.Subscribe;
 import com.ning.billing.entitlement.api.user.ISubscriptionTransition;
+import com.ning.billing.util.eventbus.IEventBus;
 
-public class ApiTestListener implements IApiListener {
+public class ApiTestListener {
 
     private static final Logger log = LoggerFactory.getLogger(ApiTestListener.class);
 
@@ -42,11 +43,37 @@ public class ApiTestListener implements IApiListener {
         PHASE
     }
 
-    public ApiTestListener() {
+    public ApiTestListener(IEventBus eventBus) {
         this.nextExpectedEvent = new Stack<NextEvent>();
         this.completed = false;
     }
 
+    @Subscribe
+    public void handleEntitlementEvent(ISubscriptionTransition event) {
+        switch (event.getTransitionType()) {
+        case CREATE:
+            subscriptionCreated(event);
+            break;
+        case CANCEL:
+            subscriptionCancelled(event);
+            break;
+        case CHANGE:
+            subscriptionChanged(event);
+            break;
+        case PAUSE:
+            subscriptionPaused(event);
+            break;
+        case RESUME:
+            subscriptionResumed(event);
+            break;
+        case UNCANCEL:
+            break;
+        default:
+            throw new RuntimeException("Unexpected event type " + event.getRequestedTransitionTime());
+        }
+
+    }
+
     public void pushExpectedEvent(NextEvent next) {
         synchronized (this) {
             nextExpectedEvent.push(next);
@@ -98,42 +125,42 @@ public class ApiTestListener implements IApiListener {
         }
     }
 
-    @Override
+
     public void subscriptionCreated(ISubscriptionTransition created) {
         log.debug("-> Got event CREATED");
         assertEqualsNicely(nextExpectedEvent.pop(), NextEvent.CREATE);
         notifyIfStackEmpty();
     }
 
-    @Override
+
     public void subscriptionCancelled(ISubscriptionTransition cancelled) {
         log.debug("-> Got event CANCEL");
         assertEqualsNicely(nextExpectedEvent.pop(), NextEvent.CANCEL);
         notifyIfStackEmpty();
     }
 
-    @Override
+
     public void subscriptionChanged(ISubscriptionTransition changed) {
         log.debug("-> Got event CHANGE");
         assertEqualsNicely(nextExpectedEvent.pop(), NextEvent.CHANGE);
         notifyIfStackEmpty();
     }
 
-    @Override
+
     public void subscriptionPaused(ISubscriptionTransition paused) {
         log.debug("-> Got event PAUSE");
         assertEqualsNicely(nextExpectedEvent.pop(), NextEvent.PAUSE);
         notifyIfStackEmpty();
     }
 
-    @Override
+
     public void subscriptionResumed(ISubscriptionTransition resumed) {
         log.debug("-> Got event RESUME");
         assertEqualsNicely(nextExpectedEvent.pop(), NextEvent.RESUME);
         notifyIfStackEmpty();
     }
 
-    @Override
+
     public void subscriptionPhaseChanged(
             ISubscriptionTransition phaseChanged) {
         log.debug("-> Got event PHASE");
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
index 4c2ae2b..ae2236e 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
@@ -68,6 +68,8 @@ import com.ning.billing.entitlement.glue.InjectorMagic;
 import com.ning.billing.lifecycle.IService.ServiceException;
 import com.ning.billing.util.clock.ClockMock;
 import com.ning.billing.util.clock.IClock;
+import com.ning.billing.util.eventbus.EventBusService;
+import com.ning.billing.util.eventbus.IEventBusService;
 
 public abstract class TestUserApiBase {
 
@@ -82,14 +84,13 @@ public abstract class TestUserApiBase {
     protected IEntitlementConfig config;
     protected IEntitlementDao dao;
     protected ClockMock clock;
+    protected IEventBusService busService;
 
     protected IAccount account;
     protected ICatalog catalog;
     protected ApiTestListener testListener;
     protected ISubscriptionBundle bundle;
 
-    private InjectorMagic injectorMagic;
-
     public static void loadSystemPropertiesFromClasspath( final String resource )
     {
         final URL url = TestUserApiBase.class.getResource(resource);
@@ -105,6 +106,7 @@ public abstract class TestUserApiBase {
     @AfterClass(groups={"setup"})
     public void tearDown() {
         InjectorMagic.instance = null;
+        ((EventBusService) busService).stopBus();
     }
 
     @BeforeClass(groups={"setup"})
@@ -113,18 +115,17 @@ public abstract class TestUserApiBase {
         loadSystemPropertiesFromClasspath("/entitlement.properties");
         final Injector g = getInjector();
 
-        injectorMagic = g.getInstance(InjectorMagic.class);
-
-
         entitlementService = g.getInstance(IEntitlementService.class);
         catalogService = g.getInstance(ICatalogService.class);
+        busService = g.getInstance(IEventBusService.class);
         config = g.getInstance(IEntitlementConfig.class);
         dao = g.getInstance(IEntitlementDao.class);
         clock = (ClockMock) g.getInstance(IClock.class);
         try {
 
             ((CatalogService) catalogService).loadCatalog();
-            ((Engine)entitlementService).initialize();
+            ((EventBusService) busService).startBus();
+            ((Engine) entitlementService).initialize();
             init();
         } catch (EntitlementUserApiException e) {
             Assert.fail(e.getMessage());
@@ -142,10 +143,9 @@ public abstract class TestUserApiBase {
         catalog = catalogService.getCatalog();
         assertNotNull(catalog);
 
-        testListener = new ApiTestListener();
-        List<IApiListener> listeners =  new ArrayList<IApiListener>();
-        listeners.add(testListener);
-        entitlementApi = entitlementService.getUserApi(listeners);
+
+        testListener = new ApiTestListener(busService.getEventBus());
+        entitlementApi = entitlementService.getUserApi();
         billingApi = entitlementService.getBillingApi();
 
     }
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/glue/EngineModuleMock.java b/entitlement/src/test/java/com/ning/billing/entitlement/glue/EngineModuleMock.java
index d70a2f7..de812ee 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/glue/EngineModuleMock.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/glue/EngineModuleMock.java
@@ -18,6 +18,7 @@ package com.ning.billing.entitlement.glue;
 
 import com.ning.billing.util.clock.ClockMock;
 import com.ning.billing.util.clock.IClock;
+import com.ning.billing.util.glue.EventBusModule;
 
 public class EngineModuleMock extends EntitlementModule {
 
@@ -29,6 +30,7 @@ public class EngineModuleMock extends EntitlementModule {
     @Override
     protected void configure() {
         super.configure();
+        install(new EventBusModule());
     }
 
 }

util/pom.xml 9(+4 -5)

diff --git a/util/pom.xml b/util/pom.xml
index 2143767..8d1fd74 100644
--- a/util/pom.xml
+++ b/util/pom.xml
@@ -29,6 +29,10 @@
             <artifactId>bonecp</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.jdbi</groupId>
+            <artifactId>jdbi</artifactId>
+        </dependency>
+        <dependency>
             <groupId>com.google.inject</groupId>
             <artifactId>guice</artifactId>
             <version>3.0</version>
@@ -47,11 +51,6 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.jdbi</groupId>
-            <artifactId>jdbi</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
             <groupId>org.testng</groupId>
             <artifactId>testng</artifactId>
             <scope>test</scope>