killbill-aplcache

Details

diff --git a/osgi-bundles/bundles/jruby/pom.xml b/osgi-bundles/bundles/jruby/pom.xml
index f3dba84..42e737e 100644
--- a/osgi-bundles/bundles/jruby/pom.xml
+++ b/osgi-bundles/bundles/jruby/pom.xml
@@ -36,6 +36,10 @@
             <artifactId>killbill-api</artifactId>
         </dependency>
         <dependency>
+            <groupId>com.ning.billing</groupId>
+            <artifactId>killbill-osgi-bundles-lib-killbill</artifactId>
+        </dependency>
+        <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
         </dependency>
@@ -79,7 +83,7 @@
                         <Export-Package></Export-Package>
                         <Private-Package>com.ning.billing.osgi.bundles.jruby.*</Private-Package>
                         <!-- Optional resolution because exported by the Felix system bundle -->
-                        <Import-Package>*;resolution:=optional,javax.management;javax.management.*;javax.crypto;javax.crypto.*;javax.net;javax.net.*;javax.net.ssl;javax.net.ssl.*;javax.security;javax.security.*;javax.security.cert;javax.security.cert.*;javax.security.auth;javax.security.auth.*;javax.security.auth.x500;javax.security.auth.x500.*;resolution:=optional</Import-Package>
+                        <Import-Package>*;resolution:=optional,com.ning.billing.osgi.api,javax.management;javax.management.*;javax.crypto;javax.crypto.*;javax.net;javax.net.*;javax.net.ssl;javax.net.ssl.*;javax.security;javax.security.*;javax.security.cert;javax.security.cert.*;javax.security.auth;javax.security.auth.*;javax.security.auth.x500;javax.security.auth.x500.*;resolution:=optional</Import-Package>
                     </instructions>
                 </configuration>
                 <executions>
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 78d4cde..559a434 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
@@ -16,36 +16,34 @@
 
 package com.ning.billing.osgi.bundles.jruby;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import org.jruby.embed.ScriptingContainer;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
 import org.osgi.service.log.LogService;
 
-import com.ning.billing.osgi.api.OSGIKillbill;
 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.OSGIKillbillLogService;
