killbill-memoizeit

Details

payment/pom.xml 8(+8 -0)

diff --git a/payment/pom.xml b/payment/pom.xml
index fae6a01..b5743e2 100644
--- a/payment/pom.xml
+++ b/payment/pom.xml
@@ -46,6 +46,14 @@
             <groupId>joda-time</groupId>
             <artifactId>joda-time</artifactId>
         </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>org.testng</groupId>
diff --git a/payment/src/main/java/com/ning/billing/payment/InvoiceProcessor.java b/payment/src/main/java/com/ning/billing/payment/InvoiceProcessor.java
index a0c64af..946ac83 100644
--- a/payment/src/main/java/com/ning/billing/payment/InvoiceProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/InvoiceProcessor.java
@@ -20,22 +20,24 @@ import com.google.common.eventbus.Subscribe;
 import com.google.inject.Inject;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.invoice.model.Invoice;
-import com.ning.billing.payment.provider.PaymentProviderPlugin;
+import com.ning.billing.payment.provider.PaymentProviderPluginRegistry;
 import com.ning.billing.util.eventbus.IEventBus.EventBusException;
 
 public class InvoiceProcessor {
-    private final PaymentProviderPlugin provider;
+    private final PaymentProviderPluginRegistry pluginRegistry;
 
     @Inject
-    public InvoiceProcessor(PaymentProviderPlugin provider) {
-        this.provider = provider;
+    public InvoiceProcessor(PaymentProviderPluginRegistry pluginRegistry) {
+        this.pluginRegistry = pluginRegistry;
     }
 
     @Subscribe
     public void receiveInvoice(Invoice invoice) throws EventBusException {
         // TODO: retrieve account
         final Account account = null;
+        // TODO: get provider name from account
+        final String paymentProviderName = null;
 
-        provider.processInvoice(account, invoice);
+        pluginRegistry.getPlugin(paymentProviderName).processInvoice(account, invoice);
     }
 }
diff --git a/payment/src/main/java/com/ning/billing/payment/provider/PaymentProviderPluginRegistry.java b/payment/src/main/java/com/ning/billing/payment/provider/PaymentProviderPluginRegistry.java
new file mode 100644
index 0000000..cee31d3
--- /dev/null
+++ b/payment/src/main/java/com/ning/billing/payment/provider/PaymentProviderPluginRegistry.java
@@ -0,0 +1,27 @@
+package com.ning.billing.payment.provider;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.commons.lang.StringUtils;
+
+import com.google.inject.Inject;
+import com.ning.billing.payment.setup.PaymentConfig;
+
+public class PaymentProviderPluginRegistry {
+    private final String defaultPlugin;
+    private final Map<String, PaymentProviderPlugin> pluginsByName = new ConcurrentHashMap<String, PaymentProviderPlugin>();
+
+    @Inject
+    public PaymentProviderPluginRegistry(PaymentConfig config) {
+        this.defaultPlugin = config.getDefaultPaymentProviderPlugin();
+    }
+
+    public void register(PaymentProviderPlugin plugin, String name) {
+        pluginsByName.put(name.toLowerCase(), plugin);
+    }
+
+    public PaymentProviderPlugin getPlugin(String name) {
+        return pluginsByName.get(StringUtils.defaultIfEmpty(name, defaultPlugin).toLowerCase());
+    }
+}
diff --git a/payment/src/main/java/com/ning/billing/payment/setup/PaymentConfig.java b/payment/src/main/java/com/ning/billing/payment/setup/PaymentConfig.java
index 3fc3a13..b0e4b67 100644
--- a/payment/src/main/java/com/ning/billing/payment/setup/PaymentConfig.java
+++ b/payment/src/main/java/com/ning/billing/payment/setup/PaymentConfig.java
@@ -19,9 +19,8 @@ package com.ning.billing.payment.setup;
 import org.skife.config.Config;
 import org.skife.config.DefaultNull;
 
-public interface PaymentConfig
-{
-    @Config("killbill.payment.providerPluginClass")
+public interface PaymentConfig {
+    @Config("killbill.payment.provider.defaultPlugin")
     @DefaultNull
-    public String getProviderPluginClass();
+    public String getDefaultPaymentProviderPlugin();
 }
diff --git a/payment/src/main/java/com/ning/billing/payment/setup/PaymentModule.java b/payment/src/main/java/com/ning/billing/payment/setup/PaymentModule.java
index 77a3a9b..dc7f535 100644
--- a/payment/src/main/java/com/ning/billing/payment/setup/PaymentModule.java
+++ b/payment/src/main/java/com/ning/billing/payment/setup/PaymentModule.java
@@ -21,8 +21,7 @@ import java.util.Properties;
 import org.skife.config.ConfigurationObjectFactory;
 
 import com.google.inject.AbstractModule;
-import com.google.inject.Key;
-import com.ning.billing.payment.provider.PaymentProviderPlugin;
+import com.ning.billing.payment.provider.PaymentProviderPluginRegistry;
 
 public class PaymentModule extends AbstractModule {
     private final Properties props;
@@ -35,28 +34,15 @@ public class PaymentModule extends AbstractModule {
         this.props = props;
     }
 
-    @SuppressWarnings("unchecked")
-    protected void installPaymentProviderPlugin(PaymentConfig config) {
-        String pluginClassName = config.getProviderPluginClass();
-
-        if (pluginClassName == null) {
-            throw new IllegalArgumentException("No payment provider plugin class configured");
-        }
-        Class<? extends PaymentProviderPlugin> pluginClass = null;
-
-        try {
-            pluginClass = (Class<? extends PaymentProviderPlugin>)Class.forName(pluginClassName);
-        }
-        catch (Exception ex) {
-            throw new IllegalArgumentException("Illegal payment provider plugin class configured", ex);
-        }
-        bind(PaymentProviderPlugin.class).to(Key.get(pluginClass));
+    protected void installPaymentProviderPlugins(PaymentConfig config) {
     }
 
     @Override
     protected void configure() {
         final PaymentConfig config = new ConfigurationObjectFactory(props).build(PaymentConfig.class);
 
-        installPaymentProviderPlugin(config);
+        bind(PaymentConfig.class).toInstance(config);
+        bind(PaymentProviderPluginRegistry.class).asEagerSingleton();
+        installPaymentProviderPlugins(config);
     }
 }
diff --git a/payment/src/test/java/com/ning/billing/payment/provider/MockPaymentProviderPlugin.java b/payment/src/test/java/com/ning/billing/payment/provider/MockPaymentProviderPlugin.java
index a300fe2..d9b59d7 100644
--- a/payment/src/test/java/com/ning/billing/payment/provider/MockPaymentProviderPlugin.java
+++ b/payment/src/test/java/com/ning/billing/payment/provider/MockPaymentProviderPlugin.java
@@ -26,11 +26,14 @@ import com.ning.billing.util.eventbus.IEventBus;
 import com.ning.billing.util.eventbus.IEventBus.EventBusException;
 
 public class MockPaymentProviderPlugin implements PaymentProviderPlugin {
+    public static final String PLUGIN_NAME = "mock";
+
     private final IEventBus eventBus;
 
     @Inject
-    public MockPaymentProviderPlugin(IEventBus eventBus) {
+    public MockPaymentProviderPlugin(PaymentProviderPluginRegistry registry, IEventBus eventBus) {
         this.eventBus = eventBus;
+        registry.register(this, PLUGIN_NAME);
     }
 
     @Override
diff --git a/payment/src/test/java/com/ning/billing/payment/setup/PaymentTestModule.java b/payment/src/test/java/com/ning/billing/payment/setup/PaymentTestModule.java
index d9f7878..6c9317f 100644
--- a/payment/src/test/java/com/ning/billing/payment/setup/PaymentTestModule.java
+++ b/payment/src/test/java/com/ning/billing/payment/setup/PaymentTestModule.java
@@ -16,15 +16,20 @@
 
 package com.ning.billing.payment.setup;
 
+import org.apache.commons.collections.MapUtils;
+
+import com.google.common.collect.ImmutableMap;
 import com.ning.billing.payment.provider.MockPaymentProviderPlugin;
-import com.ning.billing.payment.provider.PaymentProviderPlugin;
 import com.ning.billing.util.eventbus.IEventBus;
 import com.ning.billing.util.eventbus.MemoryEventBus;
 
 public class PaymentTestModule extends PaymentModule {
+    public PaymentTestModule() {
+        super(MapUtils.toProperties(ImmutableMap.of("killbill.payment.provider.defaultPlugin", "mock")));
+    }
+
     @Override
-    protected void installPaymentProviderPlugin(PaymentConfig config) {
-        bind(PaymentProviderPlugin.class).to(MockPaymentProviderPlugin.class);
+    protected void installPaymentProviderPlugins(PaymentConfig config) {
         bind(MockPaymentProviderPlugin.class).asEagerSingleton();
     }
 

pom.xml 5(+5 -0)

diff --git a/pom.xml b/pom.xml
index 9a81de4..3e0c587 100644
--- a/pom.xml
+++ b/pom.xml
@@ -167,6 +167,11 @@
                 <version>2.5</version>
             </dependency>
             <dependency>
+                <groupId>commons-collections</groupId>
+                <artifactId>commons-collections</artifactId>
+                <version>3.2.1</version>
+            </dependency>
+            <dependency>
                 <groupId>joda-time</groupId>
                 <artifactId>joda-time</artifactId>
                 <version>2.0</version>