killbill-aplcache

More work on osgi-killbill library to export APIs for bundles

2/22/2013 11:48:55 PM

Details

diff --git a/api/src/main/java/com/ning/billing/osgi/api/OSGIKillbill.java b/api/src/main/java/com/ning/billing/osgi/api/OSGIKillbill.java
index b9a7adc..646afd9 100644
--- a/api/src/main/java/com/ning/billing/osgi/api/OSGIKillbill.java
+++ b/api/src/main/java/com/ning/billing/osgi/api/OSGIKillbill.java
@@ -16,12 +16,9 @@
 
 package com.ning.billing.osgi.api;
 
-import javax.sql.DataSource;
-
 import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.analytics.api.sanity.AnalyticsSanityApi;
 import com.ning.billing.analytics.api.user.AnalyticsUserApi;
-import com.ning.billing.beatrix.bus.api.ExternalBus;
 import com.ning.billing.catalog.api.CatalogUserApi;
 import com.ning.billing.entitlement.api.migration.EntitlementMigrationApi;
 import com.ning.billing.entitlement.api.timeline.EntitlementTimelineApi;
@@ -51,32 +48,42 @@ public interface OSGIKillbill {
      * @return the matching API
      */
     public AccountUserApi getAccountUserApi();
+
     public AnalyticsSanityApi getAnalyticsSanityApi();
+
     public AnalyticsUserApi getAnalyticsUserApi();
+
     public CatalogUserApi getCatalogUserApi();
+
     public EntitlementMigrationApi getEntitlementMigrationApi();
+
     public EntitlementTimelineApi getEntitlementTimelineApi();
+
     public EntitlementTransferApi getEntitlementTransferApi();
+
     public EntitlementUserApi getEntitlementUserApi();
+
     public InvoiceMigrationApi getInvoiceMigrationApi();
+
     public InvoicePaymentApi getInvoicePaymentApi();
+
     public InvoiceUserApi getInvoiceUserApi();
+
     public OverdueUserApi getOverdueUserApi();
+
     public PaymentApi getPaymentApi();
+
     public TenantUserApi getTenantUserApi();
+
     public UsageUserApi getUsageUserApi();
+
     public AuditUserApi getAuditUserApi();
+
     public CustomFieldUserApi getCustomFieldUserApi();
-    public ExportUserApi getExportUserApi();
-    public TagUserApi getTagUserApi();
 
-    /**
-     * Used by the OSGI bundles to register interest into Killbill events
-     *
-     * @return the externalBus
-     */
-    public ExternalBus getExternalBus();
+    public ExportUserApi getExportUserApi();
 
+    public TagUserApi getTagUserApi();
 
     /**
      * Used by the OSGI bundles to discover their configuration
@@ -84,11 +91,4 @@ public interface OSGIKillbill {
      * @return the PluginConfigServiceApi
      */
     public PluginConfigServiceApi getPluginConfigServiceApi();
-
-
-    /**
-     * Used by the OSGI bundles to be able to access their own sql tables
-     * @return the dataSource for the OSGI bundles
-     */
-    public DataSource getDataSource();
 }

osgi/pom.xml 4(+4 -0)

diff --git a/osgi/pom.xml b/osgi/pom.xml
index 5dea1e9..ea8b687 100644
--- a/osgi/pom.xml
+++ b/osgi/pom.xml
@@ -53,6 +53,10 @@
             <artifactId>killbill-util</artifactId>
         </dependency>
         <dependency>
+            <groupId>com.ning.billing</groupId>
+            <artifactId>killbill-osgi-bundles-lib-killbill</artifactId>
+        </dependency>
+        <dependency>
             <groupId>com.google.inject</groupId>
             <artifactId>guice</artifactId>
             <scope>provided</scope>
diff --git a/osgi/src/main/java/com/ning/billing/osgi/DefaultOSGIKillbill.java b/osgi/src/main/java/com/ning/billing/osgi/DefaultOSGIKillbill.java
index 519465f..ea43446 100644
--- a/osgi/src/main/java/com/ning/billing/osgi/DefaultOSGIKillbill.java
+++ b/osgi/src/main/java/com/ning/billing/osgi/DefaultOSGIKillbill.java
@@ -23,7 +23,6 @@ import javax.sql.DataSource;
 import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.analytics.api.sanity.AnalyticsSanityApi;
 import com.ning.billing.analytics.api.user.AnalyticsUserApi;
-import com.ning.billing.beatrix.bus.api.ExternalBus;
 import com.ning.billing.catalog.api.CatalogUserApi;
 import com.ning.billing.entitlement.api.migration.EntitlementMigrationApi;
 import com.ning.billing.entitlement.api.timeline.EntitlementTimelineApi;
@@ -65,15 +64,10 @@ public class DefaultOSGIKillbill implements OSGIKillbill {
     private final CustomFieldUserApi customFieldUserApi;
     private final ExportUserApi exportUserApi;
     private final TagUserApi tagUserApi;
-
-    private final ExternalBus externalBus;
     private final PluginConfigServiceApi configServiceApi;
 
-    private final DataSource dataSource;
-
     @Inject
-    public DefaultOSGIKillbill(@Named(DefaultOSGIModule.OSGI_NAMED) final DataSource dataSource,
-                               final AccountUserApi accountUserApi,
+    public DefaultOSGIKillbill(final AccountUserApi accountUserApi,
                                final AnalyticsSanityApi analyticsSanityApi,
                                final AnalyticsUserApi analyticsUserApi,
                                final CatalogUserApi catalogUserApi,
@@ -92,9 +86,7 @@ public class DefaultOSGIKillbill implements OSGIKillbill {
                                final CustomFieldUserApi customFieldUserApi,
                                final ExportUserApi exportUserApi,
                                final TagUserApi tagUserApi,
-                               final ExternalBus externalBus,
                                final PluginConfigServiceApi configServiceApi) {
-        this.dataSource = dataSource;
         this.accountUserApi = accountUserApi;
         this.analyticsSanityApi = analyticsSanityApi;
         this.analyticsUserApi = analyticsUserApi;
@@ -114,7 +106,6 @@ public class DefaultOSGIKillbill implements OSGIKillbill {
         this.customFieldUserApi = customFieldUserApi;
         this.exportUserApi = exportUserApi;
         this.tagUserApi = tagUserApi;
-        this.externalBus = externalBus;
         this.configServiceApi = configServiceApi;
     }
 
@@ -214,17 +205,7 @@ public class DefaultOSGIKillbill implements OSGIKillbill {
     }
 
     @Override
-    public ExternalBus getExternalBus() {
-        return externalBus;
-    }
-
-    @Override
     public PluginConfigServiceApi getPluginConfigServiceApi() {
         return configServiceApi;
     }
-
-    @Override
-    public DataSource getDataSource() {
-        return dataSource;
-    }
 }
diff --git a/osgi/src/main/java/com/ning/billing/osgi/glue/DefaultOSGIModule.java b/osgi/src/main/java/com/ning/billing/osgi/glue/DefaultOSGIModule.java
index 32d2811..c793069 100644
--- a/osgi/src/main/java/com/ning/billing/osgi/glue/DefaultOSGIModule.java
+++ b/osgi/src/main/java/com/ning/billing/osgi/glue/DefaultOSGIModule.java
@@ -26,6 +26,7 @@ import org.skife.config.ConfigurationObjectFactory;
 import com.ning.billing.osgi.DefaultOSGIKillbill;
 import com.ning.billing.osgi.DefaultOSGIService;
 import com.ning.billing.osgi.KillbillActivator;
+import com.ning.billing.osgi.KillbillEventObservable;
 import com.ning.billing.osgi.PureOSGIBundleFinder;
 import com.ning.billing.osgi.api.OSGIKillbill;
 import com.ning.billing.osgi.api.OSGIService;
@@ -77,6 +78,7 @@ public class DefaultOSGIModule extends AbstractModule {
         bind(PluginConfigServiceApi.class).to(DefaultPluginConfigServiceApi.class).asEagerSingleton();
         bind(OSGIKillbill.class).to(DefaultOSGIKillbill.class).asEagerSingleton();
         bind(OSGIDataSourceProvider.class).asEagerSingleton();
+        bind(KillbillEventObservable.class).asEagerSingleton();
         bind(DataSource.class).annotatedWith(Names.named(OSGI_NAMED)).toProvider(OSGIDataSourceProvider.class).asEagerSingleton();
     }
 }
diff --git a/osgi/src/main/java/com/ning/billing/osgi/KillbillActivator.java b/osgi/src/main/java/com/ning/billing/osgi/KillbillActivator.java
index 79f082b..8d493a8 100644
--- a/osgi/src/main/java/com/ning/billing/osgi/KillbillActivator.java
+++ b/osgi/src/main/java/com/ning/billing/osgi/KillbillActivator.java
@@ -16,10 +16,15 @@
 
 package com.ning.billing.osgi;
 
+import java.util.Dictionary;
+import java.util.Hashtable;
 import java.util.List;
+import java.util.Observable;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 import javax.servlet.Servlet;
+import javax.sql.DataSource;
 
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
@@ -32,7 +37,9 @@ import org.osgi.service.http.HttpService;
 import com.ning.billing.osgi.api.OSGIKillbill;
 import com.ning.billing.osgi.api.OSGIPluginProperties;
 import com.ning.billing.osgi.api.OSGIServiceRegistration;
+import com.ning.billing.osgi.glue.DefaultOSGIModule;
 import com.ning.billing.payment.plugin.api.PaymentPluginApi;
+import com.ning.killbill.osgi.libs.killbill.OSGIKillbillRegistrar;
 
 import com.google.common.collect.ImmutableList;
 
@@ -40,36 +47,57 @@ public class KillbillActivator implements BundleActivator, ServiceListener {
 
     private final OSGIKillbill osgiKillbill;
     private final HttpService defaultHttpService;
-    private final List<OSGIServiceRegistration> allRegistrationHandlers;
+    private final DataSource dataSource;
+    private final KillbillEventObservable observable;
+    private final OSGIKillbillRegistrar registrar;
+
 
     private volatile ServiceRegistration osgiKillbillRegistration;
+    private final List<OSGIServiceRegistration> allRegistrationHandlers;
+
 
     private BundleContext context = null;
 
     @Inject
-    public KillbillActivator(final OSGIKillbill osgiKillbill,
+    public KillbillActivator(@Named(DefaultOSGIModule.OSGI_NAMED) final DataSource dataSource,
+                             final OSGIKillbill osgiKillbill,
                              final HttpService defaultHttpService,
+                             final KillbillEventObservable observable,
+
                              final OSGIServiceRegistration<Servlet> servletRouter,
                              final OSGIServiceRegistration<PaymentPluginApi> paymentProviderPluginRegistry) {
         this.osgiKillbill = osgiKillbill;
         this.defaultHttpService = defaultHttpService;
+        this.dataSource = dataSource;
+        this.observable = observable;
+        this.registrar = new OSGIKillbillRegistrar();
         this.allRegistrationHandlers = ImmutableList.<OSGIServiceRegistration>of(servletRouter, paymentProviderPluginRegistry);
+
     }
 
     @Override
     public void start(final BundleContext context) throws Exception {
         this.context = context;
 
+        final Dictionary props = new Hashtable();
+        props.put(OSGIPluginProperties.PLUGIN_NAME_PROP, "killbill");
+
+        observable.register();
+
+        registrar.registerService(context, OSGIKillbill.class, osgiKillbill, props);
+        registrar.registerService(context, HttpService.class, defaultHttpService, props);
+        registrar.registerService(context, Observable.class, observable, props);
+        registrar.registerService(context, DataSource.class, dataSource, props);
+
         context.addServiceListener(this);
-        registerServices(context);
     }
 
     @Override
     public void stop(final BundleContext context) throws Exception {
         this.context = null;
-
         context.removeServiceListener(this);
-        unregisterServices();
+        observable.unregister();
+        registrar.unregisterAll();
     }
 
     @Override
@@ -113,17 +141,4 @@ public class KillbillActivator implements BundleActivator, ServiceListener {
 
         return true;
     }
-
-    private void registerServices(final BundleContext context) {
-        osgiKillbillRegistration = context.registerService(OSGIKillbill.class.getName(), osgiKillbill, null);
-
-        context.registerService(HttpService.class.getName(), defaultHttpService, null);
-    }
-
-    private void unregisterServices() {
-        if (osgiKillbillRegistration != null) {
-            osgiKillbillRegistration.unregister();
-            osgiKillbillRegistration = null;
-        }
-    }
 }
diff --git a/osgi/src/main/java/com/ning/billing/osgi/KillbillEventObservable.java b/osgi/src/main/java/com/ning/billing/osgi/KillbillEventObservable.java
new file mode 100644
index 0000000..14d7f4d
--- /dev/null
+++ b/osgi/src/main/java/com/ning/billing/osgi/KillbillEventObservable.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2010-2013 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.osgi;
+
+import java.util.Observable;
+
+import javax.inject.Inject;
+
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.ning.billing.beatrix.bus.api.ExtBusEvent;
+import com.ning.billing.beatrix.bus.api.ExternalBus;
+
+import com.google.common.eventbus.Subscribe;
+
+public class KillbillEventObservable extends Observable {
+
+
+    private Logger logger = LoggerFactory.getLogger(KillbillEventObservable.class);
+
+    private final ExternalBus externalBus;
+
+    @Inject
+    public KillbillEventObservable(final ExternalBus externalBus) {
+        this.externalBus = externalBus;
+    }
+
+    public void register() {
+        externalBus.register(this);
+    }
+
+    public void unregister() {
+        deleteObservers();
+        if (externalBus != null) {
+            externalBus.unregister(this);
+        }
+    }
+
+    @Subscribe
+    public void handleKillbillEvent(final ExtBusEvent killbillEvent) {
+        logger.debug("Received external event " + killbillEvent.toString());
+        setChanged();
+        notifyObservers(killbillEvent);
+    }
+}
diff --git a/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/Activator.java b/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/Activator.java
index 559a434..e5c2f15 100644
--- a/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/Activator.java
+++ b/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/Activator.java
@@ -28,19 +28,19 @@ import org.osgi.service.log.LogService;
 import com.ning.billing.osgi.api.config.PluginConfig.PluginType;
 import com.ning.billing.osgi.api.config.PluginConfigServiceApi;
 import com.ning.billing.osgi.api.config.PluginRubyConfig;
+import com.ning.killbill.osgi.libs.killbill.OSGIKillbillAPI;
 import com.ning.killbill.osgi.libs.killbill.OSGIKillbillLogService;
-import com.ning.killbill.osgi.libs.killbill.OSGIKillbillTracker;
 
 public class Activator implements BundleActivator {
 
-    private OSGIKillbillTracker kb;
+    private OSGIKillbillAPI kb;
     private OSGIKillbillLogService logService;
 
     private JRubyPlugin plugin = null;
 
     public void start(final BundleContext context) throws Exception {
 
-        kb = new OSGIKillbillTracker(context);
+        kb = new OSGIKillbillAPI(context);
         logService = new OSGIKillbillLogService(context);
 
         logService.log(LogService.LOG_INFO, "JRuby bundle activated");
diff --git a/osgi-bundles/libs/killbill/src/main/java/com/ning/killbill/osgi/libs/killbill/OSGIKillbillDataSource.java b/osgi-bundles/libs/killbill/src/main/java/com/ning/killbill/osgi/libs/killbill/OSGIKillbillDataSource.java
new file mode 100644
index 0000000..6e1c671
--- /dev/null
+++ b/osgi-bundles/libs/killbill/src/main/java/com/ning/killbill/osgi/libs/killbill/OSGIKillbillDataSource.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2010-2013 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.killbill.osgi.libs.killbill;
+
+import javax.sql.DataSource;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class OSGIKillbillDataSource extends OSGIKillbillLibraryBase {
+
+    private static final String DATASOURCE_SERVICE_NAME = "javax.sql.DataSource";
+
+    private final ServiceTracker<DataSource, DataSource> dataSourceTracker;
+
+
+    public OSGIKillbillDataSource(BundleContext context) {
+        dataSourceTracker = new ServiceTracker(context, DATASOURCE_SERVICE_NAME, null);
+        dataSourceTracker.open();
+    }
+
+    public void close() {
+        if (dataSourceTracker != null) {
+            dataSourceTracker.close();
+        }
+    }
+
+    public DataSource getDataSource() {
+        return withServiceTracker(dataSourceTracker, new APICallback<DataSource, DataSource>(DATASOURCE_SERVICE_NAME) {
+            @Override
+            public DataSource executeWithService(final DataSource service) {
+                return dataSourceTracker.getService();
+            }
+        });
+    }
+}
diff --git a/osgi-bundles/libs/killbill/src/main/java/com/ning/killbill/osgi/libs/killbill/OSGIKillbillEventDispatcher.java b/osgi-bundles/libs/killbill/src/main/java/com/ning/killbill/osgi/libs/killbill/OSGIKillbillEventDispatcher.java
new file mode 100644
index 0000000..1bdf9fe
--- /dev/null
+++ b/osgi-bundles/libs/killbill/src/main/java/com/ning/killbill/osgi/libs/killbill/OSGIKillbillEventDispatcher.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2010-2013 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.killbill.osgi.libs.killbill;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Observable;
+import java.util.Observer;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+import com.ning.billing.beatrix.bus.api.ExtBusEvent;
+
+public class OSGIKillbillEventDispatcher extends OSGIKillbillLibraryBase {
+
+    private static final String OBSERVABLE_SERVICE_NAME = "java.util.Observable";
+
+    private final ServiceTracker<Observable, Observable> observableTracker;
+
+
+    private final Map<OSGIKillbillEventHandler, Observer> handlerToObserver;
+
+    public OSGIKillbillEventDispatcher(BundleContext context) {
+        handlerToObserver = new HashMap<OSGIKillbillEventHandler, Observer>();
+        observableTracker = new ServiceTracker(context, OBSERVABLE_SERVICE_NAME, null);
+        observableTracker.open();
+    }
+
+    public void close() {
+        if (observableTracker != null) {
+            observableTracker.close();
+        }
+        handlerToObserver.clear();
+    }
+
+    public void registerEventHandler(final OSGIKillbillEventHandler handler) {
+
+        withServiceTracker(observableTracker, new APICallback<Void, Observable>(OBSERVABLE_SERVICE_NAME) {
+            @Override
+            public Void executeWithService(final Observable service) {
+
+                final Observer observer = new Observer() {
+                    @Override
+                    public void update(final Observable o, final Object arg) {
+                        if (!(arg instanceof ExtBusEvent)) {
+                            // TODO STEPH or should we throw because that should not happen
+                            return;
+                        }
+                        handler.handleKillbillEvent((ExtBusEvent) arg);
+                    }
+                };
+                handlerToObserver.put(handler, observer);
+                service.addObserver(observer);
+                return null;
+            }
+        });
+    }
+
+    public void unregisterEventHandler(final OSGIKillbillEventHandler handler) {
+        withServiceTracker(observableTracker, new APICallback<Void, Observable>(OBSERVABLE_SERVICE_NAME) {
+            @Override
+            public Void executeWithService(final Observable service) {
+
+                final Observer observer = handlerToObserver.get(handler);
+                if (observer != null) {
+                    service.deleteObserver(observer);
+                    handlerToObserver.remove(handler);
+                }
+                return null;
+            }
+        });
+
+    }
+
+    public interface OSGIKillbillEventHandler {
+
+        public void handleKillbillEvent(final ExtBusEvent killbillEvent);
+    }
+
+}
diff --git a/osgi-bundles/libs/killbill/src/main/java/com/ning/killbill/osgi/libs/killbill/OSGIKillbillRegistrar.java b/osgi-bundles/libs/killbill/src/main/java/com/ning/killbill/osgi/libs/killbill/OSGIKillbillRegistrar.java
index c2c79e0..7168b95 100644
--- a/osgi-bundles/libs/killbill/src/main/java/com/ning/killbill/osgi/libs/killbill/OSGIKillbillRegistrar.java
+++ b/osgi-bundles/libs/killbill/src/main/java/com/ning/killbill/osgi/libs/killbill/OSGIKillbillRegistrar.java
@@ -23,8 +23,6 @@ import java.util.Map;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 
-import com.ning.billing.payment.plugin.api.PaymentPluginApi;
-
 public class OSGIKillbillRegistrar {
 
     private final Map<String, ServiceRegistration> serviceRegistrations;
@@ -34,7 +32,7 @@ public class OSGIKillbillRegistrar {
     }
 
     public <S, T extends S> void registerService(final BundleContext context, final Class<S> svcClass, final S service, final Dictionary props) {
-        ServiceRegistration svcRegistration =  context.registerService(svcClass.getName(), service, props);
+        ServiceRegistration svcRegistration = context.registerService(svcClass.getName(), service, props);
         serviceRegistrations.put(svcClass.getName(), svcRegistration);
     }
 
diff --git a/osgi-bundles/tests/beatrix/pom.xml b/osgi-bundles/tests/beatrix/pom.xml
index 81f2fc0..4f06c99 100644
--- a/osgi-bundles/tests/beatrix/pom.xml
+++ b/osgi-bundles/tests/beatrix/pom.xml
@@ -29,10 +29,6 @@
     <packaging>bundle</packaging>
     <dependencies>
         <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-        </dependency>
-        <dependency>
             <groupId>com.ning.billing</groupId>
             <artifactId>killbill-api</artifactId>
         </dependency>
@@ -40,14 +36,6 @@
             <groupId>com.ning.billing</groupId>
             <artifactId>killbill-osgi-bundles-lib-killbill</artifactId>
         </dependency>
-
-
-        <!--
-        <dependency>
-            <groupId>com.ning.billing</groupId>
-            <artifactId>killbill-osgi-all-bundles</artifactId>
-        </dependency>
--->
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
diff --git a/osgi-bundles/tests/beatrix/src/test/java/com/ning/billing/osgi/bundles/test/TestActivator.java b/osgi-bundles/tests/beatrix/src/test/java/com/ning/billing/osgi/bundles/test/TestActivator.java
index 834a0c5..7b3a6bf 100644
--- a/osgi-bundles/tests/beatrix/src/test/java/com/ning/billing/osgi/bundles/test/TestActivator.java
+++ b/osgi-bundles/tests/beatrix/src/test/java/com/ning/billing/osgi/bundles/test/TestActivator.java
@@ -18,6 +18,8 @@ package com.ning.billing.osgi.bundles.test;
 
 import java.util.Dictionary;
 import java.util.Hashtable;
+import java.util.Observable;
+import java.util.Observer;
 import java.util.UUID;
 
 import org.osgi.framework.BundleActivator;
@@ -30,16 +32,16 @@ import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.beatrix.bus.api.ExtBusEvent;
 import com.ning.billing.beatrix.bus.api.ExtBusEventType;
-import com.ning.billing.beatrix.bus.api.ExternalBus;
 import com.ning.billing.osgi.api.OSGIPluginProperties;
 import com.ning.billing.osgi.bundles.test.dao.TestDao;
 import com.ning.billing.payment.plugin.api.PaymentPluginApi;
 import com.ning.billing.util.callcontext.TenantContext;
+import com.ning.killbill.osgi.libs.killbill.OSGIKillbillAPI;
+import com.ning.killbill.osgi.libs.killbill.OSGIKillbillDataSource;
+import com.ning.killbill.osgi.libs.killbill.OSGIKillbillEventDispatcher;
+import com.ning.killbill.osgi.libs.killbill.OSGIKillbillEventDispatcher.OSGIKillbillEventHandler;
 import com.ning.killbill.osgi.libs.killbill.OSGIKillbillLogService;
 import com.ning.killbill.osgi.libs.killbill.OSGIKillbillRegistrar;
-import com.ning.killbill.osgi.libs.killbill.OSGIKillbillTracker;
-
-import com.google.common.eventbus.Subscribe;
 
 /**
  * Test class used by Beatrix OSGI test to verify that:
@@ -48,11 +50,14 @@ import com.google.common.eventbus.Subscribe;
  * - test bundle is able to register a fake PaymentApi service
  * - test bundle can use the DataSource from Killbill and write on disk
  */
-public class TestActivator implements BundleActivator {
+public class TestActivator implements BundleActivator, OSGIKillbillEventHandler {
 
-    private OSGIKillbillTracker kb;
+    private OSGIKillbillAPI api;
     private OSGIKillbillLogService logService;
     private OSGIKillbillRegistrar registrar;
+    private OSGIKillbillDataSource dataSource;
+    private OSGIKillbillEventDispatcher dispatcher;
+
     private TestDao testDao;
 
     @Override
@@ -61,33 +66,41 @@ public class TestActivator implements BundleActivator {
         final String bundleName = context.getBundle().getSymbolicName();
         System.out.println("TestActivator starting bundle = " + bundleName);
 
-        kb = new OSGIKillbillTracker(context);
+        api = new OSGIKillbillAPI(context);
         logService = new OSGIKillbillLogService(context);
-
+        dataSource = new OSGIKillbillDataSource(context);
+        dispatcher = new OSGIKillbillEventDispatcher(context);
+        dispatcher.registerEventHandler(this);
         registrar = new OSGIKillbillRegistrar();
 
-        final IDBI dbi = new DBI(kb.getDataSource());
+        final IDBI dbi = new DBI(dataSource.getDataSource());
         testDao = new TestDao(dbi);
         registerPaymentApi(context, testDao);
-
-        registerForKillbillEvents(context);
-
         testDao.createTable();
-
         testDao.insertStarted();
     }
 
     @Override
     public void stop(final BundleContext context) {
-        if (kb != null) {
-            kb.close();
-            this.kb = null;
-        }
+        api.close();
+        logService.close();
+        dispatcher.unregisterEventHandler(this);
+        dispatcher.close();
+        dataSource.close();
+
         registrar.unregisterAll();
         System.out.println("Good bye world from TestActivator!");
     }
 
-    @Subscribe
+
+    private void registerPaymentApi(final BundleContext context, final TestDao dao) {
+
+        final Dictionary props = new Hashtable();
+        props.put(OSGIPluginProperties.PLUGIN_NAME_PROP, "test");
+        registrar.registerService(context, PaymentPluginApi.class, new TestPaymentPluginApi("test", dao), props);
+    }
+
+    @Override
     public void handleKillbillEvent(final ExtBusEvent killbillEvent) {
 
         logService.log(LogService.LOG_INFO, "Received external event " + killbillEvent.toString());
@@ -105,7 +118,7 @@ public class TestActivator implements BundleActivator {
         };
 
         try {
-            Account account = kb.getAccountUserApi().getAccountById(killbillEvent.getAccountId(), tenantContext);
+            Account account = api.getAccountUserApi().getAccountById(killbillEvent.getAccountId(), tenantContext);
             testDao.insertAccountExternalKey(account.getExternalKey());
 
         } catch (AccountApiException e) {
@@ -113,21 +126,4 @@ public class TestActivator implements BundleActivator {
         }
     }
 
-
-    private void registerForKillbillEvents(final BundleContext context) {
-        try {
-            final ExternalBus externalBus = kb.getExternalBus();
-            externalBus.register(this);
-        } catch (Exception e) {
-            System.err.println("Error in TestActivator: " + e.getLocalizedMessage());
-        } finally {
-        }
-    }
-
-    private void registerPaymentApi(final BundleContext context, final TestDao dao) {
-
-        final Dictionary props = new Hashtable();
-        props.put(OSGIPluginProperties.PLUGIN_NAME_PROP, "test");
-        registrar.registerService(context, PaymentPluginApi.class, new TestPaymentPluginApi("test", dao), props);
-    }
 }
diff --git a/util/src/main/java/com/ning/billing/util/config/OSGIConfig.java b/util/src/main/java/com/ning/billing/util/config/OSGIConfig.java
index 44b44c2..bef6e97 100644
--- a/util/src/main/java/com/ning/billing/util/config/OSGIConfig.java
+++ b/util/src/main/java/com/ning/billing/util/config/OSGIConfig.java
@@ -57,7 +57,6 @@ public interface OSGIConfig extends KillbillConfig {
              "com.ning.billing.usage.api," +
              "com.ning.billing.util.api," +
              "com.ning.billing.util.callcontext," +
-             "com.google.common.eventbus," +
              // javax.servlet and javax.servlet.http are not exported by default - we
              // need the bundles to see them for them to be able to register their servlets.
              // Note: bundles should mark javax.servlet:servlet-api as provided