+import com.ning.killbill.osgi.libs.killbill.OSGIKillbillTracker;
 
 public class Activator implements BundleActivator {
 
-    private final List<ServiceReference<?>> serviceReferences = new ArrayList<ServiceReference<?>>();
-    private final Logger logger = new Logger();
+    private OSGIKillbillTracker kb;
+    private OSGIKillbillLogService logService;
 
-    private OSGIKillbill osgiKillbill;
     private JRubyPlugin plugin = null;
 
     public void start(final BundleContext context) throws Exception {
-        logger.start(context);
 
-        osgiKillbill = retrieveApi(context, OSGIKillbill.class);
-        logger.log(LogService.LOG_INFO, "JRuby bundle activated");
+        kb = new OSGIKillbillTracker(context);
+        logService = new OSGIKillbillLogService(context);
+
+        logService.log(LogService.LOG_INFO, "JRuby bundle activated");
 
         doMagicToMakeJRubyAndFelixHappy();
 
@@ -55,24 +53,24 @@ public class Activator implements BundleActivator {
         // Setup JRuby
         final ScriptingContainer scriptingContainer = setupScriptingContainer(rubyConfig);
         if (PluginType.NOTIFICATION.equals(rubyConfig.getPluginType())) {
-            plugin = new JRubyNotificationPlugin(rubyConfig, scriptingContainer, context, logger);
+            plugin = new JRubyNotificationPlugin(rubyConfig, scriptingContainer, context, logService);
         } else if (PluginType.PAYMENT.equals(rubyConfig.getPluginType())) {
-            plugin = new JRubyPaymentPlugin(rubyConfig, scriptingContainer, context, logger);
+            plugin = new JRubyPaymentPlugin(rubyConfig, scriptingContainer, context, logService);
         }
 
         // Validate and instantiate the plugin
 
         final Map<String, Object> killbillServices = retrieveKillbillApis(context);
         killbillServices.put("root", rubyConfig.getPluginVersionRoot().getAbsolutePath());
-        killbillServices.put("logger", logger);
+        killbillServices.put("logger", logService);
         plugin.instantiatePlugin(killbillServices);
 
-        logger.log(LogService.LOG_INFO, "Starting JRuby plugin " + plugin.getPluginMainClass());
+        logService.log(LogService.LOG_INFO, "Starting JRuby plugin " + plugin.getPluginMainClass());
         plugin.startPlugin(context);
     }
 
     private PluginRubyConfig retrievePluginRubyConfig(final BundleContext context) {
-        final PluginConfigServiceApi pluginConfigServiceApi = osgiKillbill.getPluginConfigServiceApi();
+        final PluginConfigServiceApi pluginConfigServiceApi = kb.getPluginConfigServiceApi();
         return pluginConfigServiceApi.getPluginRubyConfig(context.getBundle().getBundleId());
     }
 
@@ -93,60 +91,35 @@ public class Activator implements BundleActivator {
     }
 
     public void stop(final BundleContext context) throws Exception {
-        logger.log(LogService.LOG_INFO, "Stopping JRuby plugin " + plugin.getPluginMainClass());
         plugin.stopPlugin(context);
-
-        for (final ServiceReference apiReference : serviceReferences) {
-            context.ungetService(apiReference);
-        }
-
-        logger.close();
+        kb.close();
+        logService.close();
     }
 
     private Map<String, Object> retrieveKillbillApis(final BundleContext context) {
         final Map<String, Object> killbillUserApis = new HashMap<String, Object>();
 
         // See killbill/plugin.rb for the naming convention magic
-        killbillUserApis.put("account_user_api", osgiKillbill.getAccountUserApi());
-        killbillUserApis.put("analytics_sanity_api", osgiKillbill.getAnalyticsSanityApi());
-        killbillUserApis.put("analytics_user_api", osgiKillbill.getAnalyticsUserApi());
-        killbillUserApis.put("catalog_user_api", osgiKillbill.getCatalogUserApi());
-        killbillUserApis.put("entitlement_migration_api", osgiKillbill.getEntitlementMigrationApi());
-        killbillUserApis.put("entitlement_timeline_api", osgiKillbill.getEntitlementMigrationApi());
-        killbillUserApis.put("entitlement_transfer_api", osgiKillbill.getEntitlementTransferApi());
-        killbillUserApis.put("entitlement_user_api", osgiKillbill.getEntitlementUserApi());
-        killbillUserApis.put("invoice_migration_api", osgiKillbill.getInvoiceMigrationApi());
-        killbillUserApis.put("invoice_payment_api", osgiKillbill.getInvoicePaymentApi());
-        killbillUserApis.put("invoice_user_api", osgiKillbill.getInvoiceUserApi());
-        killbillUserApis.put("overdue_user_api", osgiKillbill.getOverdueUserApi());
-        killbillUserApis.put("payment_api", osgiKillbill.getPaymentApi());
-        killbillUserApis.put("tenant_user_api", osgiKillbill.getTagUserApi());
-        killbillUserApis.put("usage_user_api", osgiKillbill.getUsageUserApi());
-        killbillUserApis.put("audit_user_api", osgiKillbill.getAuditUserApi());
-        killbillUserApis.put("custom_field_user_api", osgiKillbill.getCustomFieldUserApi());
-        killbillUserApis.put("export_user_api", osgiKillbill.getExportUserApi());
-        killbillUserApis.put("tag_user_api", osgiKillbill.getTagUserApi());
+        killbillUserApis.put("account_user_api", kb.getAccountUserApi());
+        killbillUserApis.put("analytics_sanity_api", kb.getAnalyticsSanityApi());
+        killbillUserApis.put("analytics_user_api", kb.getAnalyticsUserApi());
+        killbillUserApis.put("catalog_user_api", kb.getCatalogUserApi());
+        killbillUserApis.put("entitlement_migration_api", kb.getEntitlementMigrationApi());
+        killbillUserApis.put("entitlement_timeline_api", kb.getEntitlementMigrationApi());
+        killbillUserApis.put("entitlement_transfer_api", kb.getEntitlementTransferApi());
+        killbillUserApis.put("entitlement_user_api", kb.getEntitlementUserApi());
+        killbillUserApis.put("invoice_migration_api", kb.getInvoiceMigrationApi());
+        killbillUserApis.put("invoice_payment_api", kb.getInvoicePaymentApi());
+        killbillUserApis.put("invoice_user_api", kb.getInvoiceUserApi());
+        killbillUserApis.put("overdue_user_api", kb.getOverdueUserApi());
+        killbillUserApis.put("payment_api", kb.getPaymentApi());
+        killbillUserApis.put("tenant_user_api", kb.getTagUserApi());
+        killbillUserApis.put("usage_user_api", kb.getUsageUserApi());
+        killbillUserApis.put("audit_user_api", kb.getAuditUserApi());
+        killbillUserApis.put("custom_field_user_api", kb.getCustomFieldUserApi());
+        killbillUserApis.put("export_user_api", kb.getExportUserApi());
+        killbillUserApis.put("tag_user_api", kb.getTagUserApi());
 
         return killbillUserApis;
     }
-
-    /**
-     * Retrieve a service class (e.g. Killbill API)
-     *
-     * @param context OSGI Bundle context
-     * @param clazz   service class to retrieve
-     * @param <T>     class type to retrieve
-     * @return instance of the service class
-     */
-    private <T> T retrieveApi(final BundleContext context, final Class<T> clazz) {
-        final ServiceReference<T> apiReference = context.getServiceReference(clazz);
-        if (apiReference != null) {
-            // Keep references to stop the bundle properly
-            serviceReferences.add(apiReference);
-
-            return context.getService(apiReference);
-        } else {
-            return null;
-        }
-    }
 }
diff --git a/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyNotificationPlugin.java b/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyNotificationPlugin.java
index 134e4b5..cb76f64 100644
--- a/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyNotificationPlugin.java
+++ b/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyNotificationPlugin.java
@@ -31,7 +31,7 @@ import com.google.common.eventbus.Subscribe;
 public class JRubyNotificationPlugin extends JRubyPlugin {
 
     public JRubyNotificationPlugin(final PluginRubyConfig config, final ScriptingContainer container,
-                                   final BundleContext bundleContext, final Logger logger) {
+                                   final BundleContext bundleContext, final LogService logger) {
         super(config, container, bundleContext, logger);
     }
 
diff --git a/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyPaymentPlugin.java b/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyPaymentPlugin.java
index 01dbf38..ad59e00 100644
--- a/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyPaymentPlugin.java
+++ b/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyPaymentPlugin.java
@@ -27,6 +27,7 @@ import org.jruby.embed.ScriptingContainer;
 import org.jruby.javasupport.JavaEmbedUtils;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.log.LogService;
 
 import com.ning.billing.osgi.api.config.PluginRubyConfig;
 import com.ning.billing.payment.api.PaymentMethodPlugin;
@@ -43,7 +44,7 @@ public class JRubyPaymentPlugin extends JRubyPlugin implements PaymentPluginApi 
     private volatile ServiceRegistration<PaymentPluginApi> paymentInfoPluginRegistration;
 
     public JRubyPaymentPlugin(final PluginRubyConfig config, final ScriptingContainer container,
-                              final BundleContext bundleContext, final Logger logger) {
+                              final BundleContext bundleContext, final LogService logger) {
         super(config, container, bundleContext, logger);
     }
 
diff --git a/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyPlugin.java b/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyPlugin.java
index 4aaa263..0922ba5 100644
--- a/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyPlugin.java
+++ b/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyPlugin.java
@@ -45,7 +45,7 @@ public abstract class JRubyPlugin {
     private static final String KILLBILL_SERVICES = "java_apis";
     private static final String ACTIVE = "@active";
 
-    protected final Logger logger;
+    protected final LogService logger;
     protected final BundleContext bundleContext;
     protected final String pluginGemName;
     protected final String rubyRequire;
@@ -59,7 +59,7 @@ public abstract class JRubyPlugin {
     private String cachedRequireLine = null;
 
     public JRubyPlugin(final PluginRubyConfig config, final ScriptingContainer container,
-                       final BundleContext bundleContext, final Logger logger) {
+                       final BundleContext bundleContext, final LogService logger) {
         this.logger = logger;
         this.bundleContext = bundleContext;
         this.pluginGemName = config.getPluginName();
diff --git a/osgi-bundles/bundles/meter/pom.xml b/osgi-bundles/bundles/meter/pom.xml
index d2f6a07..c931845 100644
--- a/osgi-bundles/bundles/meter/pom.xml
+++ b/osgi-bundles/bundles/meter/pom.xml
@@ -138,7 +138,7 @@
                     <instructions>
                         <Bundle-Activator>com.ning.billing.meter.osgi.MeterActivator</Bundle-Activator>
                         <Import-Package>
-                            *;resolution:=optional
+                            *;resolution:=optional,com.ning.billing.osgi.api
                         </Import-Package>
                     </instructions>
                 </configuration>
diff --git a/osgi-bundles/libs/killbill/src/main/java/com/ning/killbill/osgi/libs/killbill/OSGIKillbillLibraryBase.java b/osgi-bundles/libs/killbill/src/main/java/com/ning/killbill/osgi/libs/killbill/OSGIKillbillLibraryBase.java
new file mode 100644
index 0000000..ce86b45
--- /dev/null
+++ b/osgi-bundles/libs/killbill/src/main/java/com/ning/killbill/osgi/libs/killbill/OSGIKillbillLibraryBase.java
@@ -0,0 +1,53 @@
+/*
+ * 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 org.osgi.util.tracker.ServiceTracker;
+
+public abstract class OSGIKillbillLibraryBase {
+
+
+    public OSGIKillbillLibraryBase() {
+
+    }
+
+    public abstract void close();
+
+
+    protected abstract class APICallback<API, T> {
+
+        private final String serviceName;
+
+        protected APICallback(final String serviceName) {
+            this.serviceName = serviceName;
+        }
+
+        public abstract API executeWithService(T service);
+
+        protected API executeWithNoService() {
+            throw new OSGIServiceNotAvailable(serviceName);
+        }
+    }
+
+    protected <API, S, T> API withServiceTracker(ServiceTracker<S, T> t, APICallback<API, T> cb) {
+        T service = t.getService();
+        if (service == null) {
+            return cb.executeWithNoService();
+        }
+        return cb.executeWithService(service);
+    }
+}
diff --git a/osgi-bundles/libs/killbill/src/main/java/com/ning/killbill/osgi/libs/killbill/OSGIKillbillTracker.java b/osgi-bundles/libs/killbill/src/main/java/com/ning/killbill/osgi/libs/killbill/OSGIKillbillTracker.java
index 8bd1f97..f89194f 100644
--- a/osgi-bundles/libs/killbill/src/main/java/com/ning/killbill/osgi/libs/killbill/OSGIKillbillTracker.java
+++ b/osgi-bundles/libs/killbill/src/main/java/com/ning/killbill/osgi/libs/killbill/OSGIKillbillTracker.java
@@ -47,33 +47,24 @@ import com.ning.billing.util.api.CustomFieldUserApi;
 import com.ning.billing.util.api.ExportUserApi;
 import com.ning.billing.util.api.TagUserApi;
 
-public class OSGIKillbillTracker implements OSGIKillbill, LogService {
+public class OSGIKillbillTracker extends OSGIKillbillLibraryBase implements OSGIKillbill {
 
 
-    private static final String LOG_SERVICE_NAME = "org.osgi.service.log.LogService";
     private static final String KILLBILL_SERVICE_NAME = "com.ning.billing.osgi.api.OSGIKillbill";
 
-    private final ServiceTracker<LogService, LogService> logTracker;
     private final ServiceTracker<OSGIKillbill, OSGIKillbill> killbillTracker;
 
     public OSGIKillbillTracker(BundleContext context) {
-        logTracker = new ServiceTracker(context, LOG_SERVICE_NAME, null);
-        logTracker.open();
-
         killbillTracker = new ServiceTracker(context, KILLBILL_SERVICE_NAME, null);
         killbillTracker.open();
     }
 
     public void close() {
-        if (logTracker != null) {
-            logTracker.close();
-        }
         if (killbillTracker != null) {
             killbillTracker.close();
         }
     }
 
-
     @Override
     public AccountUserApi getAccountUserApi() {
         return withServiceTracker(killbillTracker, new APICallback<AccountUserApi, OSGIKillbill>(KILLBILL_SERVICE_NAME) {
@@ -295,75 +286,5 @@ public class OSGIKillbillTracker implements OSGIKillbill, LogService {
         });
     }
 
-    @Override
-    public void log(final int level, final String message) {
-        logInternal(level, message, null);
-    }
-
-    @Override
-    public void log(final int level, final String message, final Throwable exception) {
-        logInternal(level, message, exception);
-    }
-
-    @Override
-    public void log(final ServiceReference sr, final int level, final String message) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public void log(final ServiceReference sr, final int level, final String message, final Throwable exception) {
-        throw new UnsupportedOperationException();
-    }
-
-
-    private void logInternal(final int level, final String message, @Nullable final Throwable t) {
-
-        withServiceTracker(logTracker, new APICallback<Void, LogService>(LOG_SERVICE_NAME) {
-            @Override
-            public Void executeWithService(final LogService service) {
-                if (t == null) {
-                    service.log(level, message);
-                } else {
-                    service.log(level, message, t);
-                }
-                return null;
-            }
-
-            protected Void executeWithNoService() {
-
-                if (level >= 2) {
-                    System.out.println(message);
-                } else {
-                    System.err.println(message);
-                }
-                if (t != null) {
-                    t.printStackTrace(System.err);
-                }
-                return null;
-            }
-        });
-    }
-
-    private abstract class APICallback<API, T> {
-        
-        private final String serviceName;
 
-        protected APICallback(final String serviceName) {
-            this.serviceName = serviceName;
-        }
-
-        public abstract API executeWithService(T service);
-
-        protected API executeWithNoService() {
-            throw new OSGIServiceNotAvailable(serviceName);
-        }
-    }
-
-    private <API, S, T> API withServiceTracker(ServiceTracker<S, T> t, APICallback<API, T> foo) {
-        T service = t.getService();
-        if (service == null) {
-            return foo.executeWithNoService();
-        }
-        return foo.executeWithService(service);
-    }
 }
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 f7baff3..834a0c5 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
@@ -35,6 +35,7 @@ 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.OSGIKillbillLogService;
 import com.ning.killbill.osgi.libs.killbill.OSGIKillbillRegistrar;
 import com.ning.killbill.osgi.libs.killbill.OSGIKillbillTracker;
 
@@ -50,6 +51,7 @@ import com.google.common.eventbus.Subscribe;
 public class TestActivator implements BundleActivator {
 
     private OSGIKillbillTracker kb;
+    private OSGIKillbillLogService logService;
     private OSGIKillbillRegistrar registrar;
     private TestDao testDao;
 
@@ -60,6 +62,7 @@ public class TestActivator implements BundleActivator {
         System.out.println("TestActivator starting bundle = " + bundleName);
 
         kb = new OSGIKillbillTracker(context);
+        logService = new OSGIKillbillLogService(context);
 
         registrar = new OSGIKillbillRegistrar();
 
@@ -87,7 +90,7 @@ public class TestActivator implements BundleActivator {
     @Subscribe
     public void handleKillbillEvent(final ExtBusEvent killbillEvent) {
 
-        kb.log(LogService.LOG_INFO, "Received external event " + killbillEvent.toString());
+        logService.log(LogService.LOG_INFO, "Received external event " + killbillEvent.toString());
 
         // Only looking at account creation
         if (killbillEvent.getEventType() != ExtBusEventType.ACCOUNT_CREATION) {
@@ -101,13 +104,12 @@ public class TestActivator implements BundleActivator {
             }
         };
 
-
         try {
             Account account = kb.getAccountUserApi().getAccountById(killbillEvent.getAccountId(), tenantContext);
             testDao.insertAccountExternalKey(account.getExternalKey());
 
         } catch (AccountApiException e) {
-            kb.log(LogService.LOG_ERROR, e.getMessage());
+            logService.log(LogService.LOG_ERROR, e.getMessage());
         }
     }