killbill-memoizeit

Tweak into JRubyPaymentPlugin

3/14/2013 4:14:36 PM

Details

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 6e88dcb..007847b 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
@@ -25,6 +25,7 @@ import java.util.UUID;
 import org.jruby.Ruby;
 import org.jruby.embed.ScriptingContainer;
 import org.jruby.javasupport.JavaEmbedUtils;
+import org.jruby.runtime.builtin.IRubyObject;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.log.LogService;
@@ -69,103 +70,159 @@ public class JRubyPaymentPlugin extends JRubyPlugin implements PaymentPluginApi 
         return pluginMainClass;
     }
 
+
     @Override
     public PaymentInfoPlugin processPayment(final UUID kbPaymentId, final UUID kbPaymentMethodId, final BigDecimal amount, final CallContext context) throws PaymentPluginApiException {
-        checkValidPaymentPlugin();
-        checkPluginIsRunning();
-
-        final Ruby runtime = getRuntime();
-        pluginInstance.callMethod("charge",
-                                  JavaEmbedUtils.javaToRuby(runtime, kbPaymentId.toString()),
-                                  JavaEmbedUtils.javaToRuby(runtime, kbPaymentMethodId.toString()),
-                                  JavaEmbedUtils.javaToRuby(runtime, amount.longValue() * 100));
 
-        // TODO
-        return null;
+        return callWithRuntimeAndChecking(new PluginCallback() {
+            @Override
+            public PaymentInfoPlugin doCall(final Ruby runtime) {
+                final IRubyObject res = pluginInstance.callMethod("charge",
+                                                                  JavaEmbedUtils.javaToRuby(runtime, kbPaymentId.toString()),
+                                                                  JavaEmbedUtils.javaToRuby(runtime, kbPaymentMethodId.toString()),
+                                                                  JavaEmbedUtils.javaToRuby(runtime, amount.longValue() * 100));
+                return null;
+            }
+        });
     }
 
     @Override
     public PaymentInfoPlugin getPaymentInfo(final UUID kbPaymentId, final TenantContext context) throws PaymentPluginApiException {
-        checkValidPaymentPlugin();
-        checkPluginIsRunning();
-
-        pluginInstance.callMethod("get_payment_info", JavaEmbedUtils.javaToRuby(getRuntime(), kbPaymentId.toString()));
 
-        // TODO
-        return null;
+        return callWithRuntimeAndChecking(new PluginCallback() {
+            @Override
+            public PaymentInfoPlugin doCall(final Ruby runtime) {
+                final IRubyObject res = pluginInstance.callMethod("get_payment_info", JavaEmbedUtils.javaToRuby(getRuntime(), kbPaymentId.toString()));
+                return null;
+            }
+        });
     }
 
     @Override
     public RefundInfoPlugin processRefund(final UUID kbPaymentId, final BigDecimal refundAmount, final CallContext context) throws PaymentPluginApiException {
-        checkValidPaymentPlugin();
-        checkPluginIsRunning();
 
-        final Ruby runtime = getRuntime();
-        pluginInstance.callMethod("refund",
-                                  JavaEmbedUtils.javaToRuby(runtime, kbPaymentId.toString()),
-                                  JavaEmbedUtils.javaToRuby(runtime, refundAmount.longValue() * 100));
+        return callWithRuntimeAndChecking(new PluginCallback() {
+            @Override
+            public RefundInfoPlugin doCall(final Ruby runtime) {
+                final IRubyObject res = pluginInstance.callMethod("refund",
+                                                                  JavaEmbedUtils.javaToRuby(runtime, kbPaymentId.toString()),
+                                                                  JavaEmbedUtils.javaToRuby(runtime, refundAmount.longValue() * 100));
+
+                return null;
+            }
+        });
 
-        // TODO
-        return null;
     }
 
     @Override
     public void addPaymentMethod(final UUID kbAccountId, final UUID kbPaymentMethodId, final PaymentMethodPlugin paymentMethodProps, final boolean setDefault, final CallContext context) throws PaymentPluginApiException {
-        checkValidPaymentPlugin();
-        checkPluginIsRunning();
-
-        final Ruby runtime = getRuntime();
-        pluginInstance.callMethod("add_payment_method",
-                                  JavaEmbedUtils.javaToRuby(runtime, kbPaymentMethodId.toString()),
-                                  JavaEmbedUtils.javaToRuby(runtime, paymentMethodProps));
-        if (setDefault) {
-            setDefaultPaymentMethod(kbPaymentMethodId, context);
-        }
+
+        callWithRuntimeAndChecking(new PluginCallback() {
+            @Override
+            public Void doCall(final Ruby runtime) {
+                final IRubyObject res = pluginInstance.callMethod("add_payment_method",
+                                                                  JavaEmbedUtils.javaToRuby(runtime, kbAccountId.toString()),
+                                                                  JavaEmbedUtils.javaToRuby(runtime, kbPaymentMethodId.toString()),
+                                                                  JavaEmbedUtils.javaToRuby(runtime, paymentMethodProps));
+
+                return null;
+            }
+        });
     }
 
     @Override
     public void deletePaymentMethod(final UUID kbPaymentMethodId, final CallContext context) throws PaymentPluginApiException {
-        checkValidPaymentPlugin();
-        checkPluginIsRunning();
 
-        final Ruby runtime = getRuntime();
-        pluginInstance.callMethod("delete_payment_method",
-                                  JavaEmbedUtils.javaToRuby(runtime, kbPaymentMethodId.toString()));
+        callWithRuntimeAndChecking(new PluginCallback() {
+            @Override
+            public Void doCall(final Ruby runtime) {
+                final IRubyObject res = pluginInstance.callMethod("delete_payment_method",
+                                                                  JavaEmbedUtils.javaToRuby(runtime, kbPaymentMethodId.toString()));
+
+                return null;
+            }
+        });
     }
 
     @Override
     public PaymentMethodPlugin getPaymentMethodDetail(final UUID kbAccountId, final UUID kbPaymentMethodId, final TenantContext context) throws PaymentPluginApiException {
-        // TODO
-        return null;
+
+        return callWithRuntimeAndChecking(new PluginCallback() {
+            @Override
+            public PaymentMethodPlugin doCall(final Ruby runtime) {
+                final IRubyObject res =  pluginInstance.callMethod("get_payment_method_detail",
+                                                                   JavaEmbedUtils.javaToRuby(runtime, kbAccountId.toString()),
+                                                                   JavaEmbedUtils.javaToRuby(runtime, kbPaymentMethodId.toString()));
+
+                return null;
+            }
+        });
     }
 
     @Override
     public void setDefaultPaymentMethod(final UUID kbPaymentMethodId, final CallContext context) throws PaymentPluginApiException {
-        checkValidPaymentPlugin();
-        checkPluginIsRunning();
 
-        final Ruby runtime = getRuntime();
-        pluginInstance.callMethod("set_default_payment_method",
-                                  JavaEmbedUtils.javaToRuby(runtime, kbPaymentMethodId.toString()));
+        callWithRuntimeAndChecking(new PluginCallback() {
+            @Override
+            public Void doCall(final Ruby runtime) {
+                final IRubyObject res = pluginInstance.callMethod("set_default_payment_method",
+                                                                  JavaEmbedUtils.javaToRuby(runtime, kbPaymentMethodId.toString()));
+
+                return null;
+            }
+        });
     }
 
     @Override
     public List<PaymentMethodInfoPlugin> getPaymentMethods(final UUID kbAccountId, final boolean refreshFromGateway, final CallContext context) throws PaymentPluginApiException {
-        checkPluginIsRunning();
 
-        final Ruby runtime = getRuntime();
-        pluginInstance.callMethod("get_payment_methods",
-                                  JavaEmbedUtils.javaToRuby(runtime, kbAccountId.toString()));
-        // TODO
-        return null;
+        return callWithRuntimeAndChecking(new PluginCallback() {
+            @Override
+            public List<PaymentMethodInfoPlugin> doCall(final Ruby runtime) {
+                final IRubyObject res = pluginInstance.callMethod("get_payment_methods",
+                                                                  JavaEmbedUtils.javaToRuby(runtime, kbAccountId.toString()));
+
+                return null;
+            }
+        });
     }
 
     @Override
     public void resetPaymentMethods(final List<PaymentMethodInfoPlugin> paymentMethods) throws PaymentPluginApiException {
-        checkPluginIsRunning();
 
-        final Ruby runtime = getRuntime();
-        pluginInstance.callMethod("reset_payment_methods",
-                                  JavaEmbedUtils.javaToRuby(runtime, paymentMethods));
+        callWithRuntimeAndChecking(new PluginCallback() {
+            @Override
+            public Void doCall(final Ruby runtime) {
+                final IRubyObject res = pluginInstance.callMethod("reset_payment_methods",
+                                                                  JavaEmbedUtils.javaToRuby(runtime, paymentMethods));
+                return null;
+            }
+        });
+    }
+
+    private abstract class PluginCallback {
+
+        public abstract <T> T doCall(final Ruby runtime);
+
+        public boolean checkValidPaymentPlugin() {
+            return true;
+        }
+    }
+
+    private <T> T callWithRuntimeAndChecking(PluginCallback cb) {
+        try {
+            checkPluginIsRunning();
+
+            if (cb.checkValidPaymentPlugin()) {
+                checkValidPaymentPlugin();
+            }
+
+            final Ruby runtime = getRuntime();
+            return cb.doCall(runtime);
+
+        } catch (RuntimeException e) {
+            // TODO STEPH not sure what ruby can throw
+            throw e;
+        }
     }
 